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上获取。