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.


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.


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

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


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.


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


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


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>

1
Es überspringt Tests, selbst wenn Sie dies tunmvn test
Pratik Singhal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.