Skip to content

Junit5显示名称

JUnit5 显示名称

什么是显示名称

在 JUnit 5 的测试中,通过 @DisplayName 注解可以为测试类、测试方法或测试组定义一个显示名称(display name)。显示名称用于描述测试的目的或功能,使测试报告更加清晰和易于理解。

  • 相当于给用例起别名。
  • 可以展示在 IDE、报告中。
  • 可以配合其他注解使用。

为什么要使用显示名称

  1. 明确标识测试目的:如果测试方法的名称本身无法清晰地表达测试的目的或功能,可以使用 @DisplayName 注解为其定义一个更具描述性的显示名称,以提供更好的测试上下文。
  2. 多语言支持:如果你的测试案例需要支持多种语言环境,可以使用 @DisplayName 注解为测试结果提供对应的多语言显示名称。
  3. 测试报告可读性:当测试类或测试组包含多个测试方法时,为每个测试方法定义一个显示名称可以使测试报告更加易读和易于理解。

如何定义一个显示名称

在测试方法前使用@DisplayName()括号中填写需要显示的别名,如

@DisplayName("Hogwarts")
  • 代码实例
package junit5.displayname;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class DisplayNameTest {
    // 通过DisplayName注解定义别名,注意导入对应的模块
    @DisplayName("第一条用例")
    @Test
    void FirstCase(){
        System.out.println("第一条用例");
    }
    //@DisplayName("第二条用例")
    @Test
    void SecondCase(){
        System.out.println("第二条用例");
    }
}
  • 第一个测试方法我们添加的@Displayname 注解定义了一个显示名称,第二个测试方法没有定义显示名称,左下方测试结果可以看到两个测试测试方法的名称呈现上的不同,第一个测试函数的显示名称是我们使用@Displayname 注解定义的名称。
  • 注意:如果需要定义类的显示名称,在 IDEA 更新后直接在类前添加@DisplayName注解进行定义是无法显示的,需要配合另外定义一个类,类前使用@Suite注解和@SelectClasse注解调用需要更改显示名称的类。
  • 代码实例
  • DisplayNameTest类前添加@Display 注解
@DisplayName("显示名称测试类")
  • 额外定义SuitetTest类,类前使用@Suite注解和@SelectClasse注解调用需要更改显示名称的类。执行当前类,执行当前类间接调用DisplayNameTest类。
package junit5.displayname;

import junit5.displayname.DisplayNameTest;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

@Suite
@SelectClasses({
        DisplayNameTest.class
})
public class SuitetTest {
}
  • 类的显示名称为我们在DisplayNameTest类前使用@DisplayName定义的显示名称。

DisplayName 生成器(进阶)

在测试方法数量较少、显示名称没有统一格式时我们使用@Displayname注解进行定义是可行的,但是如果测试方法数量比较多,且有格式上有统一的要求时可以在类前使用@DisplayNameGeneration注解或者添加配置文件的配置信息进行统一格式的显示名称的定义。

  • 通过注解 @DisplayNameGeneration 实现生成器。
  • 通过配置文件配置。

DisplayName 生成器配置

生成器配置 含义 案例
Standard 默认配置 hogwarts_test() -> hogwarts_test()
Simple 删除没有参数的方法的尾括号。 hogwarts_test() -> hogwarts_test
ReplaceUnderscores 用空格替换下划线。 hogwarts_test() -> hogwarts test()
IndicativeSentences 使用类名,方法名。 类名,hogwarts_test()

  • 在类前使用注解的格式 @DisplayNameGeneration 调用 DisplayNameGenerator 生成器
@DisplayNameGeneration(DisplayNameGenerator.Standard.class)//这里的Standard是默认配置
//不会对显示名称进行修改,默认使用测试方法名
//可替换成上方表格中的其他配置
1. Standard-默认配置

Standard 是默认配置,默认显示 方法名() 如:hogwarts_test() -> hogwarts_test()

  • 代码实例
package com.hogwarts.JUnit5;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.Test;
// 默认配置,不会有变化
@DisplayNameGeneration(DisplayNameGenerator.Standard.class)
public class DisplayNameTest {
    @Test
    void First_Case(){
        System.out.println("第一条用例");
    }
    @Test
    void Second_Case(){
        System.out.println("第二条用例");
    }
}
  • 可以看到在使用 Standard 生成器默认配置时,显示名称无变化。

2. Simple-删除没有参数的方法的尾括号

Simple 配置会将无参数的方法的为括号进行去除, 显示名称为方法名,如果方法带有参数,则不会发生改变。如:hogwarts_test() -> hogwarts_test

  • 代码实例
package junit5.displayname;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

//在类前也可以使用@DisplayName定义类的显示名称
//Standard是默认配置,默认显示 方法名()
//@DisplayNameGeneration(DisplayNameGenerator.Standard.class)
//Simple 显示的名称如果是没有参数的方法则去掉括号,如果有参数则维持原样
@DisplayNameGeneration(DisplayNameGenerator.Simple.class)
public class DisplayNameTest {

    @Test
    //测试方法无参数的情况下使用Simple配置会删除没有参数的方法的尾括号
    void FirstCase(){
        System.out.println("第一条用例");
    }

    @ParameterizedTest()//参数化测试方法 执行观察显示名称是否有变化
    @ValueSource(strings = { "霍格沃兹测试开发" })
    //Simple配置下带有参数的测试方法的显示名称将不会发生改变
    void SecondCase(String name){
        System.out.println(name);
        System.out.println("第二条用例");
    }
}
  • FirstCase方法的显示名称为方法名不加为括号,而SecondCase测试方法带有参数,执行后显示名称还是默认的名称。

3. ReplaceUnderscores-使用空格替换下划线
  • 类前的生成器配置使用 ReplaceUnderscores 配置,会将方法中的下划线 _ 替换为空格,如:hogwarts_test() -> hogwarts test(),不论方法中是否带有参数,均适用。
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
  • 代码实例
package junit5.displayname;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

//在类前也可以使用@DisplayName定义类的显示名称
//Standard是默认配置,默认显示 方法名()
//@DisplayNameGeneration(DisplayNameGenerator.Standard.class)


//Simple 显示的名称如果是没有参数的方法则去掉括号,如果有参数则维持原样
//@DisplayNameGeneration(DisplayNameGenerator.Simple.class)

//ReplaceUnderscores配置会将方法名中的下划线替换为空格(不论是否带有参数)
//而无参数的方法会额外去掉尾括号,而带有参数的方法会保留括号及参数
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class DisplayNameTest {


    //使用Simple配置测试方法无参数的情况下会删除没有参数的方法的尾括号
    @Test
    void First_Case(){
        System.out.println("第一条用例");
    }

    @ParameterizedTest()//参数化测试方法 执行观察显示名称是否有变化
    @ValueSource(strings = { "霍格沃兹测试开发" })
    //Simple配置下带有参数的测试方法的显示名称将不会发生改变
    void Second_Case(String name){
        System.out.println(name);
        System.out.println("第二条用例");
    }

}
  • 两个方法中均带有下划线,下方测试结果中可以看到显示名称中将下滑线替换为空格,而无参数的方法会额外去掉尾括号,带有参数的方法会保留括号及参数,
  • ReplaceUnderscores 与 Standard 配置的对比

4. IndicativeSentences-将类名和方法名拼接展示
  • IndicativeSentences 配置将将类名和方法名拼接作为显示名称,除拼接外不会进行额外的操作,如:类名,hogwarts_test()
  • 代码实例
package junit5.displayname;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

//在类前也可以使用@DisplayName定义类的显示名称
//Standard是默认配置,默认显示 方法名()
//@DisplayNameGeneration(DisplayNameGenerator.Standard.class)


//Simple 显示的名称如果是没有参数的方法则去掉括号,如果有参数则维持原样
//@DisplayNameGeneration(DisplayNameGenerator.Simple.class)

//ReplaceUnderscores配置会将方法名中的下划线替换为空格(不论是否带有参数)
//而无参数的方法会额外去掉尾括号,而带有参数的方法会保留括号及参数
//@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)

//IndicativeSentences配置将将类名和方法名拼接作为显示名称,除拼接外不会进行额外的操作
@DisplayNameGeneration(DisplayNameGenerator.IndicativeSentences.class)
public class DisplayNameTest {


    //使用Simple配置测试方法无参数的情况下会删除没有参数的方法的尾括号
    @Test
    void First_Case(){
        System.out.println("第一条用例");
    }



    @ParameterizedTest()//参数化测试方法 执行观察显示名称是否有变化
    @ValueSource(strings = { "霍格沃兹测试开发" })
    //Simple配置下带有参数的测试方法的显示名称将不会发生改变
    void Second_Case(String name){
        System.out.println(name);
        System.out.println("第二条用例");
    }

}
  • 两个方法的显示名称均是以类名,方法名的形式,不论是否带有参数,可以理解为在默认配置的基础上在前拼接了类名,除外没有其他操作。
  • IndicativeSentences 与 Standard 配置对比

配置参数

如果有许多个测试类都需要添加配置信息,会出现代码冗余的情况,如何更便捷的实现给许多测试类添加配置信息呢?

这时候就需要利用属性文件junit-platform.properties进行全局配置

1. 如何配置

在路径 src/test/resources/junit-platform.properties 或者 src/main/resources/junit-platform.properties中添加配置文件。 2. 在配置文件中添加对应的配置属性。(以 displayName 为例)

# 全局配置Display name 为连接类名与方法名
junit.jupiter.displayname.generator.default = \
org.junit.jupiter.api.DisplayNameGenerator$IndicativeSentences
  • 将文件中的配置信息注释掉,执行查看一下结果

可以看到我们没有在类前使用@DisplayNameGeneration(DisplayNameGenerator.IndicativeSentences.class)进行配置,但显示名称是 类名,方法名的格式说明全局配置参数成功了。(如果配置不成功记得检查一下文件类型和存放位置)



2. 显示名称配置优先级

如果因为需要我们同时使用了以上几种方法,他们之间的优先级顺序是:

优先级 配置内容
第一 注解@DisplayName
第二 注解@DisplayNameGeneration
第三 配置文件中配置DisplayNameGenerator
第四 使用默认配置org.junit.jupiter.api.DisplayNameGenerator.Standard

  • 在上边的代码的基础上,我们添加前三种配置方式,观察一下他们之间的优先顺序。
  • 在属性文件中添加了全局配置的新情况下,在测试类前使用DisplayNameGeneration注释进行配置会重写类的配置信息,而在测试方法前使用DisplayName注释进行配置又会重写方法的显示名称。