首页/开发/软件测试速查/单元测试 AAA 结构
测试基础与分层67 条

单元测试 AAA 结构

Arrange(准备)、Act(执行)、Assert(断言)三段式组织测试代码,使意图清晰、便于维护;由 Bill Wake 提出并被广泛采用。

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

AAA 是什么

AAA(Arrange-Act-Assert)是组织测试代码的三段式结构:先准备输入与依赖(Arrange),再执行被测动作(Act),最后断言结果(Assert)。由 Bill Wake 提出,目的是让用例一眼看清「前提、动作、预期」。三段之间用空行分隔、必要时加注释,并在每段内只做一类事,评审与排错时都能更快定位问题。

基本信息

出处Bill Wake 提出的测试组织模式
三段Arrange 准备 / Act 执行 / Assert 断言
常见变体Given-When-Then(BDD 表达)、含清理的四段式
适用层级单元测试、接口测试与组件测试均可套用
风格要求每段只做一类事,段间空行分隔,必要时加注释

典型使用场景

  • 评审提速:结构统一,评审人按段落顺序快速理解用例意图。
  • 新成员上手:读代码与模仿成本低,团队风格容易对齐。
  • 失败定位:断言集中一处,失败信息直观、排查路径短。
  • 与参数化组合:只让 Arrange 随数据变化,Act 与 Assert 保持稳定。
  • 重构保护:被测实现变化时结构不塌,断言仍然准确。
  • 教学示例:用最小三段示例讲清测试结构,新人上手快。

AAA 示例

AAA 示例
def test_discount_applies_to_vip():
    # Arrange:准备输入与依赖
    cart = Cart(items=[Item(price=100)], vip=True)

    # Act:只执行一个动作
    total = cart.total()

    # Assert:断言最终结果
    assert total == 90


def test_discount_skipped_for_normal_user():
    # 对照用例只改一个变量
    cart = Cart(items=[Item(price=100)], vip=False)
    assert cart.total() == 100

段落职责

段落做什么常见错误
Arrange构造对象、准备数据、替换依赖塞入断言或业务动作
Act调用被测方法或接口一次多次调用分不清触发点
Assert校验返回值、状态与副作用断言散落在动作前后
清理恢复环境或用夹具自动清理手工清理遗漏污染后续用例
一段里只观察一个行为:需要多个断言时用分组断言机制或拆成多个用例,失败信息更清晰。
从模板开始练:先固定三段骨架,再把重复的「准备依赖」搬进夹具,结构会越来越干净。
断言分散在 Act 中间时,失败后无法判断是动作出错还是断言条件本身写错,排错时间成倍增加。

易错点

  • 断言分散在 Act 中间,失败信息难解读
  • Arrange 过长且隐藏关键依赖,用例可读性下降
  • 一个用例串多个 Act,失败后无法定位是哪一步
  • 在 Assert 段里继续做业务操作,职责混乱、断言不可信
  • 把准备动作过度藏进夹具,读用例时看不到关键前提,排错需来回跳文件

数据来源与参考

  • Bill Wake 提出的 Arrange-Act-Assert(2001)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌