Funktionale Oberflächentests mit Selenium stellen eine effektive Methode zur Erhöhung der Qualität einer Webanwendung dar. Seit Selenium 2.0 können die Tests dabei durch die Unterstützung von HtmlUnit auch ohne Browser (headless) und damit vor allem auch wesentlich schneller ausgeführt werden. Weitere Unterschiede zu Version 1 können im Blogeintrag “Selenium 2 – Differences to Version 1″ nachgelesen werden.
Zur Ausführung des Tests ist allerdings auch bei Verwendung von HtmlUnit weiterhin ein laufender Server mit der zu testenden Anwendung notwendig. Um die Tests automatisch während des Build-Vorgangs auszuführen, muss also auch automatisch ein Server gestartet und gestoppt werden. Dies kann mit dem “Maven Jetty Plugin” erreicht werden. Die Konfiguration in der “pom.xml” sieht dann wie folgt aus:
<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.10</version> <configuration> <scanIntervalSeconds>10</scanIntervalSeconds> <stopKey>foo</stopKey> <stopPort>9999</stopPort> </configuration> <executions> <execution> <id>start-jetty</id> <phase>pre-integration-test</phase> <goals> <goal>run</goal> </goals> <configuration> <scanIntervalSeconds>0</scanIntervalSeconds> <daemon>true</daemon> </configuration> </execution> <execution> <id>stop-jetty</id> <phase>post-integration-test</phase> <goals> <goal>stop</goal> </goals> </execution> </executions> </plugin>
Das Plugin startet den Jetty in der Lifecyle-Phase “pre-integration-test” und deployed automatisch die zuvor erstellte Webanwendung in diesen Server. Nach der Ausführung der Integrationstests in der Phase “integration-test” wird der Jetty in der Phase “post-integration-test” wieder automatisch gestoppt. Die genaue Abfolge der einzelnen Phasen des Maven-Builds ist der Maven Lifecyle Reference zu entnehmen.
Nun besteht allerdings noch ein weiteres Problem, da Selenium-Tests als Unit-Tests implementiert werden und diese normalerweise bereits in der Phase “test” und nicht in der Phase ”integration-test” des Maven Lifecycles ausgeführt werden. Durch die folgende Konfiguration in der “pom.xml” kann die Ausführung der Unit-Tests in die Phase “integration-test” verschoben werden, so dass die Tests in der Zeit ausgeführt werden, in welcher der Jetty läuft (zwischen den Phasen “pre-integration-test” und “post-integration-test”).
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.8.1</version> <configuration> <excludes> <exclude>**/*Test.java</exclude> </excludes> </configuration> <executions> <execution> <id>integration-tests</id> <phase>integration-test</phase> <goals> <goal>test</goal> </goals> <configuration> <skip>false</skip> <excludes> <exclude>none</exclude> </excludes> <includes> <include>**/*Test.java</include> </includes> </configuration> </execution> </executions> </plugin>
Einsortiert unter:Build, config and deploy, Java and Quality Tagged: HtmlUnit, jetty, lifecycle, maven, Plugin, selenium, test
