junit 5 的 @tag 是轻量级测试分类机制,支持类级和方法级多标签标注,可通过 ide、maven 命令行或 surefire 插件按标签运行,并支持 and(&)、or(|)、not(!)及括号组合的表达式筛选。

JUnit 5 的 @Tag 是轻量但非常实用的分类机制,它不依赖外部配置,直接通过注解给测试类或方法“贴标签”,再配合运行时过滤规则,就能灵活控制哪些测试该跑、哪些该跳过。
怎么打标签
标签可以加在测试类上(影响整个类),也可以加在单个 @Test 方法上(更细粒度)。一个元素支持多个标签,互不冲突:
- 类级标签:所有该类下的测试自动继承
- 方法级标签:只作用于当前方法,可叠加多个,比如
@Tag("smoke") @Tag("login") - 标签值必须是非空字符串,不能含空格、逗号、括号、&、|、!、ISO 控制字符
怎么按标签运行测试
有三种主流方式,适用不同场景:
- IDE 中运行:IntelliJ IDEA 或 Eclipse 支持右键选择 “Run ‘Tests with tag: xxx’”,也可在运行配置里填入 tag 表达式
-
Maven 命令行:用
-Dgroups=xxx包含,或-DexcludedGroups=xxx排除。支持逻辑组合,如-Dgroups="smoke&login"(AND)、-Dgroups="unit|integration"(OR) -
Maven 插件配置:在
pom.xml的maven-surefire-plugin中设置<groups></groups>或<excludedgroups></excludedgroups>,优先级高于命令行参数
怎么组合多个标签做精准筛选
单纯罗列多个标签(如 @IncludeTags({"a", "b"}))是 OR 逻辑——只要带 a 或 b 就执行。若要 AND 逻辑(必须同时含 a 和 b),要用标签表达式:
- 写法是把标签用
&连成一个字符串:@IncludeTags("a&b") - 同样适用于命令行:
mvn test -Dgroups="fast&database" - 也支持 NOT 和括号,例如
"smoke&!(longrun)"表示“冒烟且非耗时”
怎么组织测试套件
用 @IncludeTags 或 @ExcludeTags 搭配 @SelectPackages / @SelectClasses 可定义专用测试套件:
- 新建一个空类,加上
@RunWith(JUnitPlatform.class) - 指定包路径:
@SelectPackages("com.example.test") - 再限定范围:
@IncludeTags("production")——只跑带 production 标签的测试 - 注意:
@IncludeTags和@ExcludeTags不能共存于同一个套件类中











