Verhindern Sie Unit-Tests, aber erlauben Sie Integrationstests in Maven

157

Ich habe einen Maven-Build, in dem ich das SureFire-Plugin zum Ausführen einiger Komponententests und das FailSafe-Plugin zum Ausführen einiger Integrationstests verwende. Ich möchte nur die Tests des FailSafe-Plugins ausführen.

Es ist keine gute Lösung für mich, verschiedene Profile oder irgendetwas im POM hinzuzufügen, da es sich um einen Multimodul-Build handelt und ich nicht den Pom jedes Moduls bearbeiten möchte.

Es gibt skip.testsund maven.test.skipund skipTestsdie alle Tests stoppen und skipITsdie nur das ausfallsichere Plugin stoppen .

skipITsGibt es also ein Kommandozeilen-Flag für Maven wie , aber mit der Funktionalität von "onlyITs"?

Matthew Gilliard
quelle
Hast du es versucht maven.test.skipoder skipTests?
Thomas
1
@ Khhmarbaise in der Theorie, ja. Aber in den meisten Projekten, in denen ich gearbeitet habe, waren die "Unit-Tests" tatsächlich Integrationstests mit einer In-Memory-Datenbank (wenn Sie Glück hatten)
Sean Patrick Floyd
9
@khmarbaise Viele Unit-Tests. Sie brauchen ein paar Minuten, um zu rennen, und wir brauchen sie unter diesen Umständen nicht, um zu rennen. Insbesondere führen wir Unit-Tests durch, bevor wir das Artefakt erstellen (natürlich), aber wir möchten die ITs in mehreren Umgebungen ausführen. An diesem Punkt macht es keinen Sinn, die Komponententests erneut auszuführen.
Matthew Gilliard
2
Hallo @khmarbaise, in meinem Setup werden skipTestsnur die todsicheren Tests übersprungen, nicht der ausfallsichere Test! Vielleicht ist es eine neue Funktion?
Danidemi
2
Zu Ihrer Information: skipTests ist jetzt im Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )
Guillaume Husta

Antworten:

170

Ich fand, dass der einfachste Weg, nur todsichere Tests zu überspringen, darin besteht, todsicher ( aber nicht ausfallsicher ) wie folgt zu konfigurieren :

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.14</version>
    <configuration>
        <!-- skips surefire tests without skipping failsafe tests.
                 Property value seems to magically default to false -->
        <skipTests>${skip.surefire.tests}</skipTests>
    </configuration>
</plugin>

Auf diese Weise können Sie laufen mvn verify -Dskip.surefire.testsund nur todsichere, nicht ausfallsichere Tests werden übersprungen. Es werden auch alle anderen erforderlichen Phasen ausgeführt, einschließlich Vorintegration und Nachintegration , und es wird auch das verifyZiel ausgeführt, das erforderlich ist, um Ihren Maven-Build tatsächlich fehlzuschlagen, wenn Ihre Integrationstests fehlschlagen.

Beachten Sie, dass hierdurch die Eigenschaft neu definiert wird, mit der angegeben wird, dass Tests übersprungen werden sollen. Wenn Sie also das Kanonische angeben, -DskipTests=truewird es von safefire ignoriert, aber fehlersicher wird es respektiert, was unerwartet sein kann, insbesondere wenn bereits Builds / Benutzer dieses Flag angeben . Eine einfache Problemumgehung scheint darin zu bestehen, standardmäßig skip.surefire.testsden Wert von skipTestsin Ihrem <properties>Abschnitt des POM zu verwenden:

<properties>
    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>

Wenn nötig, können Sie einen analogen Parameter angeben, der als ausfallsicher bezeichnet wird. skip.failsafe.testsIch habe dies jedoch nicht für erforderlich befunden, da Unit-Tests normalerweise in einer früheren Phase ausgeführt werden. Wenn ich Unit-Tests, jedoch keine Integrationstests ausführen möchte, würde ich sie ausführen die testPhase anstelle der verifyPhase. Ihre Erfahrungen können variieren!

Diese skip.(surefire|failsafe).testsEigenschaften sollten wahrscheinlich in den todsicheren / ausfallsicheren Code selbst integriert werden, aber ich bin mir nicht sicher, inwieweit dies gegen das Ethos "Sie sind bis auf einen winzigen Unterschied genau das gleiche Plugin" verstoßen würde.

Speck
quelle
4
Mit dieser Lösung konnte ich mein Framework so einrichten, dass -DskipUnitTests das todsichere Plugin überspringt, -DskipIntegrationTests das ausfallsichere Plugin überspringt und DskipTests beide überspringt. Genau das, was gebraucht wurde!
Alex Jansen
2
Meine IDE beschwert sich über "Symbol 'skipTests' kann nicht aufgelöst werden". Die Lösung bestand darin, eine Zeile hinzuzufügen, die <skipTests>false</skipTests>weiterhin mit einer beliebigen Kombination von -DskipTests oder -Dskip.surefire.tests funktioniert, da Befehlszeilenargumente die Eigenschaften stackoverflow.com/questions/13708738 zu überschreiben scheinen /… Vielleicht möchten Sie das zu Ihrer Lösung hinzufügen
Globalworming
<skipTests>${skip.surefire.tests}</skipTests>funktioniert nicht mit maven-surefire-pluginVersion 3.0.0-M3. Alle todsicheren Tests laufen noch. Hat das noch jemand gefunden? Die unten stehende Lösung von Sean Patrick Floyd funktioniert jedoch.
John Meyer
120

Eine Problemumgehung wäre, Folgendes aufzurufen:

mvn clean test-compile failsafe:integration-test

Zugegeben, das ist hässlich, aber es kann Ihr Problem lösen.


Oder (ein weiterer Hack):

mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false

Referenz:

Sean Patrick Floyd
quelle
1
Der zweite Vorschlag hat bei mir funktioniert. Pre-Integration-Test wurde erfolgreich aufgerufen
Lawrence Tierney
7
Ist das eine gute Idee? Wird Ihr Build nicht erfolgreich sein, selbst wenn Ihre Integrationstests fehlschlagen? Das ist die ganze Essenz von Failsafe, wenn Sie nicht auch das Ziel "Verifizieren" ausführen . Quote: "Das Failsafe Plugin wird den Build während der Integrationstestphase nicht fehlschlagen". Sie müssen das Überprüfungsziel ausführen, um tatsächlich festzustellen, ob die Integrationstests erfolgreich waren oder nicht!
Bacar
2
@bacar ist richtig, aber nur verifyanstelle von integration-testin der 2. Lösung verwenden.
Matthew Gilliard
1
Sie sollten @bacar Antwort für eine viel bessere Lösung sehen.
FBB
12
Wenn Sie failsafe:verifyam Ende des ersten hack ( mvn clean test-compile failsafe:integration-test failsafe:verify) hinzufügen , schlägt der Build fehl, wenn einer der Integrationstests fehlschlägt.
Shadow Man
73

Ich verwende den Code von Antonio Goncalves Blog , der perfekt funktioniert.

Sie können die folgenden Eigenschaften verwenden:

-DskipUTs=true zum Überspringen von todsicheren Tests.

-DskipITs=true zum Überspringen von ausfallsicheren Tests.

-DskipTests=true zum Überspringen aller Tests.

Das pom.xmlist wie folgt:

<properties>
    <skipTests>false</skipTests>
    <skipITs>${skipTests}</skipITs>
    <skipUTs>${skipTests}</skipUTs>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <skipTests>${skipUTs}</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.19.1</version>
            <executions>
                <execution>
                    <id>run-integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>
            </configuration>
        </plugin>
    </plugins>
</build>
Martijn Burger
quelle
2
Danke, toller Ansatz! Es ist auch nützlich, die Standardausführung von todsicheren (Standardtest) zu überschreiben, siehe: stackoverflow.com/questions/11935181/…
pls
1
Dies ist der Grund, warum Sie manchmal nach unten scrollen und nach einer funktionierenden Lösung mit allen erforderlichen Informationen suchen müssen. Vielen Dank für das Teilen
Atul Chaudhary
Wirklich eine schöne Lösung. Die ausfallsichere Konfiguration ist jedoch wie skipITsdie Standardeinstellung redundant .
Timomeinen
SkipITs ist eine benutzerdefinierte Option in dieser Konfiguration. Sie haben Recht mit der Standardimplementierung, aber das war nicht die Frage des OP.
Martijn Burger
Kudos, du bist ein Maven-Guru! Dies sollte im Maven Superpom sein.
Adam
22

Hoffe das hilft!

Versuchen Sie, den Test nur mit FailSafe auszuführen (Plugin für Integrationstest - Sie können standardmäßig nur Integrationstests mit dieser Art ausführen : * / IT .java, ** / IT.java, * /*ITCase.java ;, aber Sie können das leicht von der POM-Datei ändern)

mvn failsafe:integration-test

Und wenn Sie nur SureFire verwenden möchten (Plugin für Unit-Tests)

mvn surefire:test

oder jeweils ein Test mit:

mvn -Dtest=MyUnitlTest
Kati Holasz
quelle
9

Ich mag das, damit normalerweise alle Phasen ausgeführt werden:

 mvn -Dtest=foo -DfailIfNoTests=false verify
Jérôme Herry
quelle
1
Dies ist die einfachste (und ehrlich gesagt brillanteste) Lösung!
Titulum
Es ist nicht erforderlich, dem POM etwas hinzuzufügen, wie vom OP verlangt, und alle Phasen wie angegeben auszuführen. gute Antwort.
jnichols959
1

Um die Kommentare von @danidemi und @GuillaumeHusta zu erweitern:

Zu Ihrer Information: skipTests ist jetzt im Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 ) veraltet.

Um Unit-Tests, aber keine Integrationstests zu überspringen, können Sie dies tun, wenn Sie die neueste Version des Failsafe-Plugins verwenden:

mvn verify -DskipTests

(Bitte geben Sie den genannten Kommentaren eine positive Bewertung, wenn dies Ihnen hilft.)

Meustrus
quelle
-3

Versuchen Sie, Ihre Integrations- oder Komponententests in einem separaten Profil auszuführen. Dann können Sie einfach das Profil aktivieren / deaktivieren.

Steven
quelle
Fügen Sie möglicherweise einen übergeordneten POM hinzu, in dem Sie ein Profil definieren, auf dem nur ITs ausgeführt werden. Alle Projekt-Submodule könnten von diesem POM erben, sodass Sie nicht jeden Pom ändern oder Module mit speziellen Schaltern ausführen müssen (da Sie das Profil bei Abwesenheit von Eigenschaften aktivieren können).
Yoosiba