web-dev-qa-db-ja.com

単体テストを防ぐが、Mavenでの統合テストを許可する

SureFireプラグインを使用していくつかの単体テストを実行し、FailSafeプラグインを使用して統合テストを実行するMavenビルドを作成しました。 FailSafeプラグインのテストだけを実行する方法が欲しいです。

マルチモジュールビルドであり、すべてのモジュールのPOMを編集する必要がないため、POMに異なるプロファイルまたは何かを追加するのは良い解決策ではありません。

がある skip.testsおよびmaven.test.skipおよびskipTestsは停止allテスト、および skipITs は停止のみフェイルセーフプラグイン。

だから、skipITsのようなMaven用のコマンドラインフラグがありますが、代わりに「onlyITs」の機能がありますか?

130

Surefireテストのみをスキップする最も簡単な方法は、次のようにsurefire(を設定し、フェイルセーフ)を設定しないことです。

_<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.14</version>
    <configuration>
        <!-- skips surefire tests without skipping failsafe tests.
                 Property value seems to magically default to false -->
        <skipTests>${skip.surefire.tests}</skipTests>
    </configuration>
</plugin>
_

これにより、_mvn verify -Dskip.surefire.tests_を実行でき、フェイルセーフではなく確実なテストのみがスキップされます。また、統合前および統合後を含む他のすべての必要なフェーズを実行し、Mavenビルドを実際に失敗させるために必要なverifyゴールも実行します統合テストが失敗した場合。

これにより、テストをスキップするように指定するプロパティが再定義されるため、正規の_-DskipTests=true_を指定すると、surefireはそれを無視しますが、フェイルセーフはそれを尊重します。これは、特に既存のビルド/ユーザーがいる場合そのフラグを既に指定しています。簡単な回避策は、pomの_skip.surefire.tests_セクションで_<properties>_をskipTestsの値にデフォルト設定することです。

_<properties>
    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>
_

必要に応じて、フェイルセーフ用に_skip.failsafe.tests_という名前の類似のパラメーターを提供できますが、ユニットテストは通常​​前のフェーズで実行されるため、統合ではなくユニットテストを実行する必要があるため、必要ではありません。テストでは、testフェーズの代わりにverifyフェーズを実行します。あなたの経験は異なる場合があります!

これらのskip.(surefire|failsafe).testsプロパティは、おそらくsurefire/failsafeコード自体に統合されるべきですが、「それらは1つの小さな違いを除いてまったく同じプラグインです」という精神にどれだけ違反するかわかりません。

146
bacar

回避策は以下を呼び出すことです。

mvn clean test-compile failsafe:integration-test

確かに、これはisいですが、あなたの問題を解決するかもしれません。


または(別のハック):

mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false

参照:

108

Antonio Goncalves Blog のコードを使用していますが、これは完璧に機能します。

次のプロパティを使用できます。

-DskipUTs=true surefireテストをスキップします。

-DskipITs=trueフェイルセーフテストをスキップします。

-DskipTests=trueすべてのテストをスキップします。

pom.xml 以下のとおりであります:

<properties>
    <skipTests>false</skipTests>
    <skipITs>${skipTests}</skipITs>
    <skipUTs>${skipTests}</skipUTs>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <skipTests>${skipUTs}</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.19.1</version>
            <executions>
                <execution>
                    <id>run-integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>
            </configuration>
        </plugin>
    </plugins>
</build>
54
Martijn Burger

お役に立てれば!

FailSafeのみでテストを実行してみてください(integration-testのプラグイン-この種類の名前の統合テストのみをデフォルトで実行できます:* / IT。Java、**/IT.Java、*/* ITCase.Java;ですが、pomファイルから簡単に変更できます)

mvn failsafe:integration-test

また、SureFire(単体テスト用のプラグイン)のみを使用する場合

mvn surefire:test

または、一度に1つのテスト:

mvn -Dtest=MyUnitlTest
19
Kati Holasz

私はこれが好きなので、すべてのフェーズが通常実行されます:

 mvn -Dtest=foo -DfailIfNoTests=false verify
7
Jérôme Herry