11. 测试金字塔与测试分层:单测/集成/端到端的策略

把测试变成工程效率工具,而不是瓶颈。

本章目标

把测试从“拖慢交付的成本中心”变成“加速交付的安全网”:更快反馈、更低返工、更稳发布。

你会掌握

单测/集成/端到端的分层策略、覆盖范围选择、flaky 治理,以及如何把测试与门禁组合成可控系统。

真实收益

你能为项目设计一套“快且可信”的测试组合:既能挡住关键风险,又不会把 CI 拖成噩梦。

很多人对测试的误解是:测试越多越好。
专业的视角是:测试是一种“风险投资”。你用时间买确定性。
买得太少,风险爆炸;买得太多,现金流断裂(CI 太慢、团队绕过门禁)。
所以本章的主线是:如何用分层选择把确定性买在“性价比最高的位置”。

1) 测试金字塔:不是口号,是成本与反馈速度的现实

不同测试层级的差异,本质上是三件事:

图 1:测试金字塔(动态)

底层单测多、快、便宜;顶层端到端少、慢、贵。合理比例能让 CI 既快又可信。

E2E 慢、贵、易 flaky Integration 连接依赖,覆盖关键链路 Unit 快、便宜、定位好 Fast Feedback 把大部分问题挡在分钟级 单测是主力 Confidence 关键链路有覆盖 集成/E2E 少而精

2) 三层测试各自的“正确职责”

单元测试(Unit)

集成测试(Integration)

端到端测试(E2E)

一个好用的判断:如果某类测试失败后你需要 30 分钟才能定位问题,那它就不适合大量存在于“PR 必过门禁”。
PR 门禁需要的是“快且定位好”的测试。

3) 影响面与测试选择:不是“全跑”,而是“跑该跑的”

当项目变大,你会遇到一个现实问题:每次都跑全量测试,CI 会变慢;只跑少量测试,又怕漏掉问题。

专业的做法是“影响面驱动”(change-based testing):

图 2:变更影响面 → 测试选择(动态)

把“跑哪些测试”变成可解释决策:改哪里 → 影响谁 → 跑哪类测试。

Change 哪些文件/模块改了 路径/依赖图 Impact 影响哪些组件 风险分层 Tests 选择要跑的集合 unit/integration/e2e

4) Flaky tests:CI 不可信的头号杀手

flaky 指测试在代码不变的情况下,有时通过、有时失败。它会直接摧毁 CI 的可信度,最终大家会形成习惯:红了就重跑,直到绿为止。

flaky 的常见来源

治理原则:flaky 不是“偶发小问题”,它是“系统性噪声”。
你要把它当事故治理:定位根因、修复、加护栏、防止复发。

图 3:flaky 治理闭环(动态)

先识别噪声,再分类定位,最后把修复沉淀为规则与基建,让 flaky 越来越难出现。

Detect 标记 flaky(重试率) Diagnose 分类:时间/并发/依赖 Fix 修复 + 稳定化 Guardrail 规则/基建/隔离(防复发) CI 可信度逐步恢复

5) 本章小结:测试分层 = 把确定性买在最划算的位置

← 上一章:CI 总览 下一章:CI 性能优化 1(并行/缓存)→