2013-02-08 4 views
5

J'ai un Grizzly HttpServer que je souhaite exécuter pendant toute la durée d'exécution d'un groupe de tests. En outre, je souhaite interagir avec l'instance HttpServer globale à partir d'un @Rule dans les tests eux-mêmes. Comme j'utilise Maven Surefire plutôt que d'utiliser des suites de tests JUnit, je ne peux pas utiliser @BeforeClass/@AfterClass sur la suite de tests elle-même.Exécution du code avant et après tous les tests dans une exécution infaillible

À l'heure actuelle, tout ce que je peux penser est paresseusement l'initialisation d'un champ statique et l'arrêt du serveur d'un Runtime.addShutdownHook() - pas gentil!

+0

lequel utilisez-vous sinon JUnit? – TheWhiteRabbit

+0

Si vous utilisez des tests POJO ou TestNG, vous pouvez utiliser @BeforeClass – TheWhiteRabbit

+0

@TechExchange Mise à jour de la question pour clarifier que j'utilise maven surefire – hertzsprung

Répondre

7

Il existe deux options, une solution Maven et une solution infaillible. La solution la moins couplée consiste à exécuter un plug-in dans la phase pre-integration-test et post-integration-test. Voir Introduction to the Build Lifecycle - Lifecycle Reference. Je ne suis pas au courant de grizzly, mais voici un exemple en utilisant la jetée:

<build> 
    <plugins> 
    <plugin> 
    <groupId>org.mortbay.jetty</groupId> 
    <artifactId>maven-jetty-plugin</artifactId> 
    <configuration> 
    <contextPath>/xxx</contextPath> 
    </configuration> 
    <executions> 
    <execution> 
     <id>start-jetty</id> 
     <phase>pre-integration-test</phase> 
     <goals> 
     <goal>run</goal> 
     </goals> 
     <configuration> 
     </configuration> 
    </execution> 
    <execution> 
     <id>stop-jetty</id> 
     <phase>post-integration-test</phase> 
     <goals> 
     <goal>stop</goal> 
     </goals> 
    </execution> 
    </executions> 
    </plugin> 

Notez que la phase de start est pre-integration-test et stop est post-integration-test. Je ne suis pas sûr s'il existe un plugin Grizzly Maven, mais vous pouvez utiliser le maven-antrun-plugin à la place.

La deuxième option consiste à utiliser un JUnit RunListener. RunListener écoute pour tester les événements, tels que le test début, la fin de test, échec du test, le succès de test, etc.

public class RunListener { 
    public void testRunStarted(Description description) throws Exception {} 
    public void testRunFinished(Result result) throws Exception {} 
    public void testStarted(Description description) throws Exception {} 
    public void testFinished(Description description) throws Exception {} 
    public void testFailure(Failure failure) throws Exception {} 
    public void testAssumptionFailure(Failure failure) {} 
    public void testIgnored(Description description) throws Exception {} 
} 

Vous pouvez écouter RunStarted et RunFinished. Ceux-ci démarrer/arrêter les services que vous voulez. Puis, dans Surefire, vous pouvez spécifier un écouteur personnalisé, en utilisant:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.10</version> 
    <configuration> 
    <properties> 
     <property> 
     <name>listener</name> 
     <value>com.mycompany.MyResultListener,com.mycompany.MyResultListener2</value> 
     </property> 
    </properties> 
    </configuration> 
</plugin> 

Ceci est de Maven Surefire Plugin, Using JUnit, Using custom listeners and reporters

+0

Je ne pense pas que la première option fonctionnerait car j'ai besoin d'accéder à l'instance 'HttpServer' à partir du 'TestRule', mais le' RunListener' semble prometteur, merci! – hertzsprung

+0

pour moi, dans le cadre de la phase de pré-intégration, le serveur de jetée commence. La dernière ligne de journal est: [INFO] a démarré le serveur Jetty. Après cela, rien ne se passe. Ça reste coincé. maven surefire failsafe plugin n'exécute pas les tests ni les arrêts du serveur jetty. Une idée de ce qui ne va pas? J'utilise la même configuration que celle que vous avez spécifiée. –

Questions connexes