Maven2マルチモジュールプロジェクトがあり、子モジュールのそれぞれに、ユニットテストと統合テストのそれぞれTest.Java
とIntegration.Java
という名前のJUnitテストがあります。私が実行するとき:
mvn test
子モジュール内のすべてのJUnitテスト*Test.Java
が実行されます。実行するとき
mvn test -Dtest=**/*Integration
Integration.Java
テストはいずれも子モジュール内で実行されません。
これらはまったく同じコマンドのように見えますが、-Dtest =/* Integration **のコマンドは機能せず、親レベルで実行されているテストが表示されません。テストはありません。
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>
Mavenビルドライフサイクル には、統合テストを実行するための「統合テスト」フェーズが含まれています。統合テストは、「テスト」フェーズで実行される単体テストとは別に実行されます。 「パッケージ」の後に実行されるため、「mvn verify」、「mvn install」、または「mvn deploy」を実行すると、途中で統合テストが実行されます。
デフォルトでは、integration-testは**/IT*.Java
、**/*IT.Java
、および**/*ITCase.Java
という名前のテストクラスを実行しますが、これは設定可能です。
これをすべて接続する方法の詳細については、 Failsafe plugin 、 Failsafe usage page (これを書いているときに前のページから正しくリンクされていない)を参照してください。 out このSonatypeブログの投稿 。
私はあなたがやりたいことを正確に行いました。ユニットテスト「* 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>
がんばろう!
JUnitカテゴリとMavenを使用して、非常に簡単に分割できます。
これは、ユニットテストと統合テストを分割して、非常に簡単に以下に示します。
public interface IntegrationTest {}
テストクラスの上部にカテゴリアノテーションを追加します。新しいインターフェースの名前を取ります。
import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
@Test
public void longRunningServiceTest() throws Exception {
}
}
<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テストを実行すると、マークされていない単体テストのみが実行されます。
<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を実行できます
今回は、単体テストの実行と同様に、統合テストは統合テスト段階で実行されます。
maven failsafe plugin を使用してみてください。特定のテストセットを含めるように指示できます。
デフォルトでは、Mavenはクラス名のどこかにTestがあるテストのみを実行します。
IntegrationTestに名前を変更すると、おそらく動作します。
別の方法として、Mavenの設定を変更してそのファイルを含めることもできますが、テストにSomethingTestという名前を付ける方が簡単で良いでしょう。
デフォルトでは、Surefireプラグインには次のワイルドカードパターンを持つすべてのテストクラスが自動的に含まれます。
- 「**/Test * .Java」-「Test」で始まるすべてのサブディレクトリとすべてのJavaファイル名が含まれます。
- 「**/* Test.Java」-すべてのサブディレクトリと、「Test」で終わるすべてのJavaファイル名が含まれます。
- 「**/* TestCase.Java」-「TestCase」で終わるすべてのサブディレクトリとすべてのJavaファイル名が含まれます。
テストクラスが命名規則に従っていない場合は、Surefireプラグインを構成し、含めるテストを指定します。
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'を発行します。
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