Avvio del processo esterno durante i test di integrazione in Maven
-
05-07-2019 - |
Domanda
Voglio test di integrazione completamente automatizzati per un progetto Maven. I test di integrazione richiedono che un programma esterno (dipendente dalla piattaforma) venga avviato prima di essere eseguito. Idealmente, il programma esterno verrebbe ucciso al termine dei test unitari, ma non è necessario.
Esiste un plugin Maven per raggiungere questo obiettivo? Altre idee?
Soluzione
È possibile utilizzare il plug-in antrun . Al suo interno useresti exec applica compito.
Qualcosa del genere.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.2</version>
<executions>
<execution>
<phase> <!-- a lifecycle phase --> </phase>
<configuration>
<tasks>
<apply os="unix" executable="cmd">
<arg value="/c"/>
<arg value="ant.bat"/>
<arg value="-p"/>
</apply>
<apply os="windows" executable="cmd.exe">
<arg value="/c"/>
<arg value="ant.bat"/>
<arg value="-p"/>
</apply>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
Il supporto di formiche ovviamente per comandi specifici tramite l'operazione task condizione .
Altri suggerimenti
Attualmente sto lavorando a un plug-in più specifico che potrebbe essere facilmente "degradato" essere un semplice esecutore esterno ma ... ci sono molte altre cose da considerare.
- Come sai che il processo è effettivamente iniziato?
- Cosa fai con il codice di ritorno?
- Come assicurarsi che il plug-in di esecuzione sia eseguito per primo (associarlo alla fase di compilazione del test)?
Sono sicuro che ci sarebbe di più se davvero iniziassi a sviluppare il plugin, ma c'è davvero bisogno di un programma di esecuzione generico?
UPDATE:
Suppongo che ci sia ... c'è un eccellente set di plugin Maven su CodeHaus. Ecco quello che vuoi: http://mojo.codehaus.org/exec-maven-plugin / .
Il plugin cargo maven è una buona strada da percorrere se si sta sviluppando servlet e si desidera distribuire la WAR risultante per i test di integrazione.
Quando lo faccio da solo, spesso organizzo un progetto multi-modulo (anche se non strettamente) e incapsulo tutti i test di integrazione in quell'unico modulo. Quindi abilito il modulo con i profili (o meno) in modo che non blocchi l'immediato " sì, so di averlo rotto " costruisce.
Ecco il pom di quel modulo di test funzionale: rendilo quello che vuoi:
<?xml version="1.0"?><project>
<parent>
<artifactId>maven-example</artifactId>
<groupId>com.jheck</groupId>
<version>1.5.0.4-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.jheck.example</groupId>
<artifactId>functional-test</artifactId>
<name>Example Functional Test</name>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.jheck.example</groupId>
<artifactId>example-war</artifactId>
<type>war</type>
<scope>provided</scope>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>httpunit</groupId>
<artifactId>httpunit</artifactId>
<version>1.6.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>0.3</version>
<configuration>
<wait>false</wait> <!-- don't pause on launching tomcat... -->
<container>
<containerId>tomcat5x</containerId>
<log>${project.build.directory}/cargo.log</log>
<zipUrlInstaller>
<!--
<url>http://www.apache.org/dist/tomcat/tomcat-5/v5.0.30/bin/jakarta-tomcat-5.0.30.zip</url>
-->
<!-- better be using Java 1.5... -->
<url>http://www.apache.org/dist/tomcat/tomcat-5/v5.5.26/bin/apache-tomcat-5.5.26.zip</url>
<installDir>${installDir}</installDir>
</zipUrlInstaller>
</container>
<configuration>
<!-- where the running instance will be deployed for testing -->
<home>${project.build.directory}/tomcat5x/container</home>
</configuration>
</configuration>
<executions>
<execution>
<id>start-container</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
<goal>deploy</goal>
</goals>
<configuration>
<deployer>
<deployables>
<deployable>
<groupId>com.jheck.example</groupId>
<artifactId>example-war</artifactId>
<type>war</type>
<!-- <properties>
<plan>${basedir}/src/deployment/geronima.plan.xml</plan>
</properties> -->
<pingURL>http://localhost:8080/example-war</pingURL>
</deployable>
</deployables>
</deployer>
</configuration>
</execution>
<execution>
<id>stop-container</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Probabilmente si desidera associare i test di integrazione effettivi alla fase di test di integrazione del ciclo di vita di Maven. Se si utilizza un plug-in non sicuro (come il plug-in fail-safe con nome appropriato) per eseguire i test effettivi, è possibile eseguire le fasi in questo modo:
test pre-integrazione : avvia un'applicazione esterna (usando il plugin exec o uno degli altri suggerimenti qui)
test di integrazione : esegui i test di integrazione effettivi utilizzando il plug-in fail-safe
test post-integrazione : chiudi l'applicazione esterna e fai qualsiasi altra pulizia necessaria
verifica : fai in modo che il plug-in fail-safe verifichi i risultati del test e fallisca la compilazione a questo punto
È abbastanza semplice usare il plugin exec, il trucco è avviare la tua applicazione in background . Dovresti fare attenzione a assicurarti che l'app sia completamente attiva prima di iniziare i test nella fase successiva. Sfortunatamente, ottenere l'applicazione e assicurarsi che sia abbastanza in esecuzione durante l'esecuzione in background non è sempre un compito banale e le specifiche di come farlo dipendono dall'applicazione. Spesso comporta codice personalizzato nell'applicazione.
Vuoi avviare un application server? Dai un'occhiata a Cargo e ai suoi plugin Maven .