Junit 5の@RepeatedTestへのガイド

Junit 5の@RepeatedTestのガイド

1. 概要

この簡単な記事では、JUnit 5で導入された@RepeatedTestアノテーションを見ていきます。 何度も繰り返したいテストを書く強力な方法を提供します。

JUnit 5について詳しく知りたい場合は、他の記事explaining the basicsおよびguide to JUnit 5を確認してください。

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

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


    org.junit.jupiter
    junit-jupiter-engine
    5.1.0
    test

これは、テストを記述するために追加する必要がある主要なJUnit 5依存関係です。 アーティファクトhereの最新バージョンを確認してください。

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回書かれたかのようにThe above test will be executed three times

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

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

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

Each execution of the @RepeatedTest will behave like a regular @Testは、JUnitテストのライフサイクルを完全にサポートしています。 つまり、実行のたびに、@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 and @AfterEach methods are called around each executionです。

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())

別のオプションは、テストの短い名前を生成する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

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

7. 結論

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

この記事のfull source codeをGitHubで確認することを忘れないでください。