junit 5 的 @tag 通过声明式标签与表达式引擎实现测试分组和精准执行,支持单/多标签标注、maven 命令行筛选(含 and/or/not 逻辑)、以及 @includetags/@excludetags 集中管理测试套件。

JUnit 5 的 @Tag 是实现测试分组与精准执行的核心机制,它不依赖外部工具或自定义逻辑,而是通过声明式标签 + 表达式引擎直接生效。关键在于理解标签如何打、怎么组合、在哪配置——三者配合才能真正“灵活”。
给测试打标签:支持单个或多个标签
在测试方法或类上用 @Tag("xxx") 添加标签,一个方法可叠加多个标签,表示它属于多个分类:
-
@Tag("smoke") @Tag("login")→ 该测试既是冒烟用例,又覆盖登录功能 -
@Tag("integration") @Tag("database")→ 表明它涉及集成且依赖数据库 - 标签名必须非空、无空格、不含
, ( ) & | !等保留字符(如@Tag("user-menu")合法,@Tag("user menu")会报错)
运行时筛选:命令行和 Maven 两种主流方式
不用改代码,仅靠参数就能控制执行范围:
- Maven 命令行执行指定标签:
mvn clean test -Dgroups="smoke" - 排除某类标签:
mvn clean test -DexcludedGroups="slow" - 注意:如果
pom.xml中已配置<groups></groups>或<excludedgroups></excludedgroups>,它的优先级高于命令行参数
多条件组合:用表达式实现 AND / OR / NOT 逻辑
JUnit 5 内置标签表达式解析器,支持在 groups 配置中直接写逻辑运算符:
-
AND(同时满足):用
&连接,如smoke&login→ 只运行同时带这两个标签的测试 -
OR(满足其一):用
|连接,如unit|integration -
NOT(排除):用
!前缀,如!database或smoke&!admin - Maven 中使用需加单引号:
mvn clean test -Dgroups='smoke&login'
测试套件中集中管理:@IncludeTags 和 @ExcludeTags
适合构建固定用途的测试集合(比如 CI 流水线中的“每日回归套件”):
- 定义套件类,加上
@IncludeTags({"fast", "smoke&login"})→ 包含所有标有fast的测试,以及同时标有smoke和login的测试 - 搭配
@ExcludeTags({"flaky"})可过滤不稳定测试 - 注意:
@IncludeTags数组里的每个字符串都是独立表达式,"smoke&login"是一个元素,不是两个字符串
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











