Appearance
Surefire 和 Failsafe 怎么配合测试阶段
先说结论
Surefire更适合跑单元测试Failsafe更适合跑集成测试或更慢、更重的测试- 两者最大的差别不是插件名字,而是它们挂在 Maven 生命周期里的阶段不同
一、为什么 Maven 要拆成两个插件
因为测试不是只有一种。
1. 单元测试
更轻、更快,通常只验证本地逻辑,不依赖完整外部环境。
2. 集成测试
更重,可能依赖:
- 数据库
- Redis
- MQ
- 外部服务
- 容器环境
如果把这两类测试全混在一个阶段跑,构建体验和失败语义都会很乱。
二、两者最关键的区别
Surefire
通常绑定在:
test
也就是你执行常规测试时最先跑的那一层。
Failsafe
通常和:
integration-testverify
这些阶段更相关。
它的价值在于:
先让集成测试跑完,再在 verify 阶段统一判断结果和收口。
三、什么时候更适合分开
更适合拆分的场景通常是:
- 单元测试很多,想保持反馈快
- 集成测试依赖环境,跑一次比较重
- CI 里想分层执行测试
- 本地开发不想每次都把重测试一起跑
这种时候,把单测给 Surefire,把集成测试给 Failsafe,会更清楚。
四、最容易踩的坑
1. 测试命名和阶段没统一
结果就是:
- 本该是集成测试的类被单测阶段跑了
- 或者重测试根本没被执行
2. 只配了插件,没想好 CI 策略
比如本地只跑单测,CI 才跑集成测试,这种规则需要明确,不然团队认知会乱。
3. 集成测试失败了却没有在合适阶段收口
这样很容易导致构建结果看起来不一致,排查起来也更别扭。
总结
Surefire 和 Failsafe 的核心不是“哪个更高级”,而是分别服务不同测试层次。单元测试要快、集成测试要稳、CI 阶段要清晰,只要按这个思路拆开,构建链路通常会顺很多。