JUnitテストのタグ付けとフィルタリング

1. 概要

Mavenを使用してCIビルドの一部としてすべてのJUnitテストを自動的に実行することは非常に一般的です。 ただし、これは多くの場合時間がかかります。
そのため、*ビルドプロセスのさまざまな段階で、テストをフィルター処理して、単体テストまたは統合テストのいずれかまたは両方を実行することがよくあります。*
このチュートリアルでは、https://www.baeldung.com/junit-5 [JUnit 5]を使用したテストケースのいくつかのフィルタリング手法について説明します。 次のセクションでは、JUnit 5より前のさまざまなフィルタリングメカニズムについても説明します。

[[junit5 tags]]
=== 2. JUnit 5タグ

[[tag annotation]]
==== 2.1. _Tag_を使用してJUnitテストに注釈を付ける

JUnit 5では、一意のタグ名でテストのサブセットにタグを付けることにより、テストをフィルターできます。 たとえば、ユニットテストと統合テストの両方がJUnit 5を使用して実装されているとします。 テストケースの両方のセットにタグを追加できます。
@Test
@Tag("IntegrationTest")
public void testAddEmployeeUsingSimpelJdbcInsert() {
}

@Test
@Tag("UnitTest")
public void givenNumberOfEmployeeWhenCountEmployeeThenCountMatch() {
}
以降、*特定のタグ名ですべてのテストを個別に実行*できます。 メソッドの代わりにクラスにタグを付けることもできます。 これにより、タグの下のクラスのすべてのテストが含まれます。
次のいくつかのセクションでは、タグ付きJUnitテストをフィルタリングおよび実行するさまざまな方法を説明します。

[[filtering junit5]]
==== 2.2. テストスイートを使用したタグのフィルタリング

JUnit 5では、タグ付きテストケースを実行できるテストスイートを実装できます。
@RunWith(JUnitPlatform.class)
@SelectPackages("com.baeldung.tags")
@IncludeTags("UnitTest")
public class EmployeeDAOUnitTestSuite {
}
ここで、このスイートを実行すると、タグ_UnitTest_の下にあるすべてのJUnitテストが実行されます*。 同様に、__ ExcludeTags __annotationを使用してテストを除外できます。

[[tags surefire]]
==== 2.3. Maven Surefireプラグインを使用したタグのフィルタリング

Mavenビルドのさまざまなフェーズ内でJUnitテストをフィルタリングするには、Maven Surefireプラグインを使用できます。 * Surefireプラグインを使用すると、プラグイン構成にタグを含めたり除外したりできます*:
<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20.1</version>
    <configuration>
        <groups>UnitTest</groups>
    </configuration>
</plugin>
このプラグインを実行すると、__ UnitTestとしてタグ付けされたすべてのテストが実行されます。 __同様に、タグ名でテストケースを除外できます:
<excludedGroups>IntegrationTest</excludedGroups>

[[tags ide]]
==== 2.4. IDEでタグをフィルタリングする

IDEでは、JUnitテストをタグでフィルタリングできるようになりました。 この方法で、タグ付きテストの特定のセットをIDEから直接実行できます。
IntelliJでは、カスタムの実行/デバッグ構成を介してこのようなフィルタリングが可能です。
link:/uploads/JUnit5-Tags-in-IntelliJ.jpg []
この画像に示すように、タグとしてテスト種類を選択し、タグ式で実行するタグを選択しました。
JUnit 5では、さまざまなhttps://junit.org/junit5/docs/current/user-guide/#running-tests-tag-expressions[Tag Expressions]を使用して、タグのフィルタリングに使用できます。 たとえば、*統合テスト以外をすべて実行するには、タグ式として__!IntegrationTest __を使用できます。*または、__UnitTest __と__IntegrationTestの両方を実行するには、_UnitTestを使用できます。 IntegrationTest。 + _
同様に、Eclipseでは、JUnitの実行/デバッグ構成にタグを含めることも除外することもできます。
link:/uploads/JUnit5-Tags-in-Eclipse.jpg []

[[junit4 categories]]
=== 3. JUnit 4カテゴリー

[[Category annotation]]
==== 3.1. JUnitテストの分類

JUnit 4では、JUnitテストを異なるカテゴリに追加することにより、JUnitテストのサブセットを実行できます。 その結果、特定のカテゴリでテストケースを実行し、他のカテゴリを除外できます。
  • https://www.baeldung.com/java-marker-interfaces [marker interfaces]を実装することで、マーカーインターフェイスの名前がカテゴリの名前を表すように、多くのカテゴリを作成できます。*この例では、 2つのカテゴリ、implement_UnitTest:_を実装します

public interface UnitTest {
}
and _IntegrationTest:_
public interface IntegrationTest {
}
これで、_Category_アノテーションを付けてJUnitを分類できます。
@Test
@Category(IntegrationTest.class)
public void testAddEmployeeUsingSimpelJdbcInsert() {
}

@Test
@Category(UnitTest.class)
public void givenNumberOfEmployeeWhenCountEmployeeThenCountMatch() {
}
この例では、__Category ___annotationをテストメソッドに配置します。 同様に、この注釈をテストクラスに追加して、すべてのテストを1つのカテゴリに追加することもできます。

[[category runner]]
==== 3.2。 カテゴリRunner

カテゴリで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 {
}

[[junit4 maven]]
==== 3.3. Mavenでカテゴリを除外または含める

最後に、JUnitテストのカテゴリをMavenビルドに含めたり除外したりすることもできます。 したがって、異なるMavenプロファイルでJUnitテストの異なるカテゴリを実行できます。
これにはMaven Surefireプラグインを使用します。
<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20.1</version>
    <configuration>
        <groups>com.baeldung.categories.UnitTest</groups>
    </configuration>
</plugin>
同様に、Mavenビルドからカテゴリを除外できます。
<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20.1</version>
    <configuration>
        <excludedGroups>com.baeldung.categories.IntegrationTest</excludedGroups>
    </configuration>
</plugin>
これは、前のセクションで説明した例に似ています。 *唯一の違いは、タグ名を__Category __implementationの完全修飾名に置き換えたことです。*

[[filter surefire]]
=== 4. Maven Surefireプラグインを使用したJUnitテストのフィルタリング

ここで説明したアプローチは両方とも、JUnitライブラリーで実装されています。 テストケースをフィルタリングする実装に依存しない方法は、命名規則に従うことです。 この例では、単体テストにはUnitTestサフィックスを使用し、統合テストにはIntegrationTestを使用します。
ここで、ユニットテストまたは統合テストの実行にlink:/maven-surefire-plugin[Maven Surefire Plugin]を使用します。
<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20.1</version>
    <configuration>
        <excludes>
            **/*IntegrationTest.java
        </excludes>
    </configuration>
</plugin>
*ここの__excludes __tagは、すべての統合テストをフィルタリングし、単体テストのみを実行します*。 このような構成は、ビルド時間を大幅に節約します。
さらに、さまざまな除外または包含を使用して、さまざまなMavenプロファイル内で__Surefire __pluginを実行できます。
  • Surefire _はフィルタリングには適していますが、Mavenで統合テストを実行するにはFailsafe Pluginを使用することをお勧めします。*

[[junit filtering]]
=== 5. 結論

この記事では、JUnit 5でテストケースにタグを付けてフィルター処理する方法を見ました。 * __Tag ___annotationを使用し、IDEまたはMavenを使用したビルドプロセスで特定のタグを使用してJUnitテストをフィルタリングするさまざまな方法も確認しました。*
また、JUnit 5より前のいくつかのフィルタリングメカニズムについても説明しました。
すべての例は、https://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5-basics [Github]で入手できます。