it-swarm.com.de

Wie kann ich Tests in maven install goal überspringen, während ich sie in maven test goal ausführe?

Ich habe ein Multi-Modul-Maven-Projekt mit sowohl Integration als auch Unit-Tests im selben Ordner (src/test/Java). Integrationstests sind mit @Category(IntegrationTest.class) gekennzeichnet. Ich möchte mit folgendem Setup enden:

  1. Wenn ich mvn install Ausführe, sollen alle Tests kompiliert, aber keine ausgeführt werden.
  2. Wenn ich mvn test Ausführe, sollen alle Tests kompiliert werden, aber nur Komponententests ausgeführt werden.
  3. Wenn ich mvn integration-test Ausführe, möchte ich alle Tests kompilieren und ausführen.

Der wichtige Punkt ist, dass ich dies im pom.xml Ohne zusätzliche Befehlszeilenargumente konfigurieren möchte.

Derzeit habe ich in meiner übergeordneten Datei pom.xml das folgende Setup gefunden, bei dem das einzige Problem die Nummer 1 ist, bei der alle Tests ausgeführt werden:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${project.Java.version}</source>
                    <target>${project.Java.version}</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.14.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.Apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>2.14.1</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <includes>
                        <include>**/*.class</include>
                    </includes>
                    <excludedGroups>cz.cuni.xrg.intlib.commons.IntegrationTest</excludedGroups>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.14.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.Apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>2.14.1</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <groups>cz.cuni.xrg.intlib.commons.IntegrationTest</groups>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                        <configuration>
                            <includes>
                                <include>**/*.class</include>
                            </includes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

Alle untergeordneten Module haben die folgende Plugin-Konfiguration in ihrer pom.xml, die meines Erachtens von der übergeordneten pom erben sollte:

<build> 
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>

        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Ich habe versucht, <skipTests>true</skipTests> Zu verwenden, aber es deaktiviert die Testausführung für alle Ziele, was nicht das ist, was ich will (verstößt gegen # 2 und # 3). Es ist auch ziemlich seltsam, dass mvn test Die Option skipTests=true Auszeichnet ... warum sollte ich sie überhaupt ausführen?

Nachdem ich stundenlang gegoogelt und verschiedene Kombinationen ausprobiert habe, zögere ich, ob es überhaupt möglich ist, Tests nicht in mvn install Auszuführen, während sie gleichzeitig in mvn test Ausgeführt werden. Ich hoffe jemand beweist das falsch. ;)

Ich bin auch bereit, eine Lösung zu akzeptieren, bei der mvn install Nur Komponententests ausführt, aber ich denke, das macht keinen großen Unterschied.

55
thegeko

Es hört sich so an, als hätten Sie das Konzept des Build-Lebenszyklus in Maven nicht verstanden. Wenn Sie mvn install Ausführen, werden alle Lebenszyklusphasen (einschließlich der install -Phase selbst) vor der Installationsphase ausgeführt. Dies bedeutet, dass die folgenden Phasen ausgeführt werden:

  1. bestätigen
  2. initialisieren
  3. erzeugungsquellen
  4. prozessquellen
  5. ressourcen generieren
  6. prozessressourcen
  7. kompilieren
  8. prozessklassen
  9. testquellen generieren
  10. prozess-Test-Quellen
  11. testressourcen generieren
  12. prozess-Test-Ressourcen
  13. test kompilieren
  14. prozess-Test-Klassen
  15. prüfung
  16. vorbereitungspaket
  17. paket
  18. pre-Integration-Test
  19. integrationstest
  20. post-Integration-Test
  21. überprüfen
  22. installieren

das heißt, die Lebenszyklusphasen test sowie integration-test sind enthalten. Ohne zusätzliche Informationen ist es daher nicht möglich, das Verhalten nach Belieben zu ändern.

Dies könnte durch die Verwendung eines Profils in Maven erreicht werden:

 <project>
  [...]
  <profiles>
    <profile>
      <id>no-unit-tests</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
              <skipTests>true</skipTests>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
  [...]
</project>

Also Ihre erste Anforderung:

  1. Wenn ich mvn install Ausführe, sollen alle Tests kompiliert, aber keine ausgeführt werden.

kann unter Verwendung der folgenden erreicht werden:

mvn -Pno-unit-test test
  1. Wenn ich mvn test Ausführe, sollen alle Tests kompiliert werden, aber nur Komponententests ausgeführt werden.

Dies kann einfach durch Verwendung des einfachen Aufrufs erreicht werden:

mvn test

weil die Phase der Integrationstests nicht ausgeführt wird (siehe Build-Lebenszyklus).

  1. Wenn ich mvn integration-test Ausführe, möchte ich alle Tests kompilieren und ausführen.

Dies bedeutet, dass die Standard-Phase ausgeführt wird, in der die test -Phase ausgeführt wird, in der die Komponententests (Maven-Surefire-Plugin) ausgeführt werden, und außerdem der Integrationstest, der vom Maven-Fail-Safe-Plugin verarbeitet wird. Beachten Sie jedoch, dass Sie zum Aufrufen der Integrationstests den folgenden Befehl verwenden sollten:

mvn verify

stattdessen haben Sie bei Ihrem vorherigen Anruf die Phase post-integration-test verpasst.

Abgesehen von den oben genannten sollten Sie die Namenskonventionen für Unit- und Integrationstests befolgen, wobei nit-Tests wie folgt benannt werden sollte:

<includes>
 <include>**/*Test*.Java</include>
 <include>**/*Test.Java</include>
 <include>**/*TestCase.Java</include>
</includes>

und Integrationstests sollte wie folgt benannt werden:

<includes>
 <include>**/IT*.Java</include>
 <include>**/*IT.Java</include>
 <include>**/*ITCase.Java</include>
</includes>

Ich hoffe, Sie haben das maven-failsafe-Plugin wie folgt konfiguriert, um das maven-failsafe-Plugin an die richtigen Lebenszyklusphasen zu binden:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.15</version>
        <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

wie Sie es richtig gemacht haben, aber Sie sollten beachten, dass die include -Tags im Quellcode (. Java) und nicht in der kompilierten Namen (. Klasse funktionieren. Ich würde die Kategorie-Annotation nicht verwenden, nur die Verwendung der Namenskonventionen macht den POM einfacher und kürzer.

91
khmarbaise

Laut der Failsafe Plugin Dokumentation

mvn install -DskipITs

ist was du willst.

49
gli00001

Was OP in seiner Frage gesagt hat:

Wenn ich mvn install ausführe, sollen alle Tests kompiliert werden, aber ich möchte keine ausführen.
Wenn ich mvn test ausführe, sollen alle Tests kompiliert, aber nur Komponententests ausgeführt werden.
Wenn ich mvn integration-test ausführe, möchte ich alle Tests kompilieren und ausführen.

ist absolut gültig und extrem einfach zu erreichen.
EDIT: außer der ersten Bedingung, die gegen die Maven-Natur wirkt. Der beste Weg wäre hier einfach mvn install -DskipTests

Alles was Sie brauchen, ist das folgende Snippet in pom.xml:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.17</version>
    <executions>
        <execution>
            <id>integration-tests</id>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

und bei Unit- und Integrationstests die Maven-Namenskonventionen einhalten (wie bereits @khmarbaise angegeben). Nennen Sie Ihre Integrationstests im Allgemeinen mit dem Suffix IT (zum Beispiel MyIntegrationTestIT.Java) Und lassen Sie maven-failsafe Seine Aufgabe erledigen.
Auf diese Weise benötigen Sie nicht einmal JUnit-Kategorien (obwohl diese manchmal recht nützlich sein können).

Das ist es :)

  • mvn test Führt nur Unit-Tests aus
  • mvn integration-test Führt alle Tests aus
  • mvn failsafe:integration-test Führt nur Integrationstests aus
  • mvn clean verify Wenn Sie sicher sein möchten, dass das gesamte Projekt funktioniert


Einige persönliche Ratschläge

Wenn Sie Integrationstests von Komponententests trennen, können Sie problemlos alle Tests in einem Paket in Ihrer IDE ausführen. Normalerweise wird für diesen Zweck ein zusätzliches Verzeichnis namens test-integration (Oder integrationtest) verwendet.
Dies ist auch mit maven leicht zu erreichen:

<plugin>
    <!-- adding second test source directory (just for integration tests) -->
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.9.1</version>
    <executions>
        <execution>
            <id>add-integration-test-source</id>
            <phase>generate-test-sources</phase>
            <goals>
                <goal>add-test-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>src/test-integration/Java</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

Verschieben Sie dann Ihre Integrationstests in dieses Verzeichnis. Es sollte so aussehen:

src
   main
   test
   test-integration

Integrationstests benötigen normalerweise mehr Speicher:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    ...
    <configuration>
        <argLine>-Xmx512m -XX:MaxPermSize=256m</argLine>
    </configuration>
</plugin>
16
G. Demecki

Dieser Beitrag erklärt, wie Integrationstests übersprungen werden, unabhängig davon, welches Plugin Sie für diese Tests verwenden.

Grundsätzlich müssen Sie ein Profil definieren und all Ihren XML-Code für Integrationstests in dieses Profil einfügen. Als Sie es aktivieren, wenn eine Eigenschaft -DskipIntegrationTests wird vermisst.

Sie können dasselbe für Komponententests tun: Schreiben Sie ein Profil und aktivieren Sie es, wenn -DskipUnitTests wird vermisst.

Dann könnten Sie tun:

mvn install -DskipIntegrationTests -DskipUnitTests # (runs install without any tests)
mvn test # (runs unit tests)
mvn post-integration-test # (runs all tests)
12
Emil Salageanu

Das maven-failsafe-plugin docs hat einen Abschnitt mit dem Titel "Standardmäßig überspringen".

Leider funktionieren die auf dieser Seite beschriebenen Schritte nicht so, wie sie geschrieben wurden. Eine geringfügige Änderung dieser Schritte führt jedoch dazu, dass Folgendes funktioniert:

Im Abschnitt properties von pom.xml, füge das hinzu:

<skipITs>true</skipITs>

Fügen Sie dann die Eigenschaft skipTests zum Abschnitt plugin des maven-failsafe-Plugins hinzu:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <configuration>
        <skipTests>${skipITs}</skipTests>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Also jetzt, ein mvn install führt standardmäßig Komponententests aus, jedoch keine Integrationstests.

Aber ein mvn install -DskipITs=false führt sowohl Unit-Tests als auch Integrationstests durch.

Fußnote: Schlechte Dokumentation spielte eine große Rolle dafür, warum Maven so lange nicht gemocht hat.

4
rdguam

mvn test-compile Macht genau das, wonach Sie suchen. Sie können einfach mvn install Durch mvn test-compile Ersetzen und schon sind Sie fertig. Die POM-Datei muss nicht angepasst werden. Die unten verlinkte Frage ist ähnlich wie bei # 1:

Maven - Wie kompiliere ich Tests, ohne sie auszuführen?

mvn test-compile Sollte als beste Antwort akzeptiert werden, da Maven genau das unterstützt, was Sie von Haus aus und ohne Magie tun möchten. Sie würden am Ende mit diesem:

If I run mvn test-compile, I want all tests to compile, but I do not want to execute any.
If I run mvn test, I want all tests to compile, but execute only unit tests.
If I run mvn integration-test, I want to compile and execute all tests.
2
Ferg

Geben Sie die Ausführungsschritte nicht in der Konfiguration des fehlersicheren Plugins an. Z.B.

    <plugins>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>3.0.0-M3</version>
        </plugin>
    </plugins>

Jetzt müssen Sie speziell mvn failsafe aufrufen: integration-test, um die Integrationstests auszuführen; Sie werden in anderen MVN-Zielen übersprungen.

0
guymac