自动化测试66 条

JUnit 5 断言

JUnit 5 断言集中在 org.junit.jupiter.api.Assertions:assertEquals、assertTrue、assertThrows、assertAll 等;assertAll 会执行完所有断言再汇总报告,减少「修一个跑一次」的往返。

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

JUnit 5 断言是什么

JUnit 5 断言集中在 org.junit.jupiter.api.Assertions:assertEquals、assertTrue、assertThrows、assertAll 等。assertAll 会执行完所有分组断言再汇总报告,减少「修一个跑一次」的往返;Java 项目也常搭配 AssertJ 使用链式断言,集合比较与失败信息更直观。

基本信息

来源包org.junit.jupiter.api.Assertions
常用方法assertEquals、assertTrue 与 assertFalse、assertNull、assertThrows、assertAll
异常断言assertThrows 返回异常对象,可继续断言消息
组合断言assertAll 全部执行后汇总失败,不中途停止
生态搭配AssertJ 链式断言,集合与失败信息更直观

断言示例

断言示例
// 基本断言:期望值在前,实际值在后
assertEquals(2, calc.add(1, 1));
// 异常断言:返回值可继续校验消息
var ex = assertThrows(IllegalArgumentException.class, () -> parse("x"));
assertEquals("bad input", ex.getMessage());
// 组合断言:全部执行后汇总报告
assertAll("user",
    () -> assertEquals("alice", user.name()),
    () -> assertTrue(user.active()));

典型使用场景

  • 单元测试:返回值、状态与异常路径的标准断言。
  • 多字段校验:assertAll 一次性核对对象多个属性。
  • 异常契约:断言异常类型与错误消息两个要素。
  • 迁移旧代码:从 JUnit 4 迁移时对应断言方法基本同名。
  • 与参数化结合:每个数据组独立报告失败。
  • CI 报告:失败消息直接给出期望与实际值,定位快。

补充能力

能力方法说明
浮点容差assertEquals(delta)避免精度误差误报
前置跳过assumeTrue条件不满足时跳过
超时断言assertTimeout限定代码块执行时长

写法与失败信息

写法失败信息建议
assertEquals(期望, 实际)显示两侧值参数顺序别写反
assertTrue(a.equals(b))只报 false改用 assertEquals
assertThrows返回异常对象继续断言消息与原因
断言消息里写明业务上下文(订单号、用例目的),CI 上排错不必翻代码。
超时断言防挂死:assertTimeout 适合验证接口与后台任务的最长执行时间,避免套件被单条用例拖住。
assertAll 适合「同一对象的多项校验」,但分组要克制:太多无关断言混在一组,报告噪音大。
迁移时统一 import 来源:同一文件混用两代断言类,行为差异容易被评审看漏。

易错点

  • 期望值与实际值写反,失败信息误导排查方向
  • 用 assertTrue(a.equals(b)) 替代 assertEquals,失败时看不到两侧值
  • 只断言异常类型不断言消息,业务错误被泛化异常掩盖
  • 断言消息写成占位文本,排错时没有增量信息
  • 把断言与业务动作混在同一行链式调用里,失败后定位不到触发步骤
  • 容差参数开得过大,把真实的计算偏差也一并掩盖

数据来源与参考

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