1. 概述

在使用JUnit进行测试时,我们可能需要让测试访问它们的名称。这对于错误消息特别有用,特别是对于系统自动生成名称的测试。

在这个简短教程中,我们将探讨如何在JUnit 4和JUnit 5中获取当前测试用例的名称。

2. JUnit 5 方法

2.1. 单个测试

JUnit 5可以在我们的测试中注入一个TestInfo对象,让我们看到当前测试用例的名称。

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

这里,我们使用了TestInfo接口的getDisplayName方法来显示测试的名称。运行测试后,我们可以看到测试名称:

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. JUnit 4 方法

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方法来显示测试的名称。

运行测试:

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;

在这个测试中,我们通过suppliedData函数(带有@Parameterized.Parameters注解)提供包含输入字符串和预期字符串的Collection。这个注解还允许我们描述测试名称。

运行测试时,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. 总结

本文讨论了如何在JUnit 4和5中找到当前测试的名称。

我们展示了如何为单个测试和参数化测试实现这一点。

如往常一样,完整的源代码可在GitHub上获取。