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

bea*_*u13 15 java junit parameterized-unit-test junit5

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

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

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

有没有办法使用DisplayNameGeneratorfor@ParameterizedTest或自定义给定参数的字符串表示?

SDJ*_*SDJ 19

为了在 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")
    );
}
Run Code Online (Sandbox Code Playgroud)

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


bea*_*u13 10

从 JUnit 5.8.0 开始,将有一个Named<T>接口作为 JUnit Jupiter API 的一部分,具有“自动支持将包含的有效负载 [参数] 直接注入参数化方法”。例子:

@DisplayName("A parameterized test with named arguments")
@ParameterizedTest(name = "{index}: {0}")
@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")))
    );
}
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢静态导入,您还可以从Argumentsand获取相应的别名Named

arguments(named("An important file", new File("path1")))
Run Code Online (Sandbox Code Playgroud)

参考:

  • 对于多个输入,请使用 Stream.of(arguments(named("cool name", "first input"), "second input"));` 和 `@ParameterizedTest(name = "{0}")` (5认同)
  • 使用 `Named` 时可以跳过 `(name = "{index}: {0}")` (2认同)