JUnit 5 是什么
JUnit 5 是 Java 生态的主流单元测试框架,由 Jupiter(新编程模型与扩展机制)、Vintage(兼容 JUnit 4 用例)与 Platform(运行引擎)三部分组成。以 @Test 标记用例,@BeforeEach、@BeforeAll 等注解管理准备与清理;默认每个测试方法拿到全新测试实例,保证用例之间互不串扰。Maven、Gradle 与主流 IDE 都原生集成。
基本信息
| 组成 | Jupiter 新模型、Vintage 兼容层、Platform 执行引擎 |
|---|---|
| 生命周期 | 默认 PER_METHOD:每个测试方法用新实例 |
| 类级资源 | @BeforeAll/@AfterAll 默认必须为 static 方法 |
| 断言库 | org.junit.jupiter.api.Assertions 静态导入 |
| 参数化 | 需单独引入 junit-jupiter-params 依赖 |
| 分组与筛选 | @Tag 标签、@DisplayName 可读名、@Disabled 跳过 |
用例示例
用例示例
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
class CalculatorTest {
Calculator calc;
@BeforeEach
void setUp() { calc = new Calculator(); } // 每个用例前全新实例
@Test
void add() { assertEquals(2, calc.add(1, 1)); }
@Test
void divideByZero() {
// 异常分支断言:明确期望的异常类型
assertThrows(ArithmeticException.class, () -> calc.div(1, 0));
}
}典型使用场景
- 服务端单元测试:对领域逻辑与工具类做快速验证。
- 异常分支覆盖:用 assertThrows 精确断言异常类型与抛出条件。
- CI 质量门禁:Maven/Gradle 构建中自动执行,失败即阻断合并。
- 按标签分组:给用例打 smoke、slow 标签,压测冒烟与全量回归分开跑。
- 防挂起保护:@Timeout 给用例设上限,避免 CI 卡死。
- 结构组织:@Nested 嵌套类按行为场景组织用例,报告层次清晰。
常用注解对照
| 注解 | 作用 | 注意点 |
|---|---|---|
| @Test | 标记测试方法 | 默认每方法新实例 |
| @BeforeEach/@AfterEach | 方法级准备与清理 | 每个用例都执行,别放重资源 |
| @BeforeAll/@AfterAll | 类级一次执行 | 默认须 static,适合容器与服务器 |
| @Disabled | 跳过用例并注明原因 | 临时跳过要有跟踪记录 |
| @Tag | 用例分组标签 | 配合构建工具筛选执行 |
| @Timeout | 用例超时上限 | 防 CI 挂起 |
| @ParameterizedTest | 参数化用例 | 需 junit-jupiter-params 依赖 |
默认测试实例生命周期是 PER_METHOD:用例之间不通过实例字段共享状态;确需类级共享时才用 @TestInstance(PER_CLASS)。
重资源(数据库容器、测试服务器)放 @BeforeAll/@AfterAll 只启动一次;放 @BeforeEach 会让每个用例重复启动,套件肉眼可见地变慢。
并行执行默认关闭:需要通过 junit.jupiter.execution.parallel 配置显式开启,开启前先确认用例彼此独立。