Spring Boot 单元测试(三)@Tag

Spring Boot 使用 JUnit5 提供的 @Tag 注解对测试类或方法打标签,以便于在执行测试时按标签进行过滤。

一、标签命名规范

  1. 标签名左右不能带空格,执行测试时会做 trim 处理;
  2. 标签名不能用以下字符: ()&|!,

二、基本使用方法

  1. 定义一个单元测试类,在类上添加便签 test-1 ,其中定义两个测试方法,分别添加标签 level-1level-2
package com.example.demo;

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

@Tag("test-1")
public class UnitTest1 {

    @Test
    @Tag("level-1")
    public void test1() {
        System.out.println("Test 1-1");
    }

    @Test
    @Tag("level-2")
    public void test2() {
        System.out.println("Test 1-2");
    }
}
  1. 定义另一个单元测试类,在类上添加标签 test-2 ,也定义两个测试方法,分别添加标签 level-1level-2
package com.example.demo;

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

@Tag("test-2")
public class UnitTest2 {

    @Test
    @Tag("level-1")
    public void test1() {
        System.out.println("Test 2-1");
    }

    @Test
    @Tag("level-2")
    public void test2() {
        System.out.println("Test 2-2");
    }
}
  1. 执行以下 Maven 命令,观察对应的测试执行过程。
mvn clean test -Dgroups=test-1
mvn clean test -Dgroups=test-2
mvn clean test -Dgroups=level-1
mvn clean test -Dgroups=level-2
  1. 除使用 Maven 命令执行标签过滤测试外,还可以通过配置 surefire 插件执行标签过滤测试。( surefire 是个测试引擎)
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <groups>level-1</groups>
        <includes>*Test*.java</includes>
    </configuration>
</plugin>

三、标签表达式

以上关于标签的基本使用方法中,每次测试仅能指定执行一种标签,如果要实现更复杂的标签过滤就要使用标签表达式,即通过 与(&)或(|)非(!) 三种操作符将标签连接起来。

对应的 Maven 命令格式:

mvn clean test -Dgroups='test-1 & level-1'

surefire 配置格式:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <groups>test-1 | level-2</groups>
        <includes>*Test*.java</includes>
    </configuration>
</plugin>

四、自定义标签注解

  1. 自定义标签注解
package com.example.demo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.junit.jupiter.api.Tag;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("level-1")
public @interface Level1 {
}
  1. @Tag 注解替换成自定义注解
@Test
@Level1
public void test1() {
    System.out.println("Test 1-1");
}
  1. 还可以进一步简化,将 @Test 合入自定义标签注解。
package com.example.demo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

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

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Test
@Tag("level-1")
public @interface Level1 {
}
  1. 测试方法只使用自定义标签注解。
@Level1
public void test1() {
    System.out.println("Test 1-1");
}

作者:又语
原文:Spring Boot 单元测试(三)@Tag - 掘金