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


157

SureFireプラグインを使用してユニットテストを実行するMavenビルドと、FailSafeプラグインを使用して統合テストを実行するMavenビルドがあります。FailSafeプラグインのテストのみを実行する方法を教えてください。

それはマルチモジュールビルドであり、すべてのモジュールのpomを編集する必要がないので、pomにさまざまなプロファイルや何かを追加することは、私にとって良い解決策ではありません。

あるskip.testsmaven.test.skipしてskipTestsいるストップすべてのテスト、およびskipITs、唯一のフェイルセーフプラグインを停止しています。

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


試しましたmaven.test.skipskipTests
トーマス

1
理論的には@khmarbaiseです。しかし、私が取り組んだほとんどのプロジェクトでは、実際にインメモリデータベースとの統合テスト(運が良ければ)である「ユニットテスト」
Sean Patrick Floyd

9
@khmarbaiseたくさんの単体テスト。実行には数分かかり、このような状況で実行する必要はありません。具体的には、アーティファクトを構築する前に単体テストを実行しますが(もちろん)、ITを複数の環境で実行したいと考えています。この時点で単体テストを再実行しても意味がありません。
マシューギリアード

2
こんにちは@khmarbaise、私のセットアップでskipTestsは、確実なテストのみをスキップし、フェイルセーフテストはスキップします!多分それは新機能ですか?
danidemi

2
FYI:skipTestsはFailsafe Plugin 3.0.0-M3(SUREFIRE-1611)で非推奨になりました
Guillaume Husta

回答:


171

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を実際に失敗させるために必要な目標も実行します

これにより、テストをスキップする必要があることを指定するために使用されるプロパティが再定義されるため、canonicalを指定した場合-DskipTests=true、surefireはそれを無視しますが、フェイルセーフはそれを尊重します。これは、特にそのフラグをすでに指定している既存のビルド/ユーザーがいる場合、予期しない可能性があります。簡単な回避策がデフォルトになるように思われるskip.surefire.testsの値にskipTestsあなたの中に<properties>ポンポンのセクション:

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

必要に応じて、skip.failsafe.testsフェイルセーフのために呼び出される類似のパラメーターを提供できますが、私はそれが必要だとは思いませんでした-単体テストは通常​​、早い段階で実行され、統合テストではなく単体テストを実行したい場合は、実行しますtest代わりの相verify相。あなたの経験は変わるかもしれません!

これらのskip.(surefire|failsafe).testsプロパティは確実に確実にフェイルセーフコード自体に統合する必要がありますが、「わずかな違いを除いてまったく同じプラグイン」の精神にどれほど違反するかはわかりません。


4
このソリューションを使用して、フレームワークをセットアップして、-DskipUnitTestsがsurefireプラグインをスキップし、-DskipIntegrationTestsがフェイルセーフプラグインをスキップし、DskipTestsが両方をスキップできるようにしました。まさに必要なもの!
Alex Jansen

2
私のIDEが文句を言っている「ことはできません解決シンボル『skipTests』」ソリューションは、行を追加することでした<skipTests>false</skipTests>、まだコマンドライン引数は、上書きのプロパティのように見えるよう-DskipTestsまたは-Dskip.surefire.testsの任意の組み合わせで動作しますstackoverflow.com/questions/13708738 /…それをソリューションに追加したいかもしれません
globalworming

<skipTests>${skip.surefire.tests}</skipTests>maven-surefire-pluginバージョンで動作していません3.0.0-M3。すべての確実なテストがまだ実行されています。他の誰かがこれを見つけましたか?しかしながら、ショーン・パトリック・フロイドの以下の解決策は機能しています。
John Meyer

120

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

mvn clean test-compile failsafe:integration-test

確かに、これは醜いですが、問題を解決できるかもしれません。


または(別のハック):

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

参照:


1
2番目の提案は私にとってうまくいきました。統合前テストが正常に呼び出されました
Lawrence Tierney 2013

7
これは良い考えですか?統合テストが失敗しても、ビルドは成功しませんか?「検証」ゴール実行しない場合それがフェイルセーフの本質です。引用:「フェイルセーフプラグインは、統合テストフェーズ中にビルドに失敗しません」。検証テストを実行して、統合テストが成功したかどうかを実際に通知する必要があります。
bacar

2
@bacarは正しいですが、2番目のソリューションのverify代わりに使用するだけintegration-testです。
マシューギリアード2013

1
はるかに優れた解決策として、実際には@bacarの回答を参照してください。
FBB 2013年

12
failsafe:verify最初のハック(mvn clean test-compile failsafe:integration-test failsafe:verify)の最後に追加すると、統合テストの1つが失敗した場合にビルドが失敗します。
シャドウマン

73

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

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

-DskipUTs=true 確実なテストをスキップするため。

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

2
ありがとう、すばらしいアプローチ!:参照確実な(デフォルト検定)のデフォルトの実行を無効にすることも有用stackoverflow.com/questions/11935181/...
plsは

1
これが、下にスクロールして、必要なすべての情報を含む優れたソリューションを探す必要がある場合がある理由です。共有してくれてありがとう
Atul Chaudhary 2018年

本当に素晴らしいソリューションです。ただし、フェールセーフ構成skipITsは、デフォルトのように冗長です。
timomeinen

SkipITsは、この構成のカスタムオプションです。デフォルトの実装では問題ありませんが、それはOPの質問ではありませんでした。
Martijn Burger

称賛、あなたはメイブンの第一人者です!これはmavenスーパーポムにあるはずです。
アダム

22

お役に立てれば!

FailSafeでのみテストを実行してみてください(統合テスト用のプラグイン-デフォルトでは、次のような名前の統合テストのみを実行できます:* / IT .java、** / IT.java、* /*ITCase.java ;、しかし、あなたはそれをpomファイルから簡単に変更できます)

mvn failsafe:integration-test

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

mvn surefire:test

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

mvn -Dtest=MyUnitlTest

9

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

 mvn -Dtest=foo -DfailIfNoTests=false verify

1
これが最も簡単な(正直なところ最も優れた)ソリューションです。
Titulum

OPが要求したとおりにpomに何かを追加する必要はなく、指示どおりにすべてのフェーズを実行します。素晴らしい答え。
jnichols959

1

@danidemiと@GuillaumeHustaからのコメントを拡張するには:

参考:skipTestsはFailsafe Plugin 3.0.0-M3(SUREFIRE-1611)で非推奨になりました)で

したがって、統合テストではなく単体テストをスキップするには、Failsafeプラグインの最新バージョンを使用している場合にこれを実行できます。

mvn verify -DskipTests

(これがあなたを助けるなら、言及されたコメントに賛成票を与えてください)


-3

統合テストまたは単体テストを別のプロファイルで実行してみてください。次に、プロファイルを有効/無効にすることができます。


ITのみを実行するプロファイルを定義する親pomを追加しますか?すべてのプロジェクトサブモジュールはそのpomから継承できるため、すべてのpomを変更したり、特別なスイッチを使用してモジュールを実行したりする必要はありません(プロパティの不在時にプロファイルをアクティブ化できるため)。
yoosiba
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.