2013-02-08 11 views
5

Ich habe einen Grizzly HttpServer, den ich für die gesamte Dauer einer Testgruppenausführung ausführen möchte. Außerdem möchte ich mit der globalen HttpServer-Instanz von einem @Rule innerhalb der Tests selbst interagieren.Laufender Code vor und nach allen Tests in einer todsicheren Ausführung

Da ich Maven Surefire anstatt JUnit Testsuiten verwende, kann ich @BeforeClass/@AfterClass nicht auf der Testsuite selbst verwenden.

Im Moment kann ich nur ein statisches Feld initialisieren und den Server stoppen von Runtime.addShutdownHook() - nicht nett!

+0

, die man verwenden Sie, wenn nicht JUnit? – TheWhiteRabbit

+0

Wenn Sie POJO oder TestNG Tests verwenden können Sie @BeforeClass verwenden – TheWhiteRabbit

+0

@TechExchange Aktualisierte Frage, um zu klären, dass ich Maven todsichere – hertzsprung

Antwort

7

Es gibt zwei Optionen, eine Maven-Lösung und eine todsichere Lösung. Die am wenigsten gekoppelte Lösung besteht darin, ein Plugin in der pre-integration-test und post-integration-test Phase auszuführen. Siehe Introduction to the Build Lifecycle - Lifecycle Reference. Ich bin nicht vertraut mit Grizzly, aber hier ist ein Beispiel unter Verwendung von Anlegesteg:

<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> 

Beachten Sie, dass die Phase für start ist pre-integration-test und stoppost-integration-test ist. Ich bin mir nicht sicher, ob es ein Grizzly Maven Plugin gibt, aber Sie könnten stattdessen die maven-antrun-plugin verwenden.

Die zweite Option ist die Verwendung einer JUnit RunListener. RunListener hört Ereignisse, wie Testbeginn, Testende, Testfehler, Test Erfolg usw.

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 {} 
} 

testen So könnte man für runStarted und RunFinished hören. Diese würden die gewünschten Dienste starten/stoppen. Dann in todsicheren, können Sie einen benutzerdefinierten Hörer angeben, mit:

<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> 

Dies ist von Maven Surefire Plugin, Using JUnit, Using custom listeners and reporters

+0

verwende Ich glaube nicht, die erste Option würde funktionieren, weil ich Zugriff auf die 'HttpServer'-Instanz benötigen von der 'TestRule', aber der' RunListener' klingt vielversprechend, danke! – hertzsprung

+0

für mich, als Teil der Pre-Integrationsphase, startet Jetty Server. Die letzte Protokollzeile lautet: [INFO] Gestartet Jetty Server. Danach passiert nichts. Es bleibt stecken. maven todsichere Failsafe-Plugin führt keine Tests noch Anlegesteg Server stoppt. Irgendeine Idee, was ist los? Ich verwende die gleiche Konfiguration wie von Ihnen angegeben. –