junit 5 - Display Name 展示名称

本文地址:https://www.cnblogs.com/hchengmx/p/14883563.html

@DisplayName可以给 测试类 或者 测试方法来自定义显示的名称。可以支持 空格、特殊字符,甚至是 emoji。

1. @DisplayName

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

@DisplayName("A special test case")
public class DisplayNameTest {

    @Test
    @DisplayName("Custom test name containing spaces")
    void testWithDisplayNameContainingSpaces() {
    }

    @Test
    @DisplayName("╯°□°)╯")
    void testWithDisplayNameContainingSpecialCharacters() {
    }

    @Test
    @DisplayName("😱")
    void testWithDisplayNameContainingEmoji() {
    }
}

output

junit 5/display/DisplayNameTest-TestResult.PNG

2. @DisplayNameGenerator

DisplayNameGenerator 是一个接口,里面有三个方法。

String generateDisplayNameForClass(Class testClass); String generateDisplayNameForNestedClass(Class nestedClass);
String generateDisplayNameForMethod(Class<?> testClass, Method testMethod);

DisplayNameGenerator Behavior Example
Standard 默认的,没什么变化 test_display_ok() -> test_display_ok()
Simple 针对没有参数的方法,去除掉尾部的括号 test_display_ok() -> test_display_ok
ReplaceUnderscores 把下划线 ‘_’ 替换成空格 test_display_ok() -> test display ok
IndicativeSentences class + method name test_diaplay_ok() -> DisplayNameGeneratorTest , test_diaplay_ok()
@DisplayNameGeneration(DisplayNameGenerator.IndicativeSentences.class)
public class DisplayNameGeneratorTest {

    @Test
    public void test_display_ok(){

    }
}

output

junit 5/display/DisplayNameGeneratorTest-TestResult.PNG

3. Parameterized Tests

对于 可参数化的测试,我们可以用 ParameterizedTest 来自定义设置 DisplayName,这种时候就不需要用 DisplayName或者 DisplayNameGenerator

package com.hchengmx.display;

import static org.junit.jupiter.params.provider.Arguments.arguments;

import java.util.stream.Stream;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

public class DisplayNameParamTest {

    @ParameterizedTest(name = "#{index} - Test with {0} and {1}")
    @MethodSource("argumentProvider")
    void test_method_multi(String str, int length) {
    }

    static Stream<Arguments> argumentProvider() {
        return Stream.of(
                arguments("abc", 3),
                arguments("lemon", 2)
        );
    }
}

junit 5/display/DisplayNameParamTest-TestResult.PNG

4. Custom DisplayNameGenerator

我们也可以 继承JUnit 的 DisplayNameGenerator 来实现自定义。比如,我们不想用DisplayName注解了,觉得这个不太直观,自定义了一个 TestCaseName的注解,用来标明Test Case的名称。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestCaseName {
    String value();
}
import com.hchengmx.annotation.TestCaseName;
import java.lang.reflect.Method;
import org.junit.jupiter.api.DisplayNameGenerator;

public class CustomDisplayNameGenerator extends DisplayNameGenerator.Standard {

    @Override
    public String generateDisplayNameForClass(Class<?> testClass) {
        return "New Name for test class";
    }

    @Override
    public String generateDisplayNameForNestedClass(Class<?> nestedClass) {
        return super.generateDisplayNameForNestedClass(nestedClass);
    }

    @Override
    public String generateDisplayNameForMethod(Class<?> testClass, Method testMethod) {
        if (testMethod.isAnnotationPresent(TestCaseName.class)) {
            return testMethod.getAnnotation(TestCaseName.class).value();
        }
        return super.generateDisplayNameForMethod(testClass, testMethod);
    }
}

junit 5/display/DisplayNameCustomTest-TestResult.PNG

source code

https://gitee.com/hchengmx/junit5-samples/tree/master/src/test/java/com/hchengmx/display


參考:

  1. JUnit 5 User Guide - Display Names
  2. DisplayName (JUnit 5.7.2 API)
  3. JUnit 5 Display Names - Mkyong.com
posted on 2021-06-14 22:24  hchengmx  阅读(1057)  评论(0编辑  收藏  举报