2009-04-21 16 views
54

私のMavenビルドでは、ほとんどの単体テストを実行したいと思います。しかし、1つのプロジェクトでは単体テストがあり、遅くなり、一般的に除外したいと考えています。時折それらをオンにします。Mavenの一部のモジュールでのテストのスキップ

質問:私はこれをどのように行うのですか?

私は約-Dmaven.test.skip=trueを知っているが、それはすべてのユニットテストをオフにします。私はまた、統合テストをスキップについて知っ

は、hereを説明しました。しかし、私は統合テスト、単体テストしか持っていませんし、maven-surefire-pluginへの明示的な呼び出しもありません。 (私はEclipse-MavenプラグインでMaven 2を使用しています)。

答えて

63

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

:結局

<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)を無効にしますプロファイルを作成することができます。このモジュールののpom.xmlで

後者の解決方法では、 mvn clean packageを実行すると、すべてのテストが実行されます。 mvn clean package -DnoTest=trueを実行すると、このモジュールのテストは実行されません。あなたが大規模なマルチモジュールプロジェクトを持っている、あなたがしたい場合

+1

ありがとうございました。最初のコードスニペットはテストをスキップします。私は後で別のプロファイルを定義するためにあなたのさらなる提案を使用するかもしれません。 私の混乱は、私のポンが暗黙のうちに確実に呼びかけているという事実にありました。私のpom.xmlに確実なプラグインの言及はありませんでした。それにもかかわらず、surefireプラグインを正しく設定するためのコードは、そうしました。 –

+0

他にも、ビルドと検証を行うまで、モジュール全体をスキップすることもできます:http://stackoverflow.com/a/5542779/543935 – yellavon

+0

ここでは、テストを実行するMavenプロファイルを作成する方法を示しますそれはアクティブになっています:http://stackoverflow.com/questions/34334257/why-maven-runs-profile-plugin-even-if-profile-is-not-activated/41808680#41808680 – Vadzim

27

私は

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

-DnoTest = trueの有無にかかわらずここでテストをスキップしません。 – rwst

+4

-DnoTest = trueの代わりに-PnoTestを使用する必要があります。 –

+1

maven.test.skipをtrueに設定すると、テストコンパイルをスキップする効果があります。 skipTestsはまだテストをコンパイルしますが、テストは実行しません。 – CoverosGene

1

これが容易であり、また、(私の場合は、FlexUnitTests)非確実なテストのために働くの利点を持っていると思いますあなたは、実際のだろうbuild-helper-maven-plugin

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

ありがとう:カスタム設定とプロファイリングとモジュールpom.xmlファイルのそれぞれを変更することなく、唯一の特定のモジュールでテストをスキップするには、親pom.xmlファイルに以下を追加することができますビルド中にプロパティ(ビルド中に各artifactIdモジュールを指している)を介してビルド中に特定のモジュールにいるかどうかを動的にチェックすると、正規表現は特定の値(スキップするモジュール名テスト)、それに応じてmaven.test.skipプロパティを設定します(trueに設定)。

この場合、module2で正しく実行されている間、つまり正規表現のとおりに、module1module3のテストはスキップされます。

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

これは、ビルド(推奨ケース)のデフォルトの動作ではない場合、あなたは常にmaven profileで上記のスニペットをラップすることができます。


また、さらに行くと、あなたの入力に基づいて動的挙動を持つことができます:ここで

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

私たちが実際にnoneにデフォルト値で、test.regex、プロパティで正規表現の値を交換する(または何任意のモジュール名と一致しないか、またはデフォルトスキップマッチングが必要です)。

は次にコマンドラインから、私たちは、その後、実行時にあなたがpom.xmlファイルまたは任意のプロファイルをアクティブ化を変更する必要なしに、決定され

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) 

を持つことができます。あなたは単にあなたが正規表現を使用したくないテストを除外することができシュアプラグイン2.19を使用して

1

:上記のコマンドはexcludedStringが含まれているすべてのテストを除外します

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

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

NB1

NB2(bashの3.2.57を使用して試験) 2.13より古いバージョンの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.com/how-to-skip-a-subset-of-the-unit-tests/

+0

複数のパターンをスキップするにはどうすればよいですか? –

+0

'-Dtests'は確かにうまくいきません。すべての私のテストはスキップされます: 'mvn '-Dtest =!%regex [。* DeviceLogServiceTest。*]' --quiet install -Dsurefire.useFile = false -Dsurefire.printSummary = false -Dmaven.test.skip =偽 –

2

私は有用証明することがあり、この質問とは若干異なるニーズを持っていました。私はコマンドラインからいくつかの異なるパッケージからいくつかのテストを除外したかったので、ワイルドカード一つではできません。

私はあなたが正規表現またはワイルドカード除外のいずれかのカンマ区切りリストを指定することができ除外のためのMavenフェイルセーフのドキュメントの規則で見つかった:

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

:だから私のpomfileはこのように見えた https://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html

私のコマンドラインには次のものが含まれています:

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

私にとっては、重要な成分はたくさんのテス1つの除外ステートメントで1つのmavenプロパティーに変換します。

関連する問題