Gibt es eine Möglichkeit, nur einen einzigen Test in Maven zu überspringen?

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.

Steve Reed
quelle
7
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:

mvn -Dtest=\!CronTabTest* package
haridsv
quelle
2
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:

  <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.

fergal_dd
quelle
7

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.

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 mvnBefehl 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 verifynur Integrationstests ausgeführt und keine Komponententests

Naramsim
quelle
7

Schauen Sie sich diese Lösung mithilfe von @CategoryAnmerkungen 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
Renaud
quelle
1
Ist es möglich, die Kategorie in der Maven-Befehlszeile anzugeben / ohne den Code zu berühren?
Karl Richter
4

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");
    }
}
Raffael Schmid
quelle