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>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.12</version>
</dependency>
</dependencies>
<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-surefire-plugin</artifactId>
<version>2.11</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.12</version>
</dependency>
</dependencies>
<configuration>
<groups>com.test.annotation.type.IntegrationTest</groups>
</configuration>
</plugin>
これをidを持つプロファイルでラップするとIT
、を使用して実行できるのは高速テストのみになりますmvn clean install
。統合/スローテストのみを実行するには、を使用しますmvn clean install -P IT
。
ただし、ほとんどの場合、デフォルトで高速テストを実行し、すべてのテストをで実行する必要があります-P IT
。その場合は、トリックを使用する必要があります。
<profiles>
<profile>
<id>IT</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>java.io.Serializable</excludedGroups> <!-- An empty element doesn't overwrite, so I'm using an interface here which no one will ever use -->
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
ご覧のとおり、で注釈が付けられたテストを除外していjava.io.Serializable
ます。これは、プロファイルがSurefireプラグインのデフォルト設定を継承するために必要です。つまり、<excludedGroups/>
またはと言っても<excludedGroups></excludedGroups>
、値com.test.annotation.type.IntegrationTest
が使用されます。
またnone
、クラスパスのインターフェースでなければならないため、使用できません(Mavenがこれをチェックします)。
ノート:
- への依存関係
surefire-junit47
は、Mavenが自動的にJUnit 4ランナーに切り替えない場合にのみ必要です。groups
or excludedGroups
要素を使用すると、切り替えがトリガーされます。こちらをご覧ください。
- 上記のコードのほとんどは、Maven Failsafeプラグインのドキュメントから取得されました。このページの「JUnitカテゴリの使用」のセクションを参照してください。
- テスト中に、
@RunWith()
注釈を使用してスイートまたはSpringベースのテストを実行した場合でも、これが機能することがわかりました。