在 JUnit 5 中为@ParameterizedTest生成显示名称

我有一堆从具有相当详细结果的a接收参数(例如Selenium的)。默认情况下,这些名称用于组成相应的显示名称。来自 JUnit 5 用户指南@ParameterizedTest@MethodSourcetoString()WebDriver

默认情况下,参数化测试调用的显示名称包含调用索引和该特定调用的所有参数的 String 表示形式。但是,您可以通过注释的属性自定义调用显示名称 [...]name@ParameterizedTest

虽然这允许在一定程度上自定义显示名称,但似乎我无法调整各个参数的字符串表示形式。遗憾的是,通过 @DisplayNameGeneration 指定生成器只能在类级别应用,而不会影响参数化测试调用的显示名称。

有没有办法将 DisplayNameGenerator 用于或自定义给定参数的字符串表示形式?@ParameterizedTest


答案 1

从 JUnit 5.8.0 开始,JUnit Jupiter API 中有一个接口,它“自动支持将包含的有效负载 [参数] 直接注入参数化方法”(请参阅问题 #2301)。例:Named<T>

@DisplayName("A parameterized test with named arguments")
@ParameterizedTest
@MethodSource("namedArguments")
void testWithNamedArguments(File file) {}

static Stream<Arguments> namedArguments() {
    return Stream.of(
        Arguments.of(Named.of("An important file", new File("path1"))),
        Arguments.of(Named.of("Another file", new File("path2")))
    );
}

如果您更喜欢静态导入,还可以从 和 中选择相应的别名:ArgumentsNamed

arguments(named("An important file", new File("path1")))

有关更多信息,请参阅相应的文档


答案 2

为了间接实现您的目标,直到JUnit直接支持这一点,人们总是可以向测试中添加一个参数,该参数是所需的字符串。然后,需要在参数提供程序方法中完成自定义。

@ParameterizedTest(name = "{index} {1}")
@MethodSource("argumentProvider")
public void testSomething(Object someObject, String niceRepresentation) {
    // Test something
}

private static Stream<Arguments> argumentProvider() {
    return Stream.of(
            Arguments.of(new Object(), "Nice 1"),
            Arguments.of(new Object(), "Nice 2")
    );
}

缺点是单元测试提供了未在测试实现中使用的参数,这可能会损害清晰度,但随后它会成为测试报告中详细名称的权衡。


推荐