2010-04-03 10 views
4

Actuellement, j'utilise le framework TestNG pour tester la logique applicative de l'application, j'ai récemment ajouté quelques classes Servlet.Test de l'unité de servlet

Comment est-ce que j'effectue des tests unitaires de ces classes de Servlet dans la structure TestNg?

+0

double possible de [servlets-tests unitaires] (http://stackoverflow.com/questions/53532/unit-testing-servlets – Raedwald

Répondre

6

Suivez les conseils de skaffman si possible. Dans le cas contraire, ou si vous voulez tester le comportement des servlets en tant que contrôleurs frontaux, plutôt que la logique métier en eux, vous pouvez utiliser:

+0

Merci Bozho, est-ce que Selenium supporte TestNG? – Tony

+0

http://www.ibm.com/developerworks/java/library/j-cq04037/#N100F7 – Bozho

+0

Oui, Selenium prend en charge TestNG. Je ne l'utiliserais que si vous avez besoin de tests pour fonctionner en parallèle. Si non, restez avec JUnit. – djangofan

8

Je suggère que vous déplaciez toute la logique métier sur des classes de servlet, dans vos propres classes que vous pouvez tester. Cela laisse les servlets juste comme colle entre votre logique métier et le conteneur, sans rien qui vaille la peine d'être testé. Les classes API telles que HttpServletRequest, ServletConfig, etc., sont des cibles de choix pour l'utilisation d'un cadre de simulation de votre choix (JMock, Mockito, etc.), car ce sont toutes des interfaces.

+0

Merci Skaffman, mes servlets gèrent la session et les opérations liées aux cookies. Donc, déplacer ces logiques vers une autre classe n'est pas possible. Je suis à la recherche d'une API qui me permet de tester une unité de servlet au sein de testNG. – Tony

+2

@Thomman: C'est toujours possible - déléguez simplement le servlet à la classe de logique métier. Il n'y a rien à * faire * dans le servlet. – skaffman

+0

Il peut toujours être nécessaire de tester au niveau de la servlet, bien qu'il s'agisse de tests d'intégration plutôt que de tests unitaires. – Raedwald

18

L'une des façons les plus simples est ServletTester de Jetty. Tout est fait dans la Jetée intégrée automatiquement, donc il n'y a pas de port ouvert pendant le test! Si vous utilisez Maven que l'artefact suivant est nécessaire pour activer cette méthode:

<dependency> 
    <groupId>org.mortbay.jetty</groupId> 
    <artifactId>jetty-servlet-tester</artifactId> 
    <version>6.1.16</version> 
    <scope>test</scope> 
</dependency> 

Exemple:

Préparez ServletTester

ServletTester tester=new ServletTester(); 
tester.addServlet(HelloServlet.class, "/hello"); 
tester.start(); 

Créer requête HTTP

HttpTester request = new HttpTester(); 
request.setMethod("GET"); 
request.setHeader("Host","tester"); 
request.setURI("/hello"); 
request.setVersion("HTTP/1.0"); 

servlet d'appel et récupérer la réponse:

HttpTester response = new HttpTester(); 
response.parse(tester.getResponses(request.generate())); 

Affirmer ce que vous voulez vérifier la réponse et il est contenu:

assertEquals(200,response.getStatus()); 
assertEquals("Hello Servlet",response.getContent()); 
+0

@koppernickus: Puis-je intégrer cette classe de test avec TestNG? – Tony

+0

@Thomman: Oui. Cette classe est indépendante de tout cadre de test. – kopper

+0

Intéressant. D'autres testeurs de servlet nécessitent un port, etc. – Raedwald