跑 30 把过 27 把,为什么不算验证通过
这样的句子你一定见过,可能还亲手写过:
“AEB 场景回归测试:执行 30 次,通过 27 次,通过率 90%,达到 90% 的验收线,测试通过。”
语气笃定,格式标准,盖章归档。遗憾的是,这句话经不起推敲——而且差得不是一星半点。这篇文章不用公式,用三个生活常识把问题讲透。
一、抛硬币的道理:你看到的 ≠ 真实存在的
抛 10 次硬币,6 次正面,能下结论”硬币不均匀”吗?不敢——10 次太少,手气成分太大。
测试通过率是完全相同的道理。30 把过 27 把,算出 0.90,这个数只是这一次抽样的手气。软件的真实通过率是客观存在的(由代码质量决定),但你测不完所有情况,只能抽样看几把——换 30 把再测,可能 25 过,也可能 29 过。
统计学给这个”看到的数”起了个名字:点估计——就凭一小把样本,对真值给出的一个估计。它的毛病是:只报答案,不报答案有多可信。
二、一勺汤的道理:真值住在一段范围里
想知道一锅汤咸不咸,你舀一勺尝。舀的勺数越多,心里越有底——但不管舀几勺,你下的结论都应该是”大概这个咸度”,而不是”就是这个咸度”。
通过率也一样。诚实的说法不是”通过率 0.90”,而是”真实通过率大概在某某范围内“。这个范围叫置信区间,范围的靠谱程度叫置信度(比如 95%)。
用标准方法(Wilson 方法)算一下 27/30 这份证据:
真实通过率的 95% 置信区间 = [0.744, 0.965]
盯住下界看:0.744。也就是说,就凭这 30 把,真实通过率完全可能只有 74% 出头——离 90% 的验收线差了十几分。好比一个学生平均分 90,但保底分只有 74,你敢在”保证不低于 90”的承诺书上签字吗?
至于”95% 置信度”到底什么意思:不是”真值有 95% 概率在区间里”,而是——这套算区间的算法,用 100 次,大约 95 次能罩住真值。真值是不动的鱼,区间是每次撒下去的网,95% 说的是这套撒网手法的命中率。
三、一张值得收藏的表:到底要跑多少把
把勺子越加越多,看看结论怎么变(全部按 95% 置信度算):
| 实测结果 | 表面通过率 | 保底分(区间下界) | 敢声明”≥ 0.90”吗 |
|---|---|---|---|
| 30 把过 27 | 0.90 | 0.744 | 不敢 |
| 100 把过 90 | 0.90 | 0.844 | 还是不敢 |
| 300 把过 285 | 0.95 | 0.926 | 勉强敢 |
| 300 把全过 | 1.00 | 0.987 | 敢,且接近 0.99 |
三个反直觉的道理:
- 30 把不够,100 把也不够。表面通过率贴着验收线的时候,需要的样本量比直觉大十倍;
- 满分声明最贵。行业里有条经验法则叫”三分律”:连跑 N 把零失败,最多只能保证失败率低于 3/N。想证明失败率不到 1%?连跑 300 把一把都不能挂。想证明 0.999?约 3000 把零失败;
- 所以”我们跑了 50 把全过,没问题”——这话其实只能撑住”失败率 < 6%”的结论,但评审会上大家听到的是”没问题”。
四、测试报告里三个常见的坑
坑一:拿平均分当保底分。 表面通过率 ≥ 验收线就放行。可从表里看,30 把的 0.90 和 300 把的 0.90,证据强度天差地别,报告上却长得一模一样。
坑二:挂科了补考,考过为止。 用例 FAIL 了,点重跑,过了就当没事。代价是注水:一个真实通过率只有 50% 的不稳定用例,补考两次后”最终通过”的概率高达 75%。更要命的是,不稳定本身就是重要信号(环境有随机因素、代码有竞态、时序假设错了),补考按钮把信号埋了。
坑三:分数线拍脑袋。 验收线为什么定在 90% 而不是 85%?答不上来,这条线就是装饰:定松了拦不住坏的,定紧了冤杀好的。正经做法是先测出正常版本的基线水平,再按”基线减去可接受的退化量”把线推导出来(这套方法叫裕度分析,本专栏第 4 篇细讲)。
五、正确的姿势,其实就三招
第一招:看保底分,不看平均分。 验收线写的是”通过率 ≥ 0.90”,实际判的应该是”保底分(95% 下界)≥ 0.90”。不够就补样本——要跑多少把是统计学定的,不是排期定的。
第二招:边考边算,够了就收卷。 不必每次都跑满 300 把:跑一把算一把证据,证据够了立刻下结论,不够接着跑。这叫序贯检验(SPRT),平均能省三到五成的执行量——门禁不是慢,冤枉路才慢。
第三招:零失败声明有现成公式。 想证明”可靠性 0.99、置信度 95%”,需要多少把零失败,统计学有公式直接算(约 300 把),写进测试计划里,而不是测完了回头凑故事。
六、评审报告时,问三句
下次任何一份测试报告递到你面前,问三句:
- 跑了多少把?(样本量决定证据强度的天花板)
- 保底分多少?(别看表面通过率,看 95% 下界)
- 验收线怎么定的?(有推导过程的是门禁,没有的是装饰)
三句都答得上来,才值得签字。答不上来的,客气点说,那是一份”测试活动记录”,不是一份”验证结论”。
七、这套判定已经做成了引擎
Cyclone Core 的判定引擎把上面三招内置成默认行为,不靠工程师自觉:
- 保底分判定——验收线直接作用在统计下界上(已支持);
- 序贯检验——证据够了提前判 PASS/FAIL,省执行量(已支持);
- 判定证据链——每次判定附带场景哈希、日志摘要和失败快照,第三方可以自己复算出同一个结论(已支持)。
因为当报告要递给监管机构、审核员甚至法庭的时候,”我们测过了”不值钱,”你可以自己复算“才值钱。
附:名词解释(按出场顺序)
| 名词 | 通俗解释 |
|---|---|
| 回归测试 | 每次改完代码,把原来的用例再跑一遍,确认没把旧功能改坏 |
| AEB | 自动紧急制动:快撞上时车辆自己刹车。本文举例的被测功能 |
| 点估计 | 用一小把样本算出的那个估计值,如 27/30 = 0.90。只报答案,不报可信度 |
| 真实通过率 | 客观存在但永远测不全的真值,一切抽样都是对它的猜测 |
| 置信区间 | 根据样本算出的一个范围,真值大概率住在里面,如 [0.744, 0.965] |
| 置信度 | 这套”算范围的方法”的靠谱程度。95% = 用 100 次约 95 次能罩住真值 |
| 下界(保底分) | 置信区间的左端点:最保守情况下真值也不会低于它。判定该看它 |
| Wilson 方法 | 计算通过率置信区间的一种标准算法,小样本下也稳定 |
| 三分律 | 经验法则:连跑 N 把零失败,只能保证失败率低于 3/N |
| flaky(不稳定用例) | 同一个用例不改代码,时而过时不过的”神经刀”用例 |
| 门禁(质量门禁) | CI 流水线上的自动关卡:不达标就不许合入/发布 |
| SPRT(序贯检验) | 边跑边算证据的判定方法:证据够了提前收卷,不够继续采样 |
| 裕度分析 | 推导验收线的方法:先测基线,再按”基线 − 可接受退化量”定阈值 |
| 证据链 | 让判定结论可被第三方复算的一整套记录:场景哈希、日志摘要、失败快照 |
| 复算 | 拿着原始证据重新算一遍,验证结论没被修饰过 |
(文中区间数值为 Wilson 95% 置信区间的统计学计算结果;产品能力以 Cyclone Core 当前版本为准。)
下一步:
了解 Cyclone 判定引擎