Überspringen von Tests in einigen Modulen in Maven
-
12-09-2019 - |
Frage
Ich möchte, dass meine Maven -Builds die meisten Unit -Tests durchführen. Aber es gibt Unit -Tests in einem Projekt, die langsamer sind und ich möchte sie im Allgemeinen ausschließen. und schalten Sie sie gelegentlich ein.
Frage: Wie mache ich das?
ich weiss Bescheid -Dmaven.test.skip=true
, Aber das macht alle Einheitstests aus.
Ich weiß auch über das Überspringen von Integrationstests, beschrieben, hier. Aber ich habe keine Integrationstests, nur Unit-Tests, und ich habe keine expliziten Anrufe beim Maven-Surefire-Plugin. (Ich verwende Maven 2 mit dem Eclipse-Maven-Plugin).
Lösung
Was ist mit Überspringen von Tests nur in diesem Modul?
In der pom.xml dieses Moduls:
<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>
Schließlich können Sie ein Profil erstellen, das die Tests deaktiviert (immer noch die pom.xml des Moduls):
<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>
Mit der letzteren Lösung, wenn Sie laufen mvn clean package
, Es wird alle Tests durchführen. Wenn du läufst mvn clean package -DnoTest=true
, Es wird die Tests für dieses Modul nicht ausführen.
Andere Tipps
Ich denke, das ist einfacher und hat auch den Vorteil, dass sie für Nicht-Versicherungstests (in meinem Fall Flexunittests) arbeiten.
<profile>
<id>noTest</id>
<properties>
<maven.test.skip>true</maven.test.skip>
</properties>
</profile>
Wenn Sie ein großes Multi-Modul-Projekt haben und Tests nur in bestimmten Modulen überspringen möchten, ohne dass jedes Modul geändert werden muss pom.xml
Datei mit benutzerdefinierter Konfiguration und Profilerstellung können Sie dem übergeordneten Folgendes hinzufügen pom.xml
Datei:
<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>
Danke an die build-helper-maven-plugin
Sie würden tatsächlich dynamisch prüfen, ob Sie sich in einem bestimmten Modul befinden oder nicht während des Builds, über die project.artifactId
Eigentum (auf jeden zeigen artifactId
Das Modul während des Builds) würde der Regex dann nach bestimmten Werten eine Übereinstimmung suchen (die Modulnamen, für die Sie Tests überspringen möchten) und die Bevölkerung der Populationen maven.test.skip
Eigentum entsprechend (festlegen true
).
In diesem Fall werden Tests übersprungen für module1
und module3
Während des richtigen Laufens für module2
, das ist, wie der Regex ausgedrückt.
Der Vorteil dieses Ansatzes besteht darin, ihn dynamisch und zentralisiert zu haben (im Elternteil pom.xml
) Daher besser für die Wartung: Sie können Module jederzeit hinzufügen oder entfernen, indem Sie einfach die einfache Regex oben ändern.
Wenn dies nicht das Standardverhalten des Builds (empfohlener Fall) ist, können Sie das Snippet immer in a einwickeln Maven -Profil.
Sie können auch weiter gehen und dynamisches Verhalten basierend auf Ihrer Eingabe haben:
<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>
Hier ersetzen wir den Regex -Wert tatsächlich durch eine Eigenschaft. test.regex
, mit Standardwert zu none
(oder was auch immer nicht mit einem Modulnamen übereinstimmt, oder auch die Standardüberspring -Übereinstimmungen).
Dann könnten wir von der Befehlszeile haben
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)
Das heißt, dann entscheiden Sie sich zur Laufzeit, ohne dass es erforderlich ist, die zu ändern pom.xml
Datei oder Aktivierung eines Profils.
Ich hatte einen etwas anderen Bedarf als diese Frage, die sich als hilfreich erweisen könnte. Ich wollte einige verschiedene Tests aus verschiedenen Paketen aus der Befehlszeile ausschließen, sodass eine einzelne Wildcard es nicht tun würde.
Ich habe im Maven fehlgeschlagene Dokumentationsregeln für Ausschlüsse gefunden, dass Sie eine von Kommas getrennte Liste von Regex- oder Wildcard-Ausschlüssen angeben können:https://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html
Also sah meine Pomfile so aus:
<excludes>
<exclude>${exclude.slow.tests}</exclude>
</excludes>
Und meine Befehlszeile enthielt Folgendes:
mvn install "-Dexclude.slow.tests=**/SlowTest1.java, **/package/ofslowtests/*.java, **/OtherSlowTest.java"
Für mich bestand die wichtigste Zutat darin, eine Reihe von Tests in eine Maven -Immobilie in einer einzigen Ausnahmeerklärung zu bekommen.
Mit Surefire Plugin 2.19 können Sie einfach die Tests ausschließen, die Sie nicht mit regulären Ausdrücken möchten:
mvn '-Dtest=!%regex[.*excludedString.*]' test
Der obige Befehl schließt alle Tests aus, die enthalten ausgeschlossen.
NB1 Wenn die doppelte Zitatmarke (") anstelle von Apostroph (') verwendet wird, wird der Befehl nicht ordnungsgemäß interpretiert und führt zu unerwarteten Ergebnissen (getestet mit BASH 3.2.57)
NB2 Besondere Aufmerksamkeit sollte auf Projekte gelegt werden, bei denen mehrere Versionen des Todesfire -Plugins verwendet werden. Versionen von Todesfire älter als 2.19 führen keine Tests aus, da sie keine regulären Ausdrücke unterstützen.
Versionsverwaltung (es könnte eine gute Idee sein, dies in der übergeordneten POM -Datei hinzuzufügen):
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
</plugin>
</plugins>
</pluginManagement>
</build>
Beispiele für Build -Befehle, die Tests überspringen: https://artbcode.wordpress.com/2016/11/28/how-to-skip-a-subset-of-the-unit-tests/