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 中间时,失败后无法判断是动作出错还是断言条件本身写错,排错时间成倍增加。