Integratietesten met de Maven Cargo-plug-in

Een veel voorkomende behoefte in de levenscyclus van een project is het opzetten van integratietests. Gelukkig heeft Maven ingebouwde ondersteuning voor dit exacte scenario, met de volgende fasen van de standaard build-levenscyclus (uit de Maven-documentatie):

  • pre-integratie-test: Voer acties uit die nodig zijn voordat integratietests worden uitgevoerd. Hierbij kan het onder meer gaan om het inrichten van de gewenste omgeving.
  • integratietest: Verwerk en implementeer het pakket indien nodig in een omgeving waar integratietests kunnen worden uitgevoerd.
  • post-integratie-test: Voer acties uit die nodig zijn nadat integratietests zijn uitgevoerd. Dit kan inclusief het opruimen van het milieu zijn.

Ten eerste is de maven-surefire-plugin zo geconfigureerd dat integratietesten zijn uitgesloten uit de standaard build-levenscyclus:

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

Uitsluitingen worden gedaan via paduitdrukkingen in ant-stijl, dus alle integratietests moeten dit patroon volgen en eindigen met “IntegrationTest.java“.

Vervolgens de cargo-maven2-plugin wordt gebruikt, aangezien Cargo wordt geleverd met eersteklas ondersteuning voor embedded webservers. Als de serveromgeving een specifieke configuratie vereist, weet Cargo natuurlijk ook hoe de server uit een gearchiveerd pakket moet worden opgebouwd en hoe deze op een externe server moet worden geïmplementeerd.

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

Er is een ingebouwde Jetty 8-webserver gedefinieerd, die luistert op poort 8080.

In nieuwere versie van vracht (1.1.0 en hoger) is de standaardwaarde van de wacht vlag is gewijzigd in vals, voor lading: start. Dit doel mag alleen worden gebruikt voor het uitvoeren van integratietests en is gebonden aan de levenscyclus van Maven; voor ontwikkeling, de lading: rennen doel moet in plaats daarvan worden uitgevoerd - wat heeft wait = true.

Om voor de pakket maven-fase om een inzetbaar oorlog bestand moet de verpakking van het project zijn: oorlog.

Vervolgens een nieuw integratieMaven profiel is gemaakt om het uitvoeren van de integratietests mogelijk te maken enkel en alleen wanneer dit profiel actief is, en niet als onderdeel van de standaard buildlevenscyclus.

  integratie ... 

Het is dit profiel dat alle resterende configuratie zal bevatten.

Nu is de Jetty-server geconfigureerd voor begin in de pre-integratie-test fase en hou op in de post-integratie-test fase.

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

Dit zorgt ervoor dat de lading: start doel en lading: stop doelen worden uitgevoerd voor en na de integratietest fase. Merk op dat omdat er twee individuele zijn executie definities, de ID kaart element moet in beide aanwezig (en verschillend) zijn, zodat Maven de configuratie kan accepteren.

De volgende, maven-surefire-plugin configuratie moet worden overschreven binnen het integratie profiel, zodat de integratietests die waren uitgesloten in de standaardlevenscyclus nu inbegrepen en loop:

  org.apache.maven.plugins maven-surefire-plugin integratie-test geen ** / * IntegrationTest.java 

Er zijn een paar dingen die het vermelden waard zijn:

1. Het test doel van de maven-surefire-plugin wordt uitgevoerd in integratietest fase; op dit punt is Jetty al gestart met het geïmplementeerde project, dus de integratietests zouden zonder problemen moeten worden uitgevoerd.

2. De integratietesten zijn nu inbegrepen in de uitvoering. Om dit te bereiken, worden de uitsluitingen ook overschreven - dit komt omdat de manier waarop Maven omgaat met het overschrijven van plug-inconfiguraties binnen profielen. De basisconfiguratie wordt niet volledig overschreven, maar uitgebreid met nieuwe configuratie-elementen in het profiel. Hierdoor is het origineel configuratie, die in de eerste plaats de integratietests uitsluit, is nog steeds aanwezig in het profiel en moet worden overschreven, anders zou het conflicteren met de configuratie en de tests zouden nog steeds niet worden uitgevoerd.

3. Merk op dat, aangezien er maar één is element, er is geen behoefte aan een ID kaart worden gedefinieerd.

Nu kan het hele proces worden uitgevoerd:

mvn schone installatie -Pintegration

Conclusie

De stapsgewijze configuratie van Maven omvat het hele proces van het opzetten van het integratieproces als onderdeel van de projectlevenscyclus.

Meestal is dit ingesteld om te draaien in een Continuous Integration-omgeving, bij voorkeur na elke commit. Als de CI-server al een server heeft die draait en poorten gebruikt, dan zal de vrachtconfiguratie te maken hebben met dat scenario, dat ik in een toekomstige post zal behandelen.

Bekijk het REST GitHub-project voor een volledig actieve configuratie van dit mechanisme.

Bekijk ook dit artikel voor best practices voor het structureren van een project en het organiseren van de unit en integratietests.