11. 测试金字塔与测试分层:单测/集成/端到端的策略
把测试变成工程效率工具,而不是瓶颈。
本章目标
把测试从“拖慢交付的成本中心”变成“加速交付的安全网”:更快反馈、更低返工、更稳发布。
你会掌握
单测/集成/端到端的分层策略、覆盖范围选择、flaky 治理,以及如何把测试与门禁组合成可控系统。
真实收益
你能为项目设计一套“快且可信”的测试组合:既能挡住关键风险,又不会把 CI 拖成噩梦。
很多人对测试的误解是:测试越多越好。
专业的视角是:测试是一种“风险投资”。你用时间买确定性。
买得太少,风险爆炸;买得太多,现金流断裂(CI 太慢、团队绕过门禁)。
所以本章的主线是:如何用分层与选择把确定性买在“性价比最高的位置”。
专业的视角是:测试是一种“风险投资”。你用时间买确定性。
买得太少,风险爆炸;买得太多,现金流断裂(CI 太慢、团队绕过门禁)。
所以本章的主线是:如何用分层与选择把确定性买在“性价比最高的位置”。
1) 测试金字塔:不是口号,是成本与反馈速度的现实
不同测试层级的差异,本质上是三件事:
- 成本:写起来难不难、维护成本高不高
- 速度:跑一次要多久
- 定位:失败时能否快速定位到根因
图 1:测试金字塔(动态)
底层单测多、快、便宜;顶层端到端少、慢、贵。合理比例能让 CI 既快又可信。
2) 三层测试各自的“正确职责”
单元测试(Unit)
- 测什么:纯逻辑、边界条件、复杂分支、异常处理
- 为什么值钱:快、定位好、能覆盖大量分支
- 典型误区:过度 mock 到“测的不是系统”,导致测试通过但真实系统仍会坏
集成测试(Integration)
- 测什么:模块之间的真实连接(数据库、缓存、消息队列、第三方 API)
- 为什么值钱:能抓住“契约不一致”“配置错误”“迁移失败”等真实事故来源
- 典型误区:把集成测试当端到端用,数量爆炸、速度崩溃
端到端测试(E2E)
- 测什么:关键用户路径(登录、下单、支付等)
- 为什么值钱:覆盖“系统整体是否还能用”的底线
- 典型误区:把 E2E 当主要回归手段,最终得到一个又慢又 flaky 的 CI
一个好用的判断:如果某类测试失败后你需要 30 分钟才能定位问题,那它就不适合大量存在于“PR 必过门禁”。
PR 门禁需要的是“快且定位好”的测试。
PR 门禁需要的是“快且定位好”的测试。
3) 影响面与测试选择:不是“全跑”,而是“跑该跑的”
当项目变大,你会遇到一个现实问题:每次都跑全量测试,CI 会变慢;只跑少量测试,又怕漏掉问题。
专业的做法是“影响面驱动”(change-based testing):
- 根据改动路径/依赖图决定跑哪些测试
- 按风险分层:高风险模块更严格,低风险模块更轻
- 关键链路永远有少量 E2E 兜底
图 2:变更影响面 → 测试选择(动态)
把“跑哪些测试”变成可解释决策:改哪里 → 影响谁 → 跑哪类测试。
4) Flaky tests:CI 不可信的头号杀手
flaky 指测试在代码不变的情况下,有时通过、有时失败。它会直接摧毁 CI 的可信度,最终大家会形成习惯:红了就重跑,直到绿为止。
flaky 的常见来源
- 时间:依赖真实时间、sleep、超时边界不稳定
- 并发:共享状态、资源争用、顺序依赖
- 外部依赖:网络、第三方服务、环境差异
- 不确定数据:随机数、未固定的排序
治理原则:flaky 不是“偶发小问题”,它是“系统性噪声”。
你要把它当事故治理:定位根因、修复、加护栏、防止复发。
你要把它当事故治理:定位根因、修复、加护栏、防止复发。
图 3:flaky 治理闭环(动态)
先识别噪声,再分类定位,最后把修复沉淀为规则与基建,让 flaky 越来越难出现。
5) 本章小结:测试分层 = 把确定性买在最划算的位置
- 单测是主力:快、便宜、定位好。
- 集成测试覆盖关键连接点:配置/契约/迁移是事故高发区。
- E2E 少而精:兜住关键用户路径,不要让它淹没 CI。
- flaky 必须治理:不治理,CI 会失去可信度并被绕过。