Junit 5の@RepeatedTestへのガイド

1概要

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

JUnit 5についてもっと知りたいなら、他の記事リンク/junit-5-preview[基本を説明する]とリンク:/junit-5[JUnit 5のガイド]をチェックしてください。

2 Mavenの依存関係と設定

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

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

これがテストを書くために追加する必要があるJUnit 5の主要な依存関係です。アーティファクトの最新バージョンをチェックしてください。 %22[ここ]

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

別のオプションは 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 によって提供され、[email protected]のコンテキストでのみ使用可能です。

7. 結論

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

GitHubでこの記事のhttps://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5[完全なソースコード]をチェックアウトすることを忘れないでください。