1. 概要

JUnitを使用する場合、名前にアクセスするためにテストが必要になる場合があります。 これは、特にシステムで生成された名前を使用したテストの場合、エラーメッセージに役立つ可能性があります。

この短いチュートリアルでは、 JUnit4JUnit5の両方で現在のテストケースの名前を取得する方法を見ていきます。

2. JUnit5アプローチ

2つのシナリオを見てみましょう。 まず、単一のテストの名前にアクセスする方法を説明します。 この名前は、おそらく関数の名前または @DisplayName アノテーションの値であるため、通常は予測可能です。 ただし、パラメーター化されたテストまたは表示名ジェネレーターを使用している場合は、JUnitが提供した名前を知る必要がある場合があります。

JUnit 5は、TestInfoオブジェクトをtests に挿入して、現在のテストケースの名前を表示できます。

2.1. 個別テスト

TestInfoオブジェクトをテスト関数に挿入してみましょう。

@Test
void givenNumbers_whenOddCheck_thenVerify(TestInfo testInfo) {
    System.out.println("displayName = " + testInfo.getDisplayName());
    int number = 5;
    assertTrue(oddCheck(number));
}

ここでは、インターフェイスTestInfoの getDisplayNameメソッドを使用して、testの名前を表示しました。 テストを実行すると、テスト名が取得されます。

displayName = givenNumbers_whenOddCheck_thenVerify(TestInfo)

2.2. パラメータ化されたテスト

パラメータ化されたテストでこれを試してみましょう。 ここでは、@ParameterizedTestアノテーションのnameフィールドを使用して、テストの名前を生成する方法をJUnitに説明します。

private TestInfo testInfo;

@BeforeEach
void init(TestInfo testInfo) {
    this.testInfo = testInfo;
}

@ParameterizedTest(name = "givenNumbers_whenOddCheck_thenVerify{0}")
@ValueSource(ints = { 1, 3, 5, -3, 15 })
void givenNumbers_whenOddCheck_thenVerify(int number) {
    System.out.println("displayName = " + testInfo.getDisplayName());
    assertTrue(oddCheck(number));
}

個別のテストとは異なり、TestInfoを関数に挿入できないことに注意してください。 これは、関数パラメーターがパラメーター化されたデータに関連している必要があるためです。 これを解決するには、beforeEachメソッドを介してTestInfoをテストクラスのフィールドに格納する必要があります。

テストを実行すると、テスト名が取得されます。

displayName = givenNumbers_whenOddCheck_thenVerify5
displayName = givenNumbers_whenOddCheck_thenVerify-3
displayName = givenNumbers_whenOddCheck_thenVerify3
displayName = givenNumbers_whenOddCheck_thenVerify1
displayName = givenNumbers_whenOddCheck_thenVerify15

3. JUnit4アプローチ

JUnit 4は、テストにTestNameオブジェクトを設定できます。  TestNameJUnitルールであり、ルールはJUnitのテスト実行の一部として実行され、現在実行中のテストの詳細を示します。

3.1. 個別テスト

個別のテストについて考えてみましょう。

@Rule
public TestName name = new TestName();

@Test
public void givenString_whenSort_thenVerifySortForString() {
    System.out.println("displayName = " + name.getMethodName());
    String s = "abc";
    assertEquals(s, sortCharacters("cba"));
}

上記のように、TestNameクラスの getMethodNameメソッドを使用して、testの名前を表示できます。

テストを実行してみましょう:

displayName = givenString_whenSort_thenVerifySortForString

3.2. パラメータ化されたテスト

次に、同じ方法を使用して、パラメーター化されたテスト用に生成されたテスト名を表示しましょう。 まず、特別なテストランナーでテストに注釈を付ける必要があります。

@RunWith(Parameterized.class)
public class JUnit4ParameterizedTestNameUnitTest {
}

次に、 TestName ルールと、現在のテストのパラメーター値を割り当てるためのフィールドとコンストラクターの両方を使用してテストを実装できます。

@Rule
public TestName name = new TestName();
private String input;
private String expected;

public JUnit4ParameterizedTestNameUnitTest(String input, String expected) {
    this.input = input;
    this.expected = expected;
}

@Parameterized.Parameters(name = "{0}")
public static Collection<Object[]> suppliedData() {
    return Arrays.asList(new Object[][] { 
      { "abc", "abc" }, { "cba", "abc" }, { "onm", "mno" }, { "a", "a" }, { "zyx", "xyz" }});
}

@Test
public void givenString_whenSort_thenVerifySortForString() {
    System.out.println("displayName = " + name.getMethodName());
    assertEquals(expected, sortCharacters(input));
}

このテストでは、入力文字列と期待される文字列の両方を含むテストデータコレクションを提供します。 これは、 @Parameterized.Parametersアノテーションが付けられたsuppliedData関数を介して行われます。 この注釈により、テスト名を説明することもできます。

テストを実行すると、 TestName ルールに各テストの名前が付けられ、次のことがわかります。

displayName = givenString_whenSort_thenVerifySortForString[abc]
displayName = givenString_whenSort_thenVerifySortForString[cba]
displayName = givenString_whenSort_thenVerifySortForString[onm]
displayName = givenString_whenSort_thenVerifySortForString[a]
displayName = givenString_whenSort_thenVerifySortForString[zyx]

4. 結論

この記事では、JUnit4と5の両方で現在のテストの名前を見つける方法について説明しました。

個々のテストとパラメーター化されたテストの両方でこれを行う方法を見ました。

いつものように、完全なソースコードはGitHubから入手できます。