Ich möchte beim Starten nur einen einzigen Test überspringen mvn install
.
Gibt es eine Möglichkeit, das zu tun?
Ich möchte beim Starten nur einen einzigen Test überspringen mvn install
.
Gibt es eine Möglichkeit, das zu tun?
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.
Sie können ein Ausschlussmuster für die -Dtest
Option 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:
mvn -Dtest=\!CronTabTest* package
mvn -Dtest="\!CronFlakyTest,Cron*Test" install
aber das führt immer noch den schuppigen Test aus
mvn 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.
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 von surefire
Ihnen ausgeführt werden , sollten Sie hinzufügen *Test, Test*, *Tests, *TestCase
, während für Integrationstests, die von failsafe
Ihnen ausgeführt werden , hinzugefügt werden sollte IT*, *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 ausgewertet bash
.
Denken Sie auch daran, dass Integrationstests nicht ausgeführt werden, wenn mvn test
. Es werden mvn verify
nur Integrationstests ausgeführt und keine Komponententests
Schauen Sie sich diese Lösung mithilfe von @Category
Anmerkungen an
public class AccountTest {
@Test
@Category(IntegrationTests.class)
public void thisTestWillTakeSomeTime() {
...
}
@Test
@Category(IntegrationTests.class)
public void thisTestWillTakeEvenLonger() {
...
}
@Test
public void thisOneIsRealFast() {
...
}
}
Was Sie dann mit einer Testsuite ausführen:
@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@SuiteClasses( { AccountTest.class, ClientTest.class })
public class LongRunningTestSuite {}
Sie können diese Tests mit maven auch einschließen ( groups
) / ausschließen ( excludedGroups
), indem Sie beispielsweise Folgendes verwenden:
mvn -DexcludedGroups=com.mycompany.tests.IntegrationTests test
Ich denke, das sollte funktionieren, wenn Sie diesen Befehl verwenden:
mvn archetype:create -DgroupId=test -DartifactId=test
(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:
package test;
import org.junit.Test;
import static org.junit.Assert.fail;
public class AppTest
{
@Test
public void test_it() {
fail("not implemented");
}
}