Spring Boot 使用 JUnit5 提供的 @Tag
注解对测试类或方法打标签,以便于在执行测试时按标签进行过滤。
一、标签命名规范
- 标签名左右不能带空格,执行测试时会做
trim
处理; - 标签名不能用以下字符:
(
、)
、&
、|
、!
、,
。
二、基本使用方法
- 定义一个单元测试类,在类上添加便签
test-1
,其中定义两个测试方法,分别添加标签level-1
和level-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");
}
}
- 定义另一个单元测试类,在类上添加标签
test-2
,也定义两个测试方法,分别添加标签level-1
和level-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");
}
}
- 执行以下 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
- 除使用 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>
四、自定义标签注解
- 自定义标签注解
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 {
}
- 将
@Tag
注解替换成自定义注解
@Test
@Level1
public void test1() {
System.out.println("Test 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 {
}
- 测试方法只使用自定义标签注解。
@Level1
public void test1() {
System.out.println("Test 1-1");
}
作者:又语
原文:Spring Boot 单元测试(三)@Tag - 掘金