web-dev-qa-db-ja.com

Mavenの一部のモジュールのテストをスキップする

Mavenビルドでほとんどの単体テストを実行したいと思います。しかし、1つのプロジェクトにはユニットテストがあり、速度が遅いため、通常はそれらを除外します。時々それらをオンにします。

質問:どうすればいいですか?

-Dmaven.test.skip=true、しかしそれはすべての単体テストをオフにします。

here で説明されている統合テストのスキップについても知っています。しかし、統合テストはなく、単体テストだけでなく、maven-surefire-pluginの明示的な呼び出しもありません。 (私はEclipse-MavenプラグインでMaven 2を使用しています)。

64
Joshua Fox

このモジュールでのみテストをスキップするのはどうですか?

このモジュールのpom.xmlで:

<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>

最終的に、テストを無効にするプロファイルを作成できます(モジュールのpom.xmlを引き続き使用):

<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>

後者のソリューションでは、mvn clean package、すべてのテストを実行します。 mvn clean package -DnoTest=true、このモジュールのテストは実行されません。

75
Romain Linsolas

これは簡単だと思います。また、非保証型テスト(私の場合はFlexUnitTests)で作業するメリットもあります。

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

大規模なマルチモジュールプロジェクトがあり、特定のモジュールでのみテストをスキップし、各モジュールのpom.xmlファイルをカスタム構成とプロファイリングで変更する必要がない場合、親pom.xmlファイルに次を追加できます。

<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>

build-helper-maven-pluginのおかげで、ビルド中に特定のモジュールにいるかどうかを実際に動的に確認し、project.artifactIdプロパティ(ビルド中に各artifactIdモジュールを指す)を介して、正規表現は特定のモジュールを探します値(テストをスキップするモジュール名)およびそれに応じてmaven.test.skipプロパティを設定しました(trueに設定)。

この場合、テストはmodule1およびmodule3に対してスキップされますが、module2に対して適切に実行されます。つまり、正規表現で表されます。

このアプローチの利点は、動的で(親pom.xmlで)集中化することです。したがって、メンテナンスに優れています。上記の単純な正規表現を変更するだけで、いつでもモジュールを追加または削除できます。

明らかに、これがビルドのデフォルトの動作でない場合(推奨ケース)、上記のスニペットを常に mavenプロファイル でラップできます。


さらに進んで、入力に基づいて動的な動作を行うこともできます。

<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>

ここでは、実際に正規表現値をプロパティtest.regexで置き換え、デフォルト値はnone(または、モジュール名に一致しないもの、またはデフォルトのスキップ一致が必要なもの)に置き換えています。

次に、コマンドラインから

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)

つまり、実行時に、pom.xmlファイルを変更したり、プロファイルをアクティブにしたりする必要はありません。

5
A_Di-Matteo

Surefireプラグイン2.19を使用すると、正規表現を使用して不要なテストを簡単に除外できます。

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

上記のコマンドは、excludedStringを含むすべてのテストを除外します。

NB1アポストロフィ( ')の代わりに二重引用符( ")を使用すると、コマンドは正しく解釈されず、予期しない結果が生成されます。 bash 3.2.57)

NB2複数のバージョンのsurefireプラグインが使用されているプロジェクトには特に注意を払う必要があります。 2.19より古いバージョンのsurefireは、正規表現をサポートしていないため、テストを実行しません。

バージョン管理(これを親pomファイルに追加することをお勧めします):

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

テストをスキップするビルドコマンドの例: https://artbcode.wordpress.com/2016/11/28/how-to-skip-a-subset-of-the-unit-tests/

2
artBCode

この質問とは少し異なるニーズがあり、役に立つかもしれません。パッケージごとにいくつかの異なるテストをコマンドラインから除外したいので、単一のワイルドカードでは除外できません。

除外に関するMaven Failsafeのドキュメントルールで、正規表現またはワイルドカードの除外のコンマ区切りリストを指定できることがわかりました: https://maven.Apache.org/surefire/maven-failsafe-plugin/examples/ lusion-exclusion.html

したがって、pomfileは次のようになりました。

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

私のコマンドラインにはこれが含まれていました:

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

私にとって重要な要素は、1つのexcludeステートメントで多数のテストを1つのmavenプロパティに入れることでした。

2
Austin