Maven überspringen Tests

225

Ich benutze Maven 2.2.1 und um mein Projekt zu erstellen, habe ich diesen Befehl verwendet

mvn clean install -Dmaven.test.skip=true

Der Build schlug jedoch fehl und sagte, dass eines der Artefakte nicht gefunden werden konnte. Als ich jedoch benutzte:

mvn clean install -DskipTests

alles hat gut funktioniert.

Bisher habe ich gedacht, dass diese beiden Befehle gleichwertig sind. Dieser Link scheint jedoch darauf -Dmaven.test.skip=truehinzudeuten, dass auch das Kompilieren der Testfälle übersprungen wird.

Das hat mir jedoch immer noch nicht erklärt, warum ein Befehl funktioniert und ein anderer nicht. Wird dankbar sein, wenn jemand mir dies bitte erklärt.

Prabhjot
quelle
1
Welche Version des Maven-Surefire-Plugins verwenden Sie? Ist es dasselbe wie die Dokumentversion, die Sie lesen?
Gerrytan
2
Einer überspringt das Bauen, der andere überspringt das Laufen. Wenn Sie beide möchten, verwenden Sie beide.
Elliott Frisch
1
Können Sie Details zum Fehler angeben - die Fehlermeldung oder die Stapelverfolgung?
Raghuram
1
Warum verwenden Sie so eine ältere Maven - Version , die sich bereits EoL definiert .
Khmarbaise
1
Stimmt es also wirklich, dass ich alles, was mit Tests zu tun hat, vollständig überspringen muss -Dmaven.test.skip=true -DskipTests? Das eine oder andere kann manchmal weggelassen werden, abhängig von den Umständen, aber wer möchte darüber nachdenken ..
Landon Kuhn

Antworten:

120

Wie Sie bereits bemerkt haben, wird das -Dmaven.test.skip=trueKompilieren der Tests übersprungen. Genauer gesagt wird das Erstellen der Testartefakte übersprungen. Bei großen Projekten ist es üblich, Testdienstprogramme und Basisklassen für Module im selben Projekt gemeinsam zu nutzen.

Dies wird erreicht, indem für ein Modul test-jarein zuvor erstelltes Modul erforderlich ist :

<dependency>
  <groupId>org.myproject.mygroup</groupId>
  <artifactId>common</artifactId>
  <version>1.0</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

Wenn -Dmaven.test.skip=true(oder einfach -Dmaven.test.skip) angegeben wird, werden die test-jars nicht erstellt, und jedes Modul, das sich auf sie stützt, schlägt fehl.

Im Gegensatz dazu , wenn Sie verwenden -DskipTests, wird Maven nicht laufen die Tests, aber es ihnen nicht kompiliert und den Test-jar zu bauen, ist es für die nachfolgenden Module machen.

Mureinik
quelle
2
Wie kann man dieses Problem lösen? Verwenden Sie als meinen Online-Maven-Befehl -Dmaven.test.skip.
Neptun
2
@neptune welches Problem? Wenn Sie eine neue Frage haben, verwenden Sie bitte einen neuen Beitrag, um sie zu stellen.
Mureinik
58

Ich hatte einige Abhängigkeiten mit den Tests, um das Paket zu erstellen.

Mit dem folgenden Befehl kann die Notwendigkeit des Testartefakts außer Kraft gesetzt werden, um das Ziel zu erreichen:

mvn -DskipTests=true  package
Gilwo
quelle
29

Es gibt einen Unterschied zwischen den einzelnen Parametern.

  • Die Phase -DskipTests überspringt die Ausführung der Testphase. Am Ende dieses Prozesses werden Ihre Tests kompiliert.

  • Die Phase -Dmaven.test.skip = true überspringt das Kompilieren und Ausführen von Tests.

Da der Parameter -Dmaven.test.skip = true beim Kompilieren überspringt, verfügen Sie nicht über das Testartefakt.

Weitere Informationen finden Sie in der Surfire-Dokumentation: http://maven.apache.org/plugins-archives/maven-surefire-plugin-2.12.4/examples/skipping-test.html

Dennys Fredericci
quelle
15

Ich kann Ihnen ein Beispiel geben, das zum gleichen Problem führt, aber möglicherweise keine Antwort auf Ihre Frage. (Außerdem verwende ich in diesem Beispiel mein Maven 3-Wissen, das möglicherweise nicht für Maven 2 gilt.)

In einem Multi-Modul - Maven - Projekt (enthält Module Aund B, wo Babhängig von A), können Sie auch eine hinzufügen Test Abhängigkeit auf Aaus B.

Diese Abhängigkeit kann wie folgt aussehen:

<dependency>
     <groupId>com.foo</groupId>
     <artifactId>A</artifactId>
     <type>test-jar</type> <!-- I'm not sure if there is such a thing in Maven 2, but there is definitely a way to achieve such dependency in Maven 2. -->
     <scope>test</scope>
</dependency>

(Weitere Informationen finden Sie unter https://maven.apache.org/guides/mini/guide-attached-tests.html. )
Beachten Sie, dass das Projekt ein Asekundäres Artefakt mit einem Klassifizierer erzeugt, testsin dem sich die Testklassen und Testressourcen befinden.

Wenn Sie Ihr Projekt mit erstellen -Dmaven.test.skip=true, wird ein Fehler bei der Abhängigkeitsauflösung angezeigt, solange das Testartefakt nicht in Ihrem lokalen Repo oder in externen Repositorys gefunden wurde. Der Grund ist, dass die Testklassen weder zusammengestellt noch das testsArtefakt hergestellt wurden.
Wenn Sie Ihren Build jedoch mit -DskipTestsIhrem testsArtefakt ausführen, wird er erstellt (obwohl die Tests nicht ausgeführt werden) und die Abhängigkeit wird aufgelöst.

Stepan Vavra
quelle
10

Um den Testfall während der Installation von maven clean zu überspringen, habe ich im folgenden Befehl den Parameter -DskipTests verwendet

mvn clean install -DskipTests

in Terminalfenster

Niraj Trivedi
quelle
9

Der Parameter -DskipTests funktioniert möglicherweise nicht, abhängig von Ihrer todsicheren Plugin-Version.

Sie können "-Dmaven.test.skip.exec" anstelle von "-DskipTests" verwenden.

Quelle: Surefire-Parameterdetails

vtsamis
quelle
1

Während der Maven-Kompilierung können Sie die Testausführung überspringen, indem Sie das folgende Plugin in pom.xml hinzufügen

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20.1</version>
    <configuration>
         <skipTests>true</skipTests>
    </configuration>
</plugin>
Radadiya Nikunj
quelle
1
Es überspringt Tests, selbst wenn Sie dies tunmvn test
Pratik Singhal