接口用例库 1800+ 条,团队想「瘦身」但没人能给出客观判据:怎么给每条用例算一个可解释的「价值分」?
该问题的正文、回答与讨论。
【背景】 我维护一条 B 端 SaaS 的接口自动化:Python 3.11 + pytest 7.4 + httpx,用例 1800+ 条,跑在 4 人共享的 staging 上(MySQL 8 + Redis 7 + 1 个 Kafka 消费者服务)。一年下来,全量回归一次 43 分钟,CI 每晚一轮 + 每次 MR 一轮。
上个月主管拍板:用例库太胖了,砍一批「低价值」的。听起来很对——就像体检报告,指标越多越显得专业,但真出问题时你只会看那三四个关键项;用例库同理,跑得越久越像「老黄历」,里面混了一堆「占着跑道、从不起飞」的僵尸用例。可一旦落到「到底砍哪 400 条」,团队就卡住了,因为「低价值」三个字没有可执行的定义。
【现象】
1)按「历史拦截记录」筛:把 CI 日志翻了一年,1800 条里只有 27% 至少拦过一次真 bug,剩下 73% 一条都没拦过。但「没拦过」≠「没用」——它可能只是运气好,对应的那类 bug 一年才来一次;
2)按「断言强度」筛:用正则扫了一遍,约 22% 的用例断言只到 resp.status_code == 200 或 resp.json() is not None 这一层。但断言弱 ≠ 用例低价值——有些用例守的是关键业务路径,只是当年写得糙,该补断言而不是砍;
3)按「执行耗时」筛:耗时 Top 50 里有 12 条是「造数 8 个前置实体」的重链路用例,耗时 Top 50 里也有 18 条是纯 CRUD 的轻用例。耗时高不等于价值高(重链路 ≠ 关键业务),耗时低也不等于价值低(轻量断言可能守着一个 P0 资金路径);
4)按「flaky 历史」筛:过去 3 个月有 60+ 条用例被标记 flaky(单跑绿、重跑才过),但 flaky 是「环境 / 顺序 / 数据」问题,不是「业务价值」问题——把 flaky 的砍了,等于把「最难维护但最关键」的那批用例直接扔了。
四个维度单独看都不够用,叠在一起又互相打架(一条用例断言弱 + flaky + 没拦过 bug,但它守的是资金路径,砍了就是事故)。团队现在的做法是「投票砍」:4 个人各砍 50 条,交集保留、并集砍掉——结果砍了 110 条,其中 3 条后来在 MR 回归里拦到了真 bug,被业务方追着问「为什么没跑」。
【已尝试】
- 让每条用例写「价值标签」(P0 资金 / P1 核心 / P2 边缘):写了 3 个月,标签和实际拦截率相关性只有 0.2,基本等于没写;
- 用变异测试的思路:删一条用例 → 跑全量 → 看有没有别的用例兜住。理论完美,但 1800 条 × 43 分钟一轮 = 不可行,哪怕只跑 100 条采样也是 70+ 小时;
- 把断言弱 + 耗时高 + flaky 三条「同时命中」的用例直接砍:砍了 60 条,其中 2 条后来在灰度回归里漏掉了真 bug(一个金额精度断言、一个状态机跳变断言)。
【期望得到的答案形态】 1)一套可计算的用例价值分:输入是「历史拦截记录、断言强度、覆盖的接口 / 字段、执行耗时、flaky 历史、改动频率」,输出是一个 0–1 的分数或 P0/P1/P2 分层。最好给一个具体的打分公式或决策树,能直接写成 pytest 插件或 CI 脚本跑在现有 1800 条上; 2)变异测试的采样策略:不跑全量,怎么抽样?按「断言强度低 + 覆盖字段重叠度高」优先采样?采样多少条能给出有统计意义的「兜底率」?最好带一个最小可运行的脚本框架(pytest + 变异注入 + 结果聚合); 3)「断言弱但业务关键」和「断言强但业务边缘」这两类用例,在瘦身决策里应该怎么处理——是补断言留、还是降级保留、还是直接砍?有没有一个可执行的判断清单(比如「断言弱 + 覆盖字段数 < 3 + 一年没拦过 → 砍;断言弱 + 覆盖字段数 ≥ 5 → 补断言留」); 4)砍完之后怎么验证没砍错:除了「灰度 / 生产兜底」这种被动方案,有没有主动的验证手段(比如把砍掉的用例转成「契约测试」或「流量回放」,用更便宜的方式继续守着)?
希望答案能落到「下周就能开工」的粒度:具体公式、脚本框架或决策清单都行,纯理论可以但最好带一个能在 1800 条用例上实际跑起来的最小例子。