自动化测试66 条

JUnit 5 入门

JUnit 5 以 @Test 标记用例,@BeforeEach/@AfterEach 做方法级准备与清理,@BeforeAll/@AfterAll(静态方法)管理类级资源;默认每个测试方法拿到新的测试实例。

软件测试速查开发更新于 2026-10-13

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 配置显式开启,开启前先确认用例彼此独立。

易错点

  • @BeforeAll/@AfterAll 未声明为 static(未开启 PER_CLASS 时):直接运行报错,类级资源初始化失败。
  • 在 @BeforeEach 中启动重资源:每个用例都重新拉起容器或服务器,执行时间成倍增加。
  • 用例之间隐含执行顺序依赖:JUnit 默认不保证方法顺序,单跑通过、全量随机失败。
  • 异常用例只用 try/catch 包一层:异常类型与消息写错也能通过,应用 assertThrows 精确断言。
  • 断言写得太粗(只断言非空):逻辑错误照样通过,用 assertEquals 等给出精确期望值。

数据来源与参考

  • JUnit 5 User Guide(junit.org)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌