Test Pyramid
解决什么问题:测试投入有数量上限——不分配比例 = 全部砸在最贵的一层 = 慢到没人跑 = 测试失效。
它是什么
Test Pyramid(测试金字塔) 是 Mike Cohn 提出的测试投入分配原则——
/\
/E2E\ ← 少量:覆盖关键路径,慢、脆、贵
/------\
/ API \ ← 中量:覆盖服务接口契约
/----------\
/ Unit \ ← 大量:覆盖业务逻辑,快、稳、便宜
/--------------\SE@G Ch 11:"A healthy test suite is mostly unit tests, with a smaller layer of integration tests and very few end-to-end tests."
V2 视角(V2.7 B6 权衡):金字塔 = 测试的成本-收益权衡——单元测试 ROI 最高,E2E 最低。反金字塔(冰淇淋锥)= 测试失控。
关键属性
| 属性 | 值/含义 |
|---|---|
| 三层比例 | Unit 70% / Integration 20% / E2E 10% |
| 运行速度 | Unit 毫秒 / Integration 秒 / E2E 分钟 |
| 稳定性 | Unit 高 / Integration 中 / E2E 低 |
| 覆盖范围 | Unit 局部 / Integration 跨组件 / E2E 整系统 |
| 反模式 | 冰淇淋锥(E2E 最多)、反金字塔、单元测试为零 |
| 核心约束 | 比例按价值/成本分配,不按"看起来重要" |
| 判错标准 | 测试套件运行超过 30 分钟 = 比例失衡 |
怎么用
场景 1:单元测试(基底)
测什么:纯逻辑——领域模型、算法、计算:
@Test
void transfer_reducesBalance() {
Account from = new Account(Money.of(100));
Account to = new Account(Money.of(0));
from.transfer(to, Money.of(30));
assertEquals(Money.of(70), from.balance());
}特征:无 Spring、无 DB、无网络——纯 POJO + JUnit。毫秒级。
场景 2:集成测试(中层)
测什么:组件协作——Repository + DB、Service + 外部 Client:
@DataJpaTest
class OrderRepositoryTest {
@Autowired OrderRepository repo;
@Test void saveAndFind() {
repo.save(new Order(...));
assertEquals(1, repo.findAll().size());
}
}特征:启动部分 Spring context,用 H2/Testcontainers。秒级。
场景 3:E2E 测试(顶层)
测什么:关键用户旅程——下单全流程、支付全流程:
Scenario: 用户下单
Given 用户已登录
When 用户点击"下单"
Then 订单状态变为"已创建"
And 库存被扣减
And 支付请求发出特征:启动整个系统,跨服务、跨网络。分钟级,且经常 flaky。
常见误区
- "E2E 测最全"——错。E2E 是必要补充,不是主力。主力是单元测试
- "单元测试越多越好"——也对也不对——纯 getter/setter 不需要测,测业务逻辑
- "所有测试都要 100% 通过率"——错。Flaky E2E 测试应当删除而不是重跑——SE@G Ch 11 强调
- "金字塔是教条"——错。比例可调,但反金字塔一定有问题
- "测试覆盖率 = 质量"——错。覆盖率 100% 但断言无效 = 假阳性。测的不是行,是行为
关键洞察
金字塔 = 测试资源的最优分配——按"价值/成本"比排序,单元测试 ROI 最高。
控制论视角:单元测试 = 单个组件的开环测试,集成/E2E = 闭环测试。闭环测试贵 = 必须少而精。 IDDD Ch 12 视角:领域模型(聚合根)应有 100% 单元测试覆盖——业务规则不能靠 E2E 验证。 SE@G Ch 11 视角:Google 的"小、中、大" 测试三分类——小(unit)、中(integration)、大(e2e),中大测试合计 < 20%。 EDM Ch 9 视角:异步系统的 E2E = Saga 全链路测试,最贵、最必要、最稀缺——要严格选场景。
相关链接
- Contract Test——集成测试的具体形态
- Domain Model Test——单元测试的核心
- [V3 涌现作为] · 权衡——金字塔 = 价值/成本权衡
- [V3 涌现作为] · 分解——金字塔 = 按粒度分解
- 源典:SE@G Ch 11——Google 测试规模
- 源典:EDM Ch 9——事件系统的 E2E