web-dev-qa-db-ja.com

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

Maven2マルチモジュールプロジェクトがあり、子モジュールのそれぞれに、ユニットテストと統合テストのそれぞれTest.JavaIntegration.Javaという名前のJUnitテストがあります。私が実行するとき:

mvn test

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

mvn test -Dtest=**/*Integration

Integration.Javaテストはいずれも子モジュール内で実行されません。

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

155
Peter Delaney

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

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

デフォルトでは、integration-testは**/IT*.Java**/*IT.Java、および**/*ITCase.Javaという名前のテストクラスを実行しますが、これは設定可能です。

これをすべて接続する方法の詳細については、 Failsafe pluginFailsafe usage page (これを書いているときに前のページから正しくリンクされていない)を参照してください。 out このSonatypeブログの投稿

219
Kief

私はあなたがやりたいことを正確に行いました。ユニットテスト「* 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>

がんばろう!

58
HDave

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

マーカーインターフェイスの定義



public interface IntegrationTest {}

テストクラスにマークを付ける

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

import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
@Test
public void longRunningServiceTest() throws Exception {
 }
}

Mavenユニットテストの構成



<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テストを実行すると、マークされていない単体テストのみが実行されます。

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を実行できます
今回は、単体テストの実行と同様に、統合テストは統合テスト段階で実行されます。

24
John Dobie

maven failsafe plugin を使用してみてください。特定のテストセットを含めるように指示できます。

15
James Kingsbery

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

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

別の方法として、Mavenの設定を変更してそのファイルを含めることもできますが、テストにSomethingTestという名前を付ける方が簡単で良いでしょう。

テストの包含および除外

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

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

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

13
cletus

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 clean install'を実行すると、デフォルトのビルドが実行されます。上記のように、統合テストは無視されます。 'mvn clean install -P integration-tests'を実行すると、統合テストが含まれます(ステージング統合テストも無視します)。さらに、毎晩統合テストを実行するCIサーバーがあり、そのためにコマンド'mvn test -P integration-tests'を発行します。

9
Jorge

maven documentation に従って、ビルドで単体テストを実行し、統合テストを個別に実行できます。

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