Wenn Sie das ausfallsichere Plugin verwenden:mvn clean install -Dit.test=\!TestToSkip.*
drizzt.dourden
Antworten:
23
Mit Junit 4 füge ich eine @IgnoreAnmerkung hinzu, wenn ich das tun möchte. Dies würde für Sie funktionieren, es sei denn, Sie möchten den Test nur manchmal ignorieren oder ihn nur ignorieren, wenn der Build von maven ausgeführt wird. Wenn dies der Fall ist, würde ich fragen "Warum?"
Tests sollten konsistent sein, sie sollten tragbar sein und sie sollten immer bestehen. Wenn ein bestimmter Test problematisch ist, würde ich in Betracht ziehen, ihn neu zu schreiben, vollständig zu entfernen oder in eine andere Testsuite oder ein anderes Projekt zu verschieben.
Der Anwendungsfall ist, dass gerade jemand in meinem Team einen Test repariert und ich alle anderen Tests starten möchte, aber nicht diesen, bis er wieder funktioniert. Sie haben also Recht, ich sollte es vorübergehend durch Code deaktivieren.
Paulgreg
3
Nicht einverstanden, dass alle Tests portabel sein sollten usw. Unit-Tests, ja, aber es gibt einen gültigen Grund, Integrationstests zu schreiben, um sicherzustellen, dass Sie eine Datenquelle zur Entwicklungszeit verkabeln können, anstatt auf die Bereitstellungszeit zu warten. Diese Tests sollten nicht beim Erstellen ausgeführt werden und nur zum Testen der Konfiguration während der Entwicklung.
Dardo
12
Ich bin nicht einverstanden mit Steve Reed. Ich habe einen Test, der in meiner Umgebung fehlschlägt und nicht mit meiner Arbeit zusammenhängt. Ich möchte @Ignore nicht in den Code einfügen, da ich andere Änderungen habe. Also möchte ich es während eines Maven-Builds "mvn clean install" überspringen. Ich möchte keine Zeit damit verbringen, es zu analysieren oder zu reparieren, weil ich klar weiß, dass es nicht mein Gebiet ist und ich meine Zeit besser nutzen kann, um an anderen Dingen zu arbeiten. Eine gute Antwort auf diese Frage ist also sehr sinnvoll.
Yalkris
6
Also predigen ... @Ignore ist nicht immer ideal. Betrachten Sie einen Test von jemand anderem, und ja, er ist schlecht (schlägt fehl, wenn er zu oft ausgeführt wird, aber zunächst bestanden wird), aber nein, Sie haben weder Zeit, ihn zu reparieren, noch Zeit, jemanden davon zu überzeugen, ihn herauszunehmen oder selbst zu reparieren, und Sie Ich möchte das Ignorieren nicht versehentlich begehen, da es die meiste Zeit tatsächlich etwas Wertvolles testet ... +1 für den anderen, der die Frage tatsächlich beantwortet hat.
Gus
3
Wie ist dies die akzeptierte Antwort, wenn sie die Frage nicht beantwortet?
Alex Lehmann
59
Sie können ein Ausschlussmuster für die -DtestOption angeben, indem Sie ihm ein !(Ausrufezeichen) voranstellen. Z.B,
mvn -Dtest=\!FlakyTest* install
Fand es hier und bestätigte, dass es funktioniert. Zum Beispiel konnte ich diesen schuppigen Jenkins-Test überspringen, indem ich Folgendes verwendete:
Diese Funktion wurde in 2.19 implementiert, siehe Dokumentation .
Rdvdijk
Gibt es eine Möglichkeit, Ein- und Ausschlüsse zu kombinieren? Zum Beispiel möchte ich vielleicht Cron * Test außer CronFlakyTest ausführen. Ich habe es versucht, mvn -Dtest="\!CronFlakyTest,Cron*Test" installaber das führt immer noch den schuppigen Test aus
Sridhar Sarnobat
Warnung: Dies ist zwar nützlich, kann jedoch Ihre Ausschlussregeln verwerfen, z. B. dazu führen, dass Gurkenintegrationstests während des Komponententests ausgeführt werden.
Gameweld
1
Mit dieser Syntax können Sie auch mehrere Tests nach Namen überspringen:mvn test -Dtest=\!FirstTestClass,\!SecondTestClass
Cuga
12
Es ist normal, dass Integrationstests ausgeschlossen werden müssen, aber Unit-Tests müssen eingeschlossen werden. Um dies zu erreichen, empfehle ich, alle Integrationstests mit einem Postfix IntegrationTest (z. B. AbcIntegrationTest.java) zu benennen.
und dann in deinen Maven Build folgendes einfügen:
Wenn Sie die CLI verwenden möchten, um einen einzelnen Test auszuschließen, sollten Sie die Flags -Dtestund verwenden -Dit.test.
Achten Sie darauf, die Standardeinstellungen zurückzusetzen. Wenn Sie die !Notation verwenden, werden alle Standardeinstellungen gelöscht und Sie sollten sie zurücksetzen. Für normale Tests, die von surefireIhnen ausgeführt werden , sollten Sie hinzufügen *Test, Test*, *Tests, *TestCase, während für Integrationstests, die von failsafeIhnen ausgeführt werden , hinzugefügt werden sollte IT*, *IT, *ITCase.
Denken Sie daran, zu verwenden 'und nicht ". Bei Verwendung von doppelten Anführungszeichen werden alle !darin enthaltenen Werte von ausgewertet bash.
Denken Sie auch daran, dass Integrationstests nicht ausgeführt werden, wenn mvn test. Es werden mvn verifynur Integrationstests ausgeführt und keine Komponententests
mvn clean install -Dit.test=\!TestToSkip.*
Antworten:
Mit Junit 4 füge ich eine
@Ignore
Anmerkung hinzu, wenn ich das tun möchte. Dies würde für Sie funktionieren, es sei denn, Sie möchten den Test nur manchmal ignorieren oder ihn nur ignorieren, wenn der Build von maven ausgeführt wird. Wenn dies der Fall ist, würde ich fragen "Warum?"Tests sollten konsistent sein, sie sollten tragbar sein und sie sollten immer bestehen. Wenn ein bestimmter Test problematisch ist, würde ich in Betracht ziehen, ihn neu zu schreiben, vollständig zu entfernen oder in eine andere Testsuite oder ein anderes Projekt zu verschieben.
quelle
Sie können ein Ausschlussmuster für die
-Dtest
Option angeben, indem Sie ihm ein!
(Ausrufezeichen) voranstellen. Z.B,Fand es hier und bestätigte, dass es funktioniert. Zum Beispiel konnte ich diesen schuppigen Jenkins-Test überspringen, indem ich Folgendes verwendete:
quelle
mvn -Dtest="\!CronFlakyTest,Cron*Test" install
aber das führt immer noch den schuppigen Test ausmvn test -Dtest=\!FirstTestClass,\!SecondTestClass
Es ist normal, dass Integrationstests ausgeschlossen werden müssen, aber Unit-Tests müssen eingeschlossen werden. Um dies zu erreichen, empfehle ich, alle Integrationstests mit einem Postfix IntegrationTest (z. B. AbcIntegrationTest.java) zu benennen.
und dann in deinen Maven Build folgendes einfügen:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <excludes> <exclude>**/*IntegrationTest.java</exclude> </excludes> </configuration> </plugin>
Wenn Sie damit erstellen, werden alle Integrationstests ausgeschlossen, aber alle anderen Tests (z. B. Unit-Test) werden ausgeführt. Perfekt :-)
Weitere Informationen zum Ausschließen und Einschließen von Tests während des Testlaufs finden Sie unter
http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html
PS Um einen einzelnen Test auszuschließen, müssen Sie ihn lediglich in der Ausschlussliste explizit benennen. Einfach.
quelle
Wenn Sie die CLI verwenden möchten, um einen einzelnen Test auszuschließen, sollten Sie die Flags
-Dtest
und verwenden-Dit.test
.Achten Sie darauf, die Standardeinstellungen zurückzusetzen. Wenn Sie die
!
Notation verwenden, werden alle Standardeinstellungen gelöscht und Sie sollten sie zurücksetzen. Für normale Tests, die vonsurefire
Ihnen ausgeführt werden , sollten Sie hinzufügen*Test, Test*, *Tests, *TestCase
, während für Integrationstests, die vonfailsafe
Ihnen ausgeführt werden , hinzugefügt werden sollteIT*, *IT, *ITCase
.Weitere Informationen finden Sie hier https://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html (normale Tests)
und hier https://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html (Integrationstests)
-Dit.test='!ITsometestIT, IT*, *IT, *ITCase'
Ein vollständiger
mvn
Befehl könnte folgender sein:mvn -e -B -Dtest='!unitTestABC, *Test, Test*, *Tests, *TestCase' -Dit.test='!ITintegrationTestABCIT, IT*, *IT, *ITCase' -DfailIfNoTests=false clean install
Denken Sie daran, zu verwenden
'
und nicht"
. Bei Verwendung von doppelten Anführungszeichen werden alle!
darin enthaltenen Werte von ausgewertetbash
.Denken Sie auch daran, dass Integrationstests nicht ausgeführt werden, wenn
mvn test
. Es werdenmvn verify
nur Integrationstests ausgeführt und keine Komponententestsquelle
Schauen Sie sich diese Lösung mithilfe von
@Category
Anmerkungen anWas Sie dann mit einer Testsuite ausführen:
Sie können diese Tests mit maven auch einschließen (
groups
) / ausschließen (excludedGroups
), indem Sie beispielsweise Folgendes verwenden:quelle
Ich denke, das sollte funktionieren, wenn Sie diesen Befehl verwenden:
(Für den Test ändern Sie pom.xml und die Testklasse wie folgt und verwenden Sie mvn install)
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>test</groupId> <artifactId>test</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>test</name> <url>http://maven.apache.org</url> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <excludes> <exclude> test/AppTest.java </exclude> </excludes> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.5</version> <scope>test</scope> </dependency> </dependencies>
Testklasse:
quelle