目标
每个 PR 都跑全部测试是安全但缓慢;捷径是按“变更到测试”的映射做选择,而让它诚实的,是夜间全量兜底与对逃逸缺陷的召回率度量。映射靠“本来能拦下什么”来挣得信任——每一条逃到夜间或生产的缺陷都是一次免费实验。
步骤要点
- 建变更到测试的映射:从覆盖率数据或静态导入分析推导哪些测试执行哪些源文件,映射作为版本化工件存储。
- PR 上选择执行:对每个 PR 跑映射命中的测试加固定冒烟集,并报告选择规模对比套件规模。
- 夜间全量兜底:保留夜间全量运行,失败按“选择型 PR 本应拦下与否”分类分诊。
- 对逃逸缺陷测召回:每条到达夜间或生产的缺陷,核查映射在 PR 阶段是否会选中某条会失败的测试。
- 召回失败处收紧映射:为每次选择遗漏补上缺失的边(文件到测试),用显式依赖或集成测试打标,让召回单调上升。
排错提示
夜间挂了但 PR 是绿的说明映射有盲区,逃逸分类必须回填边;集成缝隙是覆盖率推导的天然盲点,给跨模块组合行为的测试显式打标;选择率忽大忽小说明映射粒度太粗,按目录而非文件建边更稳定。
适用边界
选择的有效性依赖映射的准确性,重构密集期文件路径大改时要重建映射;召回率是滞后指标,新类型的逃逸要等缺陷发生才会暴露盲区。
代码示例
PR #4821 changed: api/checkout.ts, lib/pricing.ts
map lookup:
api/checkout.ts -> [checkout.e2e, api.contract,
promo.unit] (3 tests)
lib/pricing.ts -> [pricing.unit, promo.unit]
selected: 4 tests + smoke (11) suite: 1,240
PR time: 38 min -> 3.4 min
nightly full: 1 failure (tax/calc.ts)
escaped from PR #4808 (touched tax/calc.ts)
selection-miss: map lacked tax/calc -> tax.e2e edge
-> edge added; recall 87% -> 91%