J'ai créé un système Web en utilisant des servlets Java et je souhaite maintenant faire des tests JUnit. My dataManager
est juste un morceau de code de base qui le soumet à la base de données. Comment testeriez-vous un servlet avec JUnit?
Mon exemple de code qui permet à un utilisateur de s'inscrire / s'inscrire, qui est soumis depuis ma page principale via AJAX:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
// Get parameters
String userName = request.getParameter("username");
String password = request.getParameter("password");
String name = request.getParameter("name");
try {
// Load the database driver
Class.forName("com.mysql.jdbc.Driver");
//pass reg details to datamanager
dataManager = new DataManager();
//store result as string
String result = dataManager.register(userName, password, name);
//set response to html + no cache
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");
//send response with register result
response.getWriter().write(result);
} catch(Exception e){
System.out.println("Exception is :" + e);
}
}
unit-testing
testing
servlets
junit
Lunaire
la source
la source
Tout d'abord, dans une application réelle, vous n'obtiendrez jamais d'informations de connexion à la base de données dans un servlet; vous le configureriez dans votre serveur d'application.
Il existe cependant des moyens de tester des servlets sans qu'un conteneur ne soit en cours d'exécution. La première consiste à utiliser des objets simulés. Spring fournit un ensemble de simulations très utiles pour des choses comme HttpServletRequest, HttpServletResponse, HttpServletSession, etc.:
http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/mock/web/package-summary.html
En utilisant ces simulations, vous pouvez tester des choses comme
Que se passe-t-il si le nom d'utilisateur ne figure pas dans la demande?
Que se passe-t-il si le nom d'utilisateur figure dans la demande?
etc
Vous pouvez alors faire des choses comme:
la source
Je trouve les tests Selenium plus utiles avec l'intégration ou les tests fonctionnels (de bout en bout). Je travaille avec essayer d'utiliser org.springframework.mock.web , mais je ne suis pas très loin. Je joins un exemple de contrôleur à une suite de tests jMock .
Tout d'abord, le contrôleur:
Ensuite, le test:
J'espère que cela pourrait aider.
la source
Mise à jour en février 2018: OpenBrace Limited a fermé ses portes et son produit ObMimic n'est plus pris en charge.
Voici une autre alternative, en utilisant la bibliothèque ObMimic d' OpenBrace de test-doubles de l'API Servlet (divulgation: je suis son développeur).
Remarques:
Chaque "mimic" a un objet "mimicState" pour son état logique. Cela permet une distinction claire entre les méthodes de l'API Servlet et la configuration et l'inspection de l'état interne du synoptique.
Vous pourriez être surpris que la vérification de Content-Type inclut "charset = ISO-8859-1". Cependant, pour le code "doPost" donné, c'est selon le Javadoc de l'API Servlet, et la propre méthode getContentType de HttpServletResponse, et l'en-tête Content-Type réel produit par exemple sur Glassfish 3. Vous pourriez ne pas vous en rendre compte si vous utilisez des objets fictifs normaux et votre propres attentes du comportement de l'API. Dans ce cas, cela n'a probablement pas d'importance, mais dans les cas plus complexes, c'est le genre de comportement d'API imprévu qui peut faire un peu une moquerie!
J'ai utilisé
response.getMimicState().getContentType()
comme moyen le plus simple de vérifier Content-Type et d'illustrer le point ci-dessus, mais vous pouvez en effet vérifier "text / html" seul si vous le souhaitez (en utilisantresponse.getMimicState().getContentTypeMimeType()
). La vérification de l'en-tête Content-Type de la même manière que pour l'en-tête Cache-Control fonctionne également.Pour cet exemple, le contenu de la réponse est vérifié en tant que données de caractère (avec cela en utilisant le codage de Writer). Nous pourrions également vérifier que le Writer de la réponse a été utilisé plutôt que son OutputStream (en utilisant
response.getMimicState().isWritingCharacterContent()
), mais j'ai supposé que nous ne sommes préoccupés que par la sortie résultante, et ne nous soucions pas des appels d'API qui l'ont produit (bien que cela puisse être vérifié aussi ...). Il est également possible de récupérer le contenu du corps de la réponse sous forme d'octets, d'examiner l'état détaillé du Writer / OutputStream, etc.Vous trouverez tous les détails d'ObMimic et un téléchargement gratuit sur le site Web d' OpenBrace . Ou vous pouvez me contacter si vous avez des questions (les coordonnées sont sur le site).
la source
EDIT : Cactus est maintenant un projet mort: http://attic.apache.org/projects/jakarta-cactus.html
Vous voudrez peut-être regarder les cactus.
http://jakarta.apache.org/cactus/
la source
Une autre approche consisterait à créer un serveur intégré pour "héberger" votre servlet, vous permettant d'écrire des appels contre lui avec des bibliothèques destinées à faire des appels à des serveurs réels (l'utilité de cette approche dépend quelque peu de la facilité avec laquelle vous pouvez créer des programmes "légitimes". appels au serveur - je testais un point d'accès JMS (Java Messaging Service), pour lequel les clients abondent).
Il y a deux itinéraires différents que vous pouvez emprunter - les deux habituels sont Tomcat et Jetty.
Attention: la version de servlet-api que vous utilisez (la bibliothèque qui fournit des classes comme HttpServletRequest) doit être prise en compte lors du choix du serveur à intégrer. Si vous utilisez 2.5, j'ai trouvé que Jetty 6.x fonctionnait bien (qui est l'exemple que je donnerai ci-dessous). Si vous utilisez servlet-api 3.0, le truc intégré tomcat-7 semble être une bonne option, mais j'ai dû abandonner ma tentative de l'utiliser, car l'application que je testais utilisait servlet-api 2.5. Essayer de mélanger les deux entraînera NoSuchMethod et d'autres exceptions similaires lors de la tentative de configuration ou de démarrage du serveur.
Vous pouvez configurer un tel serveur comme celui-ci (Jetty 6.1.26, servlet-api 2.5):
la source
Utilisez Selenium pour les tests unitaires sur le Web. Il existe un plugin Firefox appelé Selenium IDE qui peut enregistrer des actions sur la page Web et les exporter vers des cas de test JUnit qui utilise Selenium RC pour exécuter le serveur de test.
la source
la source
D'abord, vous devriez probablement refactoriser cela un peu pour que le DataManager ne soit pas créé dans le code doPost .. vous devriez essayer Dependency Injection pour obtenir une instance. (Voir la vidéo Guice pour une belle introduction à DI.). Si on vous dit de commencer à tout tester unitaire, alors DI est un incontournable.
Une fois vos dépendances injectées, vous pouvez tester votre classe de manière isolée.
Pour tester réellement le servlet, il y a d'autres threads plus anciens qui en ont discuté .. essayez ici et ici .
la source