Skip to content

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:单元测试(基底) ​

测什么:纯逻辑——领域模型、算法、计算:

java
@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:

java
@DataJpaTest
class OrderRepositoryTest {
    @Autowired OrderRepository repo;
    @Test void saveAndFind() {
        repo.save(new Order(...));
        assertEquals(1, repo.findAll().size());
    }
}

特征:启动部分 Spring context,用 H2/Testcontainers。秒级。

场景 3:E2E 测试(顶层) ​

测什么:关键用户旅程——下单全流程、支付全流程:

gherkin
Scenario: 用户下单
  Given 用户已登录
  When 用户点击"下单"
  Then 订单状态变为"已创建"
  And 库存被扣减
  And 支付请求发出

特征:启动整个系统,跨服务、跨网络。分钟级,且经常 flaky。

常见误区 ​

  1. "E2E 测最全"——错。E2E 是必要补充,不是主力。主力是单元测试
  2. "单元测试越多越好"——也对也不对——纯 getter/setter 不需要测,测业务逻辑
  3. "所有测试都要 100% 通过率"——错。Flaky E2E 测试应当删除而不是重跑——SE@G Ch 11 强调
  4. "金字塔是教条"——错。比例可调,但反金字塔一定有问题
  5. "测试覆盖率 = 质量"——错。覆盖率 100% 但断言无效 = 假阳性。测的不是行,是行为

关键洞察 ​

金字塔 = 测试资源的最优分配——按"价值/成本"比排序,单元测试 ROI 最高。

控制论视角:单元测试 = 单个组件的开环测试,集成/E2E = 闭环测试。闭环测试贵 = 必须少而精。 IDDD Ch 12 视角:领域模型(聚合根)应有 100% 单元测试覆盖——业务规则不能靠 E2E 验证。 SE@G Ch 11 视角:Google 的"小、中、大" 测试三分类——小(unit)、中(integration)、大(e2e),中大测试合计 < 20%。 EDM Ch 9 视角:异步系统的 E2E = Saga 全链路测试,最贵、最必要、最稀缺——要严格选场景。

相关链接 ​

从名家方法论与工程化思路中蒸馏出自己的工程体系。