Frage

Ich möchte, dass meine Maven -Builds die meisten Unit -Tests durchführen. Aber es gibt Unit -Tests in einem Projekt, die langsamer sind und ich möchte sie im Allgemeinen ausschließen. und schalten Sie sie gelegentlich ein.

Frage: Wie mache ich das?

ich weiss Bescheid -Dmaven.test.skip=true, Aber das macht alle Einheitstests aus.

Ich weiß auch über das Überspringen von Integrationstests, beschrieben, hier. Aber ich habe keine Integrationstests, nur Unit-Tests, und ich habe keine expliziten Anrufe beim Maven-Surefire-Plugin. (Ich verwende Maven 2 mit dem Eclipse-Maven-Plugin).

War es hilfreich?

Lösung

Was ist mit Überspringen von Tests nur in diesem Modul?

In der pom.xml dieses Moduls:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.4.2</version>
        <configuration>
          <skipTests>true</skipTests>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

Schließlich können Sie ein Profil erstellen, das die Tests deaktiviert (immer noch die pom.xml des Moduls):

<project>
  [...]
  <profiles>
    <profile>
      <id>noTest</id>
      <activation>
        <property>
          <name>noTest</name>
          <value>true</value>
        </property>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.4.2</version>
            <configuration>
              <skipTests>true</skipTests>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
  [...]
</project>

Mit der letzteren Lösung, wenn Sie laufen mvn clean package, Es wird alle Tests durchführen. Wenn du läufst mvn clean package -DnoTest=true, Es wird die Tests für dieses Modul nicht ausführen.

Andere Tipps

Ich denke, das ist einfacher und hat auch den Vorteil, dass sie für Nicht-Versicherungstests (in meinem Fall Flexunittests) arbeiten.

<profile>
   <id>noTest</id>
    <properties>
       <maven.test.skip>true</maven.test.skip>
    </properties>
 </profile>

Wenn Sie ein großes Multi-Modul-Projekt haben und Tests nur in bestimmten Modulen überspringen möchten, ohne dass jedes Modul geändert werden muss pom.xml Datei mit benutzerdefinierter Konfiguration und Profilerstellung können Sie dem übergeordneten Folgendes hinzufügen pom.xml Datei:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.12</version>
            <executions>
                <execution>
                    <id>regex-property</id>
                    <goals>
                        <goal>regex-property</goal>
                    </goals>
                    <configuration>
                        <name>maven.test.skip</name>
                        <value>${project.artifactId}</value>
                        <regex>(module1)|(module3)</regex>
                        <replacement>true</replacement>
                        <failIfNoMatch>false</failIfNoMatch>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<modules>
    <module>module1</module>
    <module>module2</module>
    <module>module3</module>
</modules>

Danke an die build-helper-maven-plugin Sie würden tatsächlich dynamisch prüfen, ob Sie sich in einem bestimmten Modul befinden oder nicht während des Builds, über die project.artifactId Eigentum (auf jeden zeigen artifactId Das Modul während des Builds) würde der Regex dann nach bestimmten Werten eine Übereinstimmung suchen (die Modulnamen, für die Sie Tests überspringen möchten) und die Bevölkerung der Populationen maven.test.skip Eigentum entsprechend (festlegen true).

In diesem Fall werden Tests übersprungen für module1 und module3 Während des richtigen Laufens für module2, das ist, wie der Regex ausgedrückt.

Der Vorteil dieses Ansatzes besteht darin, ihn dynamisch und zentralisiert zu haben (im Elternteil pom.xml) Daher besser für die Wartung: Sie können Module jederzeit hinzufügen oder entfernen, indem Sie einfach die einfache Regex oben ändern.

Wenn dies nicht das Standardverhalten des Builds (empfohlener Fall) ist, können Sie das Snippet immer in a einwickeln Maven -Profil.


Sie können auch weiter gehen und dynamisches Verhalten basierend auf Ihrer Eingabe haben:

<properties>
    <test.regex>none</test.regex>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.12</version>
            <executions>
                <execution>
                    <id>regex-property</id>
                    <goals>
                        <goal>regex-property</goal>
                    </goals>
                    <configuration>
                        <name>maven.test.skip</name>
                        <value>${project.artifactId}</value>
                        <regex>${test.regex}</regex>
                        <replacement>true</replacement>
                        <failIfNoMatch>false</failIfNoMatch>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Hier ersetzen wir den Regex -Wert tatsächlich durch eine Eigenschaft. test.regex, mit Standardwert zu none (oder was auch immer nicht mit einem Modulnamen übereinstimmt, oder auch die Standardüberspring -Übereinstimmungen).

Dann könnten wir von der Befehlszeile haben

mvn clean test -Dtest.regex="(module1)" > will skip tests only for module1
mvn clean test -Dtest.regex="(module1)|(module2)" > will skip tests on module1 and module2
mvn clean test -Dtest.regex="(module1)|(module2)|(module3)" > will skip the three module tests
mvn clean test -Dtest.regex=".+" > will skip all module tests
mvn clean test > would not skip anything (or fall back on default behavior)

Das heißt, dann entscheiden Sie sich zur Laufzeit, ohne dass es erforderlich ist, die zu ändern pom.xml Datei oder Aktivierung eines Profils.

Ich hatte einen etwas anderen Bedarf als diese Frage, die sich als hilfreich erweisen könnte. Ich wollte einige verschiedene Tests aus verschiedenen Paketen aus der Befehlszeile ausschließen, sodass eine einzelne Wildcard es nicht tun würde.

Ich habe im Maven fehlgeschlagene Dokumentationsregeln für Ausschlüsse gefunden, dass Sie eine von Kommas getrennte Liste von Regex- oder Wildcard-Ausschlüssen angeben können:https://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html

Also sah meine Pomfile so aus:

<excludes>
    <exclude>${exclude.slow.tests}</exclude>
</excludes>

Und meine Befehlszeile enthielt Folgendes:

mvn install "-Dexclude.slow.tests=**/SlowTest1.java, **/package/ofslowtests/*.java, **/OtherSlowTest.java"

Für mich bestand die wichtigste Zutat darin, eine Reihe von Tests in eine Maven -Immobilie in einer einzigen Ausnahmeerklärung zu bekommen.

Mit Surefire Plugin 2.19 können Sie einfach die Tests ausschließen, die Sie nicht mit regulären Ausdrücken möchten:

mvn '-Dtest=!%regex[.*excludedString.*]' test

Der obige Befehl schließt alle Tests aus, die enthalten ausgeschlossen.

NB1 Wenn die doppelte Zitatmarke (") anstelle von Apostroph (') verwendet wird, wird der Befehl nicht ordnungsgemäß interpretiert und führt zu unerwarteten Ergebnissen (getestet mit BASH 3.2.57)

NB2 Besondere Aufmerksamkeit sollte auf Projekte gelegt werden, bei denen mehrere Versionen des Todesfire -Plugins verwendet werden. Versionen von Todesfire älter als 2.19 führen keine Tests aus, da sie keine regulären Ausdrücke unterstützen.

Versionsverwaltung (es könnte eine gute Idee sein, dies in der übergeordneten POM -Datei hinzuzufügen):

<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.19.1</version>
      </plugin>
    </plugins>
  </pluginManagement>
</build>

Beispiele für Build -Befehle, die Tests überspringen: https://artbcode.wordpress.com/2016/11/28/how-to-skip-a-subset-of-the-unit-tests/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top