Integrationstests mit dem Maven Cargo Plugin

Ein sehr häufiger Bedarf 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 (aus der Maven-Dokumentation):

  • Pre-Integration-Test : Führen Sie die erforderlichen Aktionen aus, bevor Integrationstests ausgeführt werden. Dies kann Dinge wie das Einrichten der erforderlichen Umgebung beinhalten.
  • Integrationstest : Verarbeiten und implementieren Sie das Paket bei Bedarf in einer Umgebung, in der Integrationstests ausgeführt werden können.
  • Post-Integration-Test : Führen Sie die erforderlichen Aktionen aus, nachdem die Integrationstests ausgeführt wurden. Dies kann das Aufräumen der Umwelt einschließen.

Zunächst wird das Maven-Surefire-Plugin so konfiguriert, dass Integrationstests vom Standard-Build-Lebenszyklus ausgeschlossen werden:

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

Ausschlüsse werden über Pfadausdrücke im Ant-Stil vorgenommen, daher müssen alle Integrationstests diesem Muster folgen und mit „IntegrationTest.java “ enden .

Als nächstes wird das Cargo-Maven2-Plugin verwendet, da Cargo erstklassige Unterstützung für eingebettete Webserver bietet. Wenn für die Serverumgebung eine bestimmte Konfiguration erforderlich ist, kann Cargo den Server natürlich auch aus einem archivierten Paket erstellen und auf einem externen Server bereitstellen.

 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 neuerer Version der Ladung (1.1.0 nach oben), der Standardwert des Wartezeit- Flag wurde geändert falsch, für Fracht: starten . 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 Cargo: Run- Ziel ausgeführt werden - das wait = true hat .

Damit das Paket Phase Maven zum Erzeugen eines ausfahrbaren Krieg Datei, die Verpackung des Projektes muss sein: Krieg .

Als Nächstes wird ein neues Integrations- Maven-Profil erstellt, mit dem die Integrationstests nur ausgeführt werden können, wenn dieses Profil aktiv ist, und nicht als Teil des Standard-Build-Lebenszyklus.

  integration   ...    

Dieses Profil enthält die gesamte verbleibende Konfiguration.

Jetzt ist der Jetty-Server so konfiguriert, dass er in der Phase vor dem Integrationstest startet und in der Phase nach dem Integrationstest stoppt .

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

Dies stellt sicher, dass die Ziele Fracht: Startziel und Fracht: Stopp vor und nach der Integrationstestphase ausgeführt werden. Da es zwei einzelne Ausführungsdefinitionen gibt , muss das ID- Element in beiden vorhanden (und unterschiedlich) sein, damit Maven die Konfiguration akzeptieren kann.

Als nächstes muss die Konfiguration des Maven-Surefire-Plugins im Integrationsprofil überschrieben werden , damit die Integrationstests, die im Standardlebenszyklus ausgeschlossen wurden, jetzt enthalten sind und ausgeführt werden:

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

Es gibt einige bemerkenswerte Dinge:

1. Das Testziel des Maven-Surefire-Plugins wird in der Integrationstestphase ausgeführt . Zu diesem Zeitpunkt ist Jetty bereits mit dem bereitgestellten Projekt gestartet, sodass die Integrationstests problemlos ausgeführt werden sollten.

2. Die Integrationstests sind jetzt enthalten in der Ausführung. Um dies zu erreichen, werden auch die Ausschlüsse überschrieben - dies liegt daran, wie Maven mit dem Überschreiben von Plugin-Konfigurationen in Profilen umgeht. Die Basiskonfiguration wird nicht vollständig überschrieben, sondern durch neue Konfigurationselemente im Profil ergänzt. Aus diesem Grund das Original Die Konfiguration, die die Integrationstests an erster Stelle ausgeschlossen hat, ist weiterhin im Profil vorhanden und muss überschrieben werden, da dies zu Konflikten mit dem führen würde Konfiguration und die Tests würden immer noch nicht ausgeführt.

3. Beachten Sie, dass es nur eine einzige gibt Element, es ist nicht erforderlich, eine ID zu definieren.

Jetzt kann der gesamte Prozess ausgeführt werden:

mvn clean install -Pintegration

Fazit

Die schrittweise Konfiguration von Maven umfasst den gesamten Prozess der Einrichtung des Integrationsprozesses als Teil des Projektlebenszyklus.

Normalerweise wird 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, das ich in einem zukünftigen Beitrag behandeln werde.

Eine vollständige Konfiguration dieses Mechanismus finden Sie im REST GitHub-Projekt.

In diesem Artikel finden Sie auch Best Practices für die Strukturierung eines Projekts und die Organisation der Unit- und Integrationstests.