1. 概要

Mavenを使用したCIビルドの一部として、すべてのJUnitテストを自動的に実行することは非常に一般的です。 ただし、これには時間がかかることがよくあります。

したがって、ビルドプロセスのさまざまな段階で、テストをフィルタリングし、単体テストまたは統合テスト、あるいはその両方を実行したいことがよくあります。

このチュートリアルでは、 JUnit5を使用したテストケースのフィルタリング手法をいくつか見ていきます。 次のセクションでは、JUnit5より前のさまざまなフィルタリングメカニズムについても説明します。

2. JUnit5タグ

2.1. タグでJUnitテストに注釈を付ける

JUnit 5では、テストのサブセットに一意のタグ名でタグを付けることで、テストをフィルタリングできます。 たとえば、JUnit5を使用して単体テストと統合テストの両方を実装するとします。 テストケースの両方のセットにタグを追加できます。

@Test
@Tag("IntegrationTest")
public void testAddEmployeeUsingSimpelJdbcInsert() {
}

@Test
@Tag("UnitTest")
public void givenNumberOfEmployeeWhenCountEmployeeThenCountMatch() {
}

今後は、特定のタグ名ですべてのテストを個別に実行できます。 メソッドの代わりにクラスにタグを付けることもできます。 これにより、タグの下のクラスにすべてのテストが含まれます。

次のいくつかのセクションでは、タグ付けされたJUnitテストをフィルタリングして実行するさまざまな方法を説明します。

2.2. TestSuiteを使用したタグのフィルタリング

JUnit 5を使用すると、タグ付きテストケースを実行できるテストスイートを実装できます。

@SelectPackages("com.baeldung.tags")
@IncludeTags("UnitTest")
public class EmployeeDAOUnitTestSuite {
}

ここで、このスイートを実行すると、タグUnitTestの下のすべてのJUnitテストが実行されます。 同様に、ExcludeTagsアノテーションを使用してテストを除外できます。

2.3. MavenSurefireプラグインを使用したタグのフィルタリング

Mavenビルドのさまざまなフェーズ内でJUnitテストをフィルタリングするために、MavenSurefireプラグインを使用できます。 Surefireプラグインを使用すると、プラグイン構成にタグを含めたり除外したりできます

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
        <groups>UnitTest</groups>
    </configuration>
</plugin>

このプラグインを実行すると、次のようにタグ付けされたすべてのテストが実行されます。 単体テスト。 同様に、タグ名でテストケースを除外できます。

<excludedGroups>IntegrationTest</excludedGroups>

2.4. IDEを使用したタグのフィルタリング

IDEで、JUnitテストをタグでフィルタリングできるようになりました。 このようにして、IDEから直接タグ付きテストの特定のセットを実行できます。

IntelliJでは、カスタムの実行/デバッグ構成を介してこのようなフィルタリングを行うことができます。

この画像に示すように、タグとしてテストの種類を選択し、タグ式で実行するタグを選択しました。

JUnit 5では、タグのフィルタリングに使用できるさまざまなタグ式を使用できます。 例えば、 統合テスト以外のすべてを実行するには、!IntegrationTestをタグ式として使用できます。 または両方を実行するため単体テスト IntegrationTest、 使用できます UnitTest | IntegrationTest。

同様に、Eclipseでは、JUnitの実行/デバッグ構成にタグを含めたり除外したりすることもできます。

3. JUnit4カテゴリー

3.1. JUnitテストの分類

JUnit 4を使用すると、JUnitテストのサブセットをさまざまなカテゴリーに追加して、それらを実行できます。 その結果、他のカテゴリを除外しながら、特定のカテゴリでテストケースを実行できます。

マーカーインターフェイスの名前がカテゴリの名前を表すマーカーインターフェイスを実装することで、できるだけ多くのカテゴリを作成できます。この例では、 UnitTest:の2つのカテゴリを実装します。

public interface UnitTest {
}

およびIntegrationTest:

public interface IntegrationTest {
}

これで、 Category アノテーションを付けて、JUnitを分類できます。

@Test
@Category(IntegrationTest.class)
public void testAddEmployeeUsingSimpelJdbcInsert() {
}

@Test
@Category(UnitTest.class)
public void givenNumberOfEmployeeWhenCountEmployeeThenCountMatch() {
}

この例では、テストメソッドにカテゴリアノテーションを付けています。 同様に、このアノテーションをテストクラスに追加して、すべてのテストを1つのカテゴリに追加することもできます。

3.2. カテゴリランナー

カテゴリでJUnitテストを実行するには、テストスイートクラスを実装する必要があります。

@RunWith(Categories.class)
@IncludeCategory(UnitTest.class)
@SuiteClasses(EmployeeDAOCategoryIntegrationTest.class)
public class EmployeeDAOUnitTestSuite {
}

このテストスイートはIDEから実行でき、UnitTestカテゴリのすべてのJUnitテストを実行します。 同様に、スイート内のテストのカテゴリを除外することもできます。

@RunWith(Categories.class)
@ExcludeCategory(IntegrationTest.class)
@SuiteClasses(EmployeeDAOCategoryIntegrationTest.class)
public class EmployeeDAOUnitTestSuite {
}

3.3. Mavenでのカテゴリーの除外または包含

最後に、MavenビルドからJUnitテストのカテゴリーを含めたり除外したりすることもできます。 したがって、さまざまなMavenプロファイルでさまざまなカテゴリのJUnitテストを実行できます。

これにはMavenSurefireプラグインを使用します。

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
        <groups>com.baeldung.categories.UnitTest</groups>
    </configuration>
</plugin>

同様に、Mavenビルドからカテゴリを除外できます。

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
        <excludedGroups>com.baeldung.categories.IntegrationTest</excludedGroups>
    </configuration>
</plugin>

これは、前のセクションで説明した例と似ています。 唯一の違いは、タグ名をカテゴリ実装の完全修飾名に置き換えたことです。

4. MavenSurefireプラグインを使用したJUnitテストのフィルタリング

これまでに説明した両方のアプローチは、JUnitライブラリを使用して実装されています。 テストケースをフィルタリングする実装にとらわれない方法は、命名規則に従うことです。 この例では、単体テストにはUnitTestサフィックスを使用し、統合テストにはIntegrationTestを使用します。

次に、 Maven Surefireプラグインを使用して、単体テストまたは統合テストのいずれかを実行します。

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
        <excludes>
            **/*IntegrationTest.java
        </excludes>
    </configuration>
</plugin>

ここでのexcludesタグは、すべての統合テストをフィルタリングし、単体テストのみを実行します。 このような構成では、ビルド時間を大幅に節約できます。

さらに、さまざまな除外または包含を使用して、さまざまなMavenプロファイル内でSurefireプラグインを実行できます。

Surefire はフィルタリングに適していますが、Mavenで統合テストを実行するには FailsafePluginを使用することをお勧めします。

5. 結論

この記事では、JUnit5を使用してテストケースにタグを付けてフィルター処理する方法を説明しました。 Tagアノテーションを使用し、IDEまたはMavenを使用したビルドプロセスで特定のタグを使用してJUnitテストをフィルタリングするさまざまな方法も確認しました。

また、JUnit5より前のフィルタリングメカニズムのいくつかについても説明しました。

すべての例はGithubで入手できます。