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:

    org.mortbay.jetty
    maven-jetty-plugin
    6.1.10
    
        10
        foo
        9999
    
    
        
            start-jetty
            pre-integration-test
            
                run
            
            
                0
                true
            
        
        
            stop-jetty
            post-integration-test
            
                stop
            
        
    

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“).

    org.apache.maven.plugins
    maven-surefire-plugin
    2.8.1
    
        
            **/*Test.java
        
    
    
        
            integration-tests
            integration-test
            
                test
            
            
                false
                
                    none
                
                
                    **/*Test.java