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

Generating display names for @ParameterizedTest in JUnit 5

我有一堆 @ParameterizedTest@MethodSource 接收参数,结果非常冗长 toString()(例如 Selenium 的 WebDriver)。这些默认用于组成相应的显示名称。来自 JUnit 5 user guide:

By default, the display name of a parameterized test invocation contains the invocation index and the String representation of all arguments for that specific invocation. However, you can customize invocation display names via the name attribute of the @ParameterizedTest annotation […]

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

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

要在 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")
    );
}

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

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

@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")))

更多信息,请参考corresponding docs

只是在 surefire 报告中添加了类似的问题。

使用 @DisplayName@ParameterizedTest(name = "{0}") 后,报告中的测试名称不正确。

这个问题解决了我的问题#1255

       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M4</version>
            <configuration>
                <statelessTestsetReporter
                        implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5Xml30StatelessReporter">
                    <disable>false</disable>
                    <version>3.0</version>
                    <usePhrasedFileName>false</usePhrasedFileName>
                    <usePhrasedTestSuiteClassName>true</usePhrasedTestSuiteClassName>
                    <usePhrasedTestCaseClassName>true</usePhrasedTestCaseClassName>
                    <usePhrasedTestCaseMethodName>true</usePhrasedTestCaseMethodName>
                </statelessTestsetReporter>
            </configuration>
        </plugin>