Saltando test in alcuni moduli in Maven
-
12-09-2019 - |
Domanda
Vorrei che il mio Maven costruisce per eseguire la maggior parte dei test di unità. Ma ci sono test di unità in un unico progetto, che sono più lento e mi piacerebbe escluderli in generale; e, occasionalmente, accenderli.
Domanda :? Come faccio a fare questo
So di -Dmaven.test.skip=true
, ma che spegne tutti i test di unità.
So anche di saltare i test di integrazione, descritto qui . Ma non ho test di integrazione, test di unità solo, e non ho nessuna chiamata esplicita al Maven-infallibile-plugin. (Sto usando Maven 2 con il plugin Eclipse Maven).
Soluzione
Che dire di saltare i test solo in questo modulo?
Nel pom.xml di questo modulo:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>
Alla fine, è possibile creare un profilo che consente di disattivare i test (ancora il pom.xml del modulo):
<project>
[...]
<profiles>
<profile>
<id>noTest</id>
<activation>
<property>
<name>noTest</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
[...]
</project>
Con la seconda soluzione, se si esegue mvn clean package
, verrà eseguito tutti i test. Se si esegue mvn clean package -DnoTest=true
, non verrà eseguito il test per questo modulo.
Altri suggerimenti
Credo che questo è più facile, e ha anche il vantaggio di lavorare per prove non infallibili (nel mio caso, FlexUnitTests)
<profile>
<id>noTest</id>
<properties>
<maven.test.skip>true</maven.test.skip>
</properties>
</profile>
Se si dispone di un grande progetto multi-modulo e volete saltare i test solo in alcuni moduli, senza la necessità di cambiare ciascuno dei file del modulo pom.xml
con configurazione personalizzata e profilatura, si potrebbe aggiungere il seguente al file principale pom.xml
:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.12</version>
<executions>
<execution>
<id>regex-property</id>
<goals>
<goal>regex-property</goal>
</goals>
<configuration>
<name>maven.test.skip</name>
<value>${project.artifactId}</value>
<regex>(module1)|(module3)</regex>
<replacement>true</replacement>
<failIfNoMatch>false</failIfNoMatch>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<modules>
<module>module1</module>
<module>module2</module>
<module>module3</module>
</modules>
Grazie alla build-helper-maven-plugin
si sarebbe effettivamente controllare dinamicamente se si è in un certo modulo o non durante la compilazione, tramite la proprietà project.artifactId
(indicando ogni modulo artifactId
durante la compilazione), l'espressione regolare sarebbe poi cercare di corrispondenza per certi valori ( i nomi dei moduli per i quali si desidera saltare i test) e popolato la proprietà maven.test.skip
di conseguenza (impostandolo a true
).
In questo caso, le prove sono saltati per module1
e module3
mentre funziona correttamente per module2
, cioè, come espresso dal regex.
Il vantaggio di questo approccio è di averlo dinamico e centralizzato (nel pom.xml
genitore) quindi meglio per la manutenzione: è possibile aggiungere o rimuovere moduli in qualsiasi momento semplicemente cambiando la semplice espressione regolare sopra
Ovviamente, se questo non è il comportamento di default della build (caso consigliato), si può sempre avvolgere il frammento di codice in un profilo Maven .
Si potrebbe anche andare oltre e avere un comportamento dinamico sulla base di input:
<properties>
<test.regex>none</test.regex>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.12</version>
<executions>
<execution>
<id>regex-property</id>
<goals>
<goal>regex-property</goal>
</goals>
<configuration>
<name>maven.test.skip</name>
<value>${project.artifactId}</value>
<regex>${test.regex}</regex>
<replacement>true</replacement>
<failIfNoMatch>false</failIfNoMatch>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Qui in realtà stiamo sostituendo il valore regex con una proprietà, test.regex
, con valore di default per none
(o qualsiasi altra cosa non avremmo adattarsi a qualsiasi nome del modulo o, anche, il default saltare abbinamenti richiesto).
Poi da linea di comando potremmo avere
mvn clean test -Dtest.regex="(module1)" > will skip tests only for module1
mvn clean test -Dtest.regex="(module1)|(module2)" > will skip tests on module1 and module2
mvn clean test -Dtest.regex="(module1)|(module2)|(module3)" > will skip the three module tests
mvn clean test -Dtest.regex=".+" > will skip all module tests
mvn clean test > would not skip anything (or fall back on default behavior)
Cioè, allora in fase di esecuzione si decide, senza alcun bisogno di modificare il file pom.xml
o attivare qualsiasi profilo.
ho avuto un bisogno leggermente diversa da questa domanda che può rivelarsi utile. Ho voluto escludere dalla riga di comando alcuni test differenti da diversi pacchetti, per cui un singolo carattere jolly non lo farei.
Ho trovato nelle norme di documentazione Maven Failsafe per le esclusioni che è possibile specificare un elenco separato da virgole di un'espressione regolare o esclusioni jolly: https://maven.apache.org/surefire/ Maven-fail-safe-plugin / examples / inclusione-exclusion.html
Quindi il mio pomfile si presentava così:
<excludes>
<exclude>${exclude.slow.tests}</exclude>
</excludes>
e la mia linea di comando incluso in questo modo:
mvn install "-Dexclude.slow.tests=**/SlowTest1.java, **/package/ofslowtests/*.java, **/OtherSlowTest.java"
Per me l'ingrediente chiave stava diventando un po 'di test in una proprietà Maven in una singola istruzione escludere.
Utilizzando infallibile Plugin 2.19 si può semplicemente escludere le prove che non si desidera utilizzare le espressioni regolari:
mvn '-Dtest=!%regex[.*excludedString.*]' test
Il comando sopra escluderà tutti i test che contengono excludedString .
NB1 Se virgolette doppie ( ") viene usato al posto di apostrofo ( ') il comando non verrà interpretato correttamente e produrrà risultati imprevisti. (Testata utilizzando bash 3.2.57)
NB2 Una particolare attenzione dovrebbe essere prestata ai progetti in cui è utilizzata la versione multipla del plugin infallibile. Le versioni di infallibile di età superiore a 2.19 non verranno eseguiti alcun test perché non supportano le espressioni regolari.
Gestione delle versioni (che potrebbe essere una buona idea per aggiungere questo nel file principale pom):
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
</plugin>
</plugins>
</pluginManagement>
</build>
Esempi di comandi di compilazione che saltano test: https://artbcode.wordpress.com/2016/11/28/how-to-skip-a-subset-of-the-unit-tests/