1. 概要

このクイック記事では、JUnit5で導入された@RepeatedTestアノテーションを見ていきます。 これは、数回繰り返したいテストを作成するための強力な方法を提供します。

JUnit 5の詳細については、他の記事の基本を説明しているおよび JUnit5のガイドを確認してください。

2. Mavenの依存関係とセットアップ

最初に注意することは、JUnit5を実行するにはJava8が必要であるということです。 そうは言っても、Mavenの依存関係を見てみましょう。

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.8.1</version>
    <scope>test</scope>
</dependency>

これは、テストを作成するために追加する必要があるJUnit5の主要な依存関係です。 アーティファクトの最新バージョンここをチェックしてください。

3. 単純な@RepeatedTestの例

繰り返しテストの作成は簡単です。テストメソッドの上に@RepeatedTestアノテーションを追加するだけです。

@RepeatedTest(3)
void repeatedTest(TestInfo testInfo) {
    System.out.println("Executing repeated test");
 
    assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2");
}

標準の@Testアノテーションの代わりに、単体テストに@RepeatedTestを使用していることに注意してください。 上記のテストは、同じテストが3回書き込まれたかのように3回実行されます

テストレポート(レポートファイルまたはIDEの[JUnit]タブの結果)には、すべての実行が表示されます。

repetition 1 of 3(repeatedTest(TestInfo))
repetition 2 of 3(repeatedTest(TestInfo))
repetition 3 of 3(repeatedTest(TestInfo))

4. @RepeatedTestのライフサイクルサポート

@RepeatedTestの各実行は、完全なJUnitテストライフサイクルをサポートする通常の@Testのように動作します。 つまり、実行のたびに、@BeforeEachメソッドと@AfterEachメソッドが呼び出されます。 これを実証するには、テストクラスに適切なメソッドを追加するだけです。

@BeforeEach
void beforeEachTest() {
    System.out.println("Before Each Test");
}

@AfterEach
void afterEachTest() {
    System.out.println("After Each Test");
    System.out.println("=====================");
}

前のテストを実行すると、結果がコンソールに表示されます。

Before Each Test
Executing repeated test
After Each Test
=====================
Before Each Test
Executing repeated test
After Each Test
=====================
Before Each Test
Executing repeated test
After Each Test
=====================

ご覧のとおり、@BeforeEachメソッドと@AfterEachメソッドは実行ごとに呼び出されます

5. テスト名の構成

最初の例では、テストレポートの出力に識別子が含まれていないことを確認しました。 これは、name属性を使用してさらに構成できます。

@RepeatedTest(value = 3, name = RepeatedTest.LONG_DISPLAY_NAME)
void repeatedTestWithLongName() {
    System.out.println("Executing repeated test with long name");
 
    assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2");
}

出力には、繰り返しインデックスとともにメソッド名が含まれます。

repeatedTestWithLongName() :: repetition 1 of 3(repeatedTestWithLongName())
repeatedTestWithLongName() :: repetition 2 of 3(repeatedTestWithLongName())
repeatedTestWithLongName() :: repetition 3 of 3(repeatedTestWithLongName())

もう1つのオプションは、 RepeatedTest.SHORT_DISPLAY_NAME を使用することです。これにより、テストの短い名前が生成されます。

repetition 1 of 3(repeatedTestWithShortName())
repetition 2 of 3(repeatedTestWithShortName())
repetition 3 of 3(repeatedTestWithShortName())

ただし、カスタマイズした名前を使用する必要がある場合は、次のようになります。

@RepeatedTest(value = 3, name = "Custom name {currentRepetition}/{totalRepetitions}")
void repeatedTestWithCustomDisplayName(TestInfo testInfo) {
    assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2");
}

{currentRepetition}{totalRepetitions}は、現在の繰り返しと繰り返しの総数のプレースホルダーです。 これらの値は実行時にJUnitによって自動的に提供され、追加の構成は必要ありません。 出力は、私たちが期待したものとほぼ同じです。

Custom name 1/3(repeatedTestWithCustomDisplayName())
Custom name 2/3(repeatedTestWithCustomDisplayName())
Custom name 3/3(repeatedTestWithCustomDisplayName())

6. RepetitionInfoへのアクセス

name 属性とは別に、JUnitはテストコードの繰り返しメタデータへのアクセスも提供します。 これは、RepetitionInfoパラメーターをテストメソッドに追加することで実現されます。

@RepeatedTest(3)
void repeatedTestWithRepetitionInfo(RepetitionInfo repetitionInfo) {
    System.out.println("Repetition #" + repetitionInfo.getCurrentRepetition());
 
    assertEquals(3, repetitionInfo.getTotalRepetitions());
}

出力には、実行ごとの現在の繰り返しインデックスが含まれます。

Repetition #1
Repetition #2
Repetition #3

RepetitionInfo は、 RepetitionInfoParameterResolver によって提供され、@RepeatedTest。のコンテキストでのみ使用できます。

7. 結論

このクイックチュートリアルでは、JUnitが提供する @RepeatedTest アノテーションを調べ、さまざまな構成方法を学びました。

この記事の完全なソースコードをGitHubで確認することを忘れないでください。