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
RepetitionInfoはRepetitionInfoParameterResolverによって提供され、@RepeatedTest.のコンテキストでのみ使用できます。
7. 結論
このクイックチュートリアルでは、JUnitによって提供される@RepeatedTestアノテーションを調べ、それを構成するさまざまな方法を学びました。
この記事のfull source codeをGitHubで確認することを忘れないでください。