Integrationstest mit dem Maven Cargo Plugin

Integrationstest mit dem Maven Cargo Plugin

Eine sehr häufige Anforderung im Lebenszyklus eines Projekts ist das Einrichten von Integrationstests. Glücklicherweise hat Maven eine integrierte Unterstützung für genau dieses Szenario mit den folgenden Phasen des Standard-Build-Lebenszyklus (ab Mavendocumentation): [more-134] #

  • pre-integration-test:Perform actions required before integration tests are executed. This may involve things such as setting up the required environment.

  • integration-test:Process and deploy the package if necessary into an environment where integration tests can be run.

  • post-integration-test:Perform actions required after integration tests have been executed. This may including cleaning up the environment.

Zunächst wirdmaven-surefire-plugin so konfiguriert, dassintegration tests are excluded aus dem Standard-Build-Lebenszyklus stammt:


   org.apache.maven.plugins
   maven-surefire-plugin
   2.17
   
      
         **/*IntegrationTest.java
      
   

Exclusions werden über Pfadausdrücke im Ant-Stil ausgeführt, daher müssen alle Integrationstests diesem Muster folgen und mit“IntegrationTest.java enden “.

Als nächstes wirdcargo-maven2-plugin verwendet, daCargo eine erstklassige Unterstützung für eingebettete Webserver bietet. Wenn die Serverumgebung eine bestimmte Konfiguration erfordert, weiß cargo natürlich auch, wie der Server aus einem archivierten Paket aufgebaut und auf einem externen Server bereitgestellt wird.


   org.codehaus.cargo
   cargo-maven2-plugin
   1.4.8
   
      
         jetty8x
         embedded
      
      
         
            8080
         
      
   

Es ist ein eingebetteter Jetty 8-Webserver definiert, der Port 8080 überwacht.

In einer neueren Version der Ladung (ab 1.1.0) wurde der Standardwert vonthe wait flag fürcargo:start infalse, geändert. Dieses Ziel sollte nur zum Ausführen von Integrationstests verwendet werden und ist an den Maven-Lebenszyklus gebunden. Für die Entwicklung sollte stattdessen das Ziel voncargo:runausgeführt werden - daswait=true hat.

Damit diepackage-Maven-Phase einedeployable war-Datei generiert, muss das Paket wie folgt verpackt sein:<packaging>war</packaging>.

Als Nächstes wird ein neuesintegrationMaven profile erstellt, damit die Integrationstestsonly ausgeführt werden können, wenn dieses Profil aktiv ist, und nicht als Teil des Standard-Build-Lebenszyklus.


   
      integration
      

         
            ...
         

      
   

Es ist dieses Profil, das die gesamte verbleibende Konfiguration enthält.

Jetzt ist der Jetty-Server aufstart in der Phasepre-integration-test undstop in der Phasepost-integration-test konfiguriert.


   org.codehaus.cargo
   cargo-maven2-plugin
   
      false
   
   
      
         start-server
         pre-integration-test
         
            start
         
      
      
         stop-server
         post-integration-test
         
            stop
         
      
   

Dies stellt sicher, dass das Ziel voncargo:startund die Ziele voncargo:stopvor und nach der Phase vonintegration-testausgeführt werden. Da es zwei einzelneexecution-Definitionen gibt, muss dasid-Element in beiden vorhanden (und unterschiedlich) sein, damit Maven die Konfiguration akzeptieren kann.

Als nächstes muss die Konfiguration vonmaven-surefire-pluginim Profil vonintegrationüberschrieben werden, damit die Integrationstests, die im Standardlebenszyklus ausgeschlossen wurden, jetztincluded sind und ausgeführt werden:


   
      org.apache.maven.plugins
      maven-surefire-plugin
      
         
            integration-test
            
               test
            
            
               
                  none
               
               
                  **/*IntegrationTest.java
               
            
         
      
   

Es gibt einige bemerkenswerte Dinge:

1. Dastest-Ziel vonmaven-surefire-plugin wird inintegration-test-Phase ausgeführt; Zu diesem Zeitpunkt ist Jetty bereits mit dem bereitgestellten Projekt gestartet, sodass die Integrationstests ohne Probleme ausgeführt werden sollten.

2. Die Integrationstests sind jetztincluded in der Ausführung. Um dies zu erreichen, werden die Ausschlüsse ebenfalls überschrieben. Dies liegt daran, wie Maven überschreibende Plugin-Konfigurationen in Profilen handhabt. Die Basiskonfiguration wird nicht vollständig überschrieben, sondern durch neue Konfigurationselemente im Profil ergänzt. Aus diesem Grund ist die ursprüngliche<excludes>-Konfiguration, die die Integrationstests an erster Stelle ausgeschlossen hat, immer noch im Profil vorhanden und muss überschrieben werden, da dies zu Konflikten mit der<includes>-Konfiguration und der Tests würden immer noch nicht ausgeführt.

3. Beachten Sie, dass, da nur ein einziges<execution>-Element vorhanden ist,no need for an id definiert werden müssen.

Jetzt kann der gesamte Prozess ausgeführt werden:

mvn clean install -Pintegration

Fazit

Die schrittweise Konfiguration von Maven deckt den gesamten Prozess des Einrichtens des Integrationsprozesses im Rahmen des Projektlebenszyklus ab.

Normalerweise ist dies so eingerichtet, dass es in einer Continuous Integration-Umgebung ausgeführt wird, vorzugsweise nach jedem Commit. Wenn auf dem CI-Server bereits ein Server ausgeführt wird und Ports verbraucht, muss sich die Frachtkonfiguration mit diesem Szenario befassen, auf das ich in einem zukünftigen Beitrag eingehen werde.

Überprüfen Sie für eine vollständig laufende Konfiguration dieses Mechanismus dieREST GitHub project.

Außerdemcheck out this article für Best Practices zur Strukturierung eines Projekts und zur Organisation der Unit- und Integrationstests.