@Tag 是 JUnit 5 的语义化标签注解,用于按业务、环境等维度分类测试,支持多标签、继承与精准筛选,需配合 Maven Surefire 或 IDE 使用,提升 CI/CD 流水线执行效率。

@Tag 是 JUnit 5 引入的注解,用于给测试类或测试方法打上语义化标签,实现按业务、环境、风险等级等维度对测试用例进行分类管理。它不改变测试执行逻辑,但能配合 --tags 参数或构建工具(如 Maven Surefire)精准筛选、分组运行特定测试,特别适合大型项目中做测试分级、CI/CD 流水线分阶段执行。
✅ @Tag 的基本用法
- 可标注在测试类或测试方法上(支持重复使用多个标签)
- 标签名是字符串,建议使用小写、短横线分隔(如
"smoke"、"integration"、"slow") - 需搭配 JUnit Jupiter(JUnit 5)使用,JUnit 4 不支持
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
@Tag("smoke")
@Tag("fast")
class CalculatorTest {
@Test
@Tag("unit")
void testAdd() {
assertEquals(5, new Calculator().add(2, 3));
}
@Test
@Tag("integration")
@Tag("database")
void testSaveUser() {
// 涉及数据库操作的测试
}
}注意:一个方法可同时拥有多个
@Tag,一个类上的@Tag会自动继承给所有内部测试方法(除非子方法显式覆盖或未标注)。
✅ 如何按标签运行测试
▪ 使用 Maven 命令行筛选执行
在终端中运行带 --tags 的命令(需 Surefire 插件 ≥ 2.22.0):
# 运行所有带 "smoke" 标签的测试 mvn test -Dgroups=smoke # 运行同时含 "unit" 和 "fast" 的测试(AND 关系) mvn test -Dgroups="unit & fast" # 运行含 "smoke" 或 "integration" 的测试(OR 关系) mvn test -Dgroups="smoke | integration" # 排除慢测试(NOT) mvn test -Dgroups="!slow"
⚠️ Maven 中实际使用的是
-Dgroups=(JUnit 5 兼容模式),不是--tags=;后者是 JUnit Platform Console Launcher 的原生命令格式。立即学习“Java免费学习笔记(深入)”;
▪ 在 IDE 中运行(IntelliJ IDEA / Eclipse)
- 右键点击类/方法 → Run 'xxxTest' with Coverage
- 或点击测试方法左侧绿色箭头 → 选择 “Run with Tags…” → 输入
smoke等标签名 - IDEA 还支持在 Run Configuration 中配置
Tags字段,保存为常用模板
✅ 实际分类建议(团队协作友好)
| 标签名 | 含义说明 | 典型场景 |
|---|---|---|
smoke |
冒烟测试,验证核心流程是否通 | CI 流水线第一关,5 分钟内跑完 |
unit |
纯单元测试(无外部依赖) | 本地快速验证,开发自测首选 |
integration |
集成测试(含 DB、HTTP、MQ 等) | 测试环境每日定时执行 |
slow |
执行耗时 >1s 的测试(如文件 IO、重试) | 默认跳过,夜间批量执行 |
security |
安全相关校验(如越权、SQL 注入) | 发布前专项扫描 |
wip |
Work-in-progress,暂未完成的测试 | 加 @Disabled + @Tag("wip") 方便识别 |
示例组合:
@Test
@Tag("unit")
@Tag("fast")
void givenValidInput_whenParse_thenReturnParsedObject() { ... }
@Test
@Tag("integration")
@Tag("database")
@Tag("slow")
void givenOrder_whenSubmit_thenPersistToDB() { ... }✅ 配合其他机制增强管理效果
-
与
@DisplayName结合:提升报告可读性@Test @Tag("smoke") @DisplayName("✅ 登录接口 - 正向流程(用户名密码正确)") void testLoginSuccess() { ... } -
与
@EnabledIfSystemProperty联用:按环境开关@Test @Tag("database") @EnabledIfSystemProperty(named = "env", matches = "test|prod") void testWithRealDatabase() { ... } 生成带标签的测试报告:Surefire 支持
<systemproperties></systemproperties>输出到 XML,供 Jenkins 等解析分类统计
不需要复杂配置,只要引入 JUnit 5 依赖并合理打标,就能让测试从“全部一起跑”变成“按需精准执行”。对持续交付节奏和研发质量意识都有实质帮助。


















