Maven統合テストを実行するにはどうすればよいですか


170

私はMaven2をマルチモジュールプロジェクトを持っているし、私の子供のモジュールのそれぞれに私が命名されているのJUnitテストを持っているTest.javaIntegration.java、それぞれのユニットテストと統合テストのために。私が実行すると:

mvn test

*Test.java子モジュール内のすべてのJUnitテストが実行されます。実行すると

mvn test -Dtest=**/*Integration

Integration.java子モジュール内でテストが実行されることはありません。

これらはまったく同じコマンドのように見えますが、-Dtest = / * Integration **を使用したコマンドは機能しません。親レベルで実行されているテストが0件あり、テストはありません。


4
Kiefの答えは、Mavenで統合テストを定義するための現在の標準であるため、受け入れられるべきです。
heenenee 2015

回答:


110

単体テストと統合テストを別々に実行するようにMavenのSurefireを設定できます。標準の単体テストフェーズでは、統合テストとパターンマッチしないすべてのものを実行します。次に、統合テストのみを実行する2番目のテストフェーズ作成します。

次に例を示します。

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <excludes>
          <exclude>**/*IntegrationTest.java</exclude>
        </excludes>
      </configuration>
      <executions>
        <execution>
          <id>integration-test</id>
          <goals>
            <goal>test</goal>
          </goals>
          <phase>integration-test</phase>
          <configuration>
            <excludes>
              <exclude>none</exclude>
            </excludes>
            <includes>
              <include>**/*IntegrationTest.java</include>
            </includes>
          </configuration>
        </execution>
      </executions>
    </plugin>

1
私はあなたが言ったようにこれを構成し、実行時に* Integration.javaファイルではなく* Testのみが実行されます:mvn install私は* Test.javaをデフォルトとして実行する必要がありますが、私のナイトリービルドでは両方の* Testを実行する必要があります.javaおよび* Integration.java。mvn installを実行してから、各子サブディレクトリにcdして、mvn -Dtest = ** / * Integration testを実行する必要があります
Peter Delaney

66
統合テストには、Fail-Safeプラグインを使用してください。Sure-Fireプラグインではありません。統合のフェーズが完了するまで、ビルドは失敗しません。ビルドが失敗する前に、テストリソース(Webサーバーなど)を破棄することができます。したがって、フェイルセーフです。
ジョンゴードン

私にとって、統合前フェーズの一部として、突堤サーバーが起動します。最後のログ行は次のとおりです:[情報] Jettyサーバーを開始しました。その後は何も起こりません。動かなくなる。maven surefire failsafeプラグインはテストを実行せず、突堤サーバーも停止しません。何が間違っているのでしょうか?私はあなたが指定したものと同じ構成を使用しています。
Tarun Kumar

6
この回答は非常に古く、更新または削除する必要があります。
ザックトンプソン、

これで何か助けはありますか? stackoverflow.com/questions/48639730/...
のRohit Barnwal

250

Mavenのビルドのライフサイクルは、今、「テスト」フェーズ中に実行ユニットテストとは別に実行されている統合テストを、実行するための「統合テスト」段階を含んでいます。「パッケージ」の後に実行されるため、「mvn verify」、「mvn install」、または「mvn deploy」を実行すると、途中で統合テストが実行されます。

デフォルトでは、統合テストは、名前のテストクラスを実行し**/IT*.java**/*IT.java、と**/*ITCase.java、これは設定することができます。

これをすべて接続する方法の詳細については、FailsafeプラグインFailsafeの使用方法のページ(前のページから書いたように正しくリンクされていない)、およびこのSonatypeのブログ投稿を参照してください


1
@WillV正解。コードハウスの墓地。そしてmaven-failsafe-pluginは現在Apacheにあります。ごめんなさい。:)
Jin Kwon

38
デフォルトmvn integration-testではユニットテストも実行しますが(surefireを使用)mvn failsafe:integration-test、フェイルセーフ統合テストのみを実行します。
シャドウマン

22
信じられないほど、Failsafeプラグインのドキュメント、使用方法のページ、およびFAQは、* / IT .java、** / * IT.java、および** / * ITCase.java ... という名前のテストクラスを実行することについて言及していません
Henno Vermeulen

1
packageフェーズの後に実行される場合、それは私がすべてのIT Javaソースコードsrc/main/javasrc/test/java正しいのではなく下に置く必要があることを意味しますか?
Bruce Sun

5
@HennoVermeulenテストの名前についても混乱しました。これは、テストの包含と除外で説明されています。デフォルトをオーバーライドできるのは良いことですが、以前にデフォルトについて言及しているとよいでしょう。
Joshua Taylor

63

私はあなたがしたいことを正確に行いました、そしてそれは素晴らしい働きをします。ユニットテスト「* Tests」は常に実行され、「* IntegrationTests」はmvn verifyまたはmvn installを実行したときにのみ実行されます。ここにそれは私のPOMからのスニペットです。serg10は、ほぼ正しく機能していました。

  <plugin>
    <!-- Separates the unit tests from the integration tests. -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
       <!-- Skip the default running of this plug-in (or everything is run twice...see below) -->
       <skip>true</skip>
       <!-- Show 100% of the lines from the stack trace (doesn't work) -->
       <trimStackTrace>false</trimStackTrace>
    </configuration>
    <executions>
       <execution>
          <id>unit-tests</id>
          <phase>test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
                <!-- Never skip running the tests when the test phase is invoked -->
                <skip>false</skip>
             <includes>
                   <!-- Include unit tests within integration-test phase. -->
                <include>**/*Tests.java</include>
             </includes>
             <excludes>
               <!-- Exclude integration tests within (unit) test phase. -->
                <exclude>**/*IntegrationTests.java</exclude>
            </excludes>
          </configuration>
       </execution>
       <execution>
          <id>integration-tests</id>
          <phase>integration-test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
            <!-- Never skip running the tests when the integration-test phase is invoked -->
             <skip>false</skip>
             <includes>
               <!-- Include integration tests within integration-test phase. -->
               <include>**/*IntegrationTests.java</include>
             </includes>
          </configuration>
       </execution>
    </executions>
  </plugin>

幸運を!


まさに私がやろうとしたことですが、デフォルトをスキップしなかったので、統合テストはmvnテストフェーズ中に実行され続けました。テストの実行を設定すると、それが上書きされると思いました。あなたが説明したように、それは新しい実行を追加するだけです(したがってすべてが2回実行されます)。だから私にとってはスキップは欠けていた。+1この構成は100%の質問に答えるため
Nils Schmidt

2
次に、この応答が答えであるかどうかをチェックしてください。
HDave

私にとって、統合前フェーズの一部として、突堤サーバーが起動します。最後のログ行は次のとおりです:[情報] Jettyサーバーを開始しました。その後は何も起こりません。動かなくなる。maven surefire failsafeプラグインはテストを実行せず、突堤サーバーも停止しません。何が間違っているのでしょうか?私はあなたが指定したものと同じ構成を使用しています。
Tarun Kumar

@Tarun-問題について新しい質問をする
HDave

2
これは受け入れられる答えになるはずです。関連するMavenのゴールは次のとおりです。 clean compile integration-test -Dmaven.test.failure.ignore=false
ニールリマ

31

JUnitカテゴリとMavenを使用すると、非常に簡単に分割できます。
これは、ユニットおよび統合テストを分割することによって、非常に簡単に以下に示されています。

マーカーインターフェイスを定義する

カテゴリを使用してテストをグループ化する最初のステップは、マーカーインターフェイスを作成することです。
このインターフェースは、統合テストとして実行するすべてのテストをマークするために使用されます。

public interface IntegrationTest {}

テストクラスをマークする

カテゴリアノテーションをテストクラスの上部に追加します。新しいインターフェースの名前が付けられます。

import org.junit.experimental.categories.Category;

@Category(IntegrationTest.class)
public class ExampleIntegrationTest{

    @Test
    public void longRunningServiceTest() throws Exception {
    }

}

Mavenユニットテストの構成

このソリューションの優れている点は、単体テストの面では何も変更されないことです。
Maven surefireプラグインにいくつかの構成を追加して、統合テストを無視するようにします。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.11</version>
    <configuration>
        <includes>
            <include>**/*.class</include>
        </includes>
        <excludedGroups>
            com.test.annotation.type.IntegrationTest
        </excludedGroups>
    </configuration>
</plugin>

を実行するとmvn clean test、マークされていない単体テストのみが実行されます。

Maven統合テストの構成

この場合も、設定は非常に簡単です。
標準のフェイルセーフプラグインを使用し、統合テストのみを実行するように設定します。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
        <includes>
            <include>**/*.class</include>
        </includes>
        <groups>
            com.test.annotation.type.IntegrationTest
        </groups>
    </configuration>
</plugin>

構成では、標準の実行目標を使用して、ビルドの統合テストフェーズ中にフェイルセーフプラグインを実行します。

これで、を実行できますmvn clean install
今回は単体テストの実行と同様に、統合テストは統合テストフェーズ中に実行されます。


JUnitにはもう秘密はないと思いました。良いスポット!
gertas 2013年

4
これは、マーカーインターフェースがMavenで利用可能な場所にすでに存在する場合にのみ機能します。マーカーインターフェイスが同じマルチモジュールビルドの別のモジュールに存在する場合は機能しません。
EngineerBetter_DJ

@EngineerBetter_DJそれはどういう意味ですか?マルチプロジェクトベースのMaven設定がある場合、それはできませんか?
matthieusb 2017年

16

Mavenフェイルセーフプラグインを使用してみてください。特定のテストセットを含めるように指示できます。


1
+1これは私が使用するものです。うまく機能し、ローカルサーブレットコンテナの起動やシャットダウンなどの事前/事後のセットアップを行うことができます。
mdma

maven-failsafe-plugin行ってきましたプラグイン墓地
ジンクォン

9
墓地のページには、failsafeプラグインがに移動されたと書かれていますmaven-failsafe-pluginmaven-failsafe-pluginはまだアクティブのようです(ドキュメントは2014年3月に最後にプッシュされました)。
James Kingsbery

13

デフォルトでは、Mavenはクラス名のどこかにTestがあるテストのみを実行します。

IntegrationTestに名前を変更すると、おそらく機能します。

あるいは、Maven設定を変更してそのファイルを含めることもできますが、テストにSomethingTestという名前を付ける方がおそらく簡単で優れています。

テストの包含と除外から:

デフォルトでは、Surefireプラグインは、次のワイルドカードパターンを持つすべてのテストクラスを自動的に含めます。

  • \*\*/Test\*.java -そのすべてのサブディレクトリと、「Test」で始まるすべてのJavaファイル名が含まれます。
  • \*\*/\*Test.java -そのすべてのサブディレクトリと、「Test」で終わるすべてのJavaファイル名が含まれます。
  • \*\*/\*TestCase.java -そのすべてのサブディレクトリと、「TestCase」で終わるすべてのJavaファイル名が含まれます。

テストクラスが命名規則に従っていない場合は、Surefireプラグインを構成し、含めるテストを指定します。


こんにちは、ありがとうございます。SomethingTest.javaと呼ばれる2種類の通常のPOJO Junitテストが実行されます。起動しないSomethingIntegration.javaと呼ばれる統合テストもあります。SomethingTest.javaは、mvn testまたはmvn installによって起動されます。2番目のテストは実行されません。mvn test -Dtest = ** / * Integration
ピーターデラニー

..「Mavenはクラス名のどこかにTestがあるテストのみを実行する」とは、「Maven surefireプラグインはクラス名のどこかにTestがあるテストのみを実行する」という意味です。
ジョシュアデイヴィス、

1
「クラス名のどこか」ではなく、「クラス名がTestで終わる」ではありません。たとえば、MyTestは機能しますが、MyTestsは機能しません
Julian

10

Mavenとの統合テストを実行する別の方法は、プロファイル機能を利用することです。

...
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <includes>
                    <include>**/*Test.java</include>
                </includes>
                <excludes>
                    <exclude>**/*IntegrationTest.java</exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

<profiles>
    <profile>
        <id>integration-tests</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <includes>
                            <include>**/*IntegrationTest.java</include>
                        </includes>
                        <excludes>
                            <exclude>**/*StagingIntegrationTest.java</exclude>
                        </excludes>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
...

実行中の「クリーンインストールMVN」デフォルトのビルドを実行します。上記のとおり、統合テストは無視されます。実行中の「MVNクリーン-P統合テストをインストールする」統合テストが含まれます(私も自分のステージング統合テストを無視します)。さらに、統合テストを毎晩実行するCIサーバーがあり、そのためにコマンド'mvn test -P integration-tests'を発行します。


1
統合テストフェーズを使用しないのはなぜですか?その後、プロファイルは、Arquillianのように、さまざまなアプリサーバーに対する統合テストなどに使用できます。私はMavenの専門家ではありませんが、専門家はこれはあまり「Maven-y」ではないと言うかもしれません。
ジョシュアデイビス

1
@Joshua私は、統合テストの実行に少なくとも5分かかり、ローカルのMavenリポジトリのアーティファクトを更新する必要があるため、1日に何度も「mvn clean install」を発行するため、この方法で実行すると思います。上記の人々によると、「インストール」を実行すると統合テストフェーズが実行され、貴重な開発者の時間を失うことになります。
ホルヘ

統合テストを実行する「インストール」については不明です。いずれにせよ、プロファイルではなくフェーズを使用します。プロファイルは、さまざまなアプリサーバーのサポートなどに使用したほうがよい
ジョシュアデイビス

1
私は先に進み、それで遊んでみます。アドバイスありがとうございます!
ホルヘ

@jorgeここで使用する正しい目標は検証だと思いますよね?
Kilokahn

1

Mavenのドキュメントに従って、ビルドで単体テストを実行し、統合テストを個別に実行できます。

<project>
    <properties>
        <skipTests>true</skipTests>
    </properties>
    [...]
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.20.1</version>
                <configuration>
                    <skipITs>${skipTests}</skipITs>
                </configuration>
            </plugin>
        </plugins>
    </build>
    [...]
</project>

これにより、すべての統合テストをデフォルトで無効にして実行できます。それらを実行するには、次のコマンドを使用します。

mvn install -DskipTests=false

0

あなたは使用する必要がありますMavenの確実なプラグインユニットテストを実行すると、Mavenのフェイルセーフプラグインが統合テストを実行します。

フラグを使用してこれらのテストの実行を切り替える場合は、以下に従ってください。

Mavenの設定

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skipTests>${skipUnitTests}</skipTests>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <includes>
                    <include>**/*IT.java</include>
                </includes>
                <skipTests>${skipIntegrationTests}</skipTests>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <properties>
            <skipTests>false</skipTests>
            <skipUnitTests>${skipTests}</skipUnitTests>
            <skipIntegrationTests>${skipTests}</skipIntegrationTests>
        </properties>

したがって、以下のフラグルールに従って、テストがスキップまたは切り替えられます。

以下のフラグでテストをスキップできます:

  • -DskipTests 単体テストと統合テストの両方をスキップします
  • -DskipUnitTests 単体テストをスキップしますが、統合テストを実行します
  • -DskipIntegrationTests 統合テストをスキップしますが、単体テストを実行します

テストを実行する

単体テストのみを実行するには、以下を実行します

mvn clean test

以下のコマンドを実行して、テストを実行できます(ユニットと統合の両方)

mvn clean verify

統合テストのみを実行するに、以下に従ってください

mvn failsafe:integration-test

または単体テストをスキップ

mvn clean install -DskipUnitTests

また、中mvn installに統合テストをスキップするには、次のようにします

mvn clean install -DskipIntegrationTests

すべてのテストをスキップできます

mvn clean install -DskipTests
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.