跑 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

三个反直觉的道理:

  1. 30 把不够,100 把也不够。表面通过率贴着验收线的时候,需要的样本量比直觉大十倍;
  2. 满分声明最贵。行业里有条经验法则叫”三分律”:连跑 N 把零失败,最多只能保证失败率低于 3/N。想证明失败率不到 1%?连跑 300 把一把都不能挂。想证明 0.999?约 3000 把零失败;
  3. 所以”我们跑了 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 把),写进测试计划里,而不是测完了回头凑故事。

六、评审报告时,问三句

下次任何一份测试报告递到你面前,问三句:

  1. 跑了多少把?(样本量决定证据强度的天花板)
  2. 保底分多少?(别看表面通过率,看 95% 下界)
  3. 验收线怎么定的?(有推导过程的是门禁,没有的是装饰)

三句都答得上来,才值得签字。答不上来的,客气点说,那是一份”测试活动记录”,不是一份”验证结论”。

七、这套判定已经做成了引擎

Cyclone Core 的判定引擎把上面三招内置成默认行为,不靠工程师自觉:

因为当报告要递给监管机构、审核员甚至法庭的时候,”我们测过了”不值钱,”你可以自己复算“才值钱。


附:名词解释(按出场顺序)

名词 通俗解释
回归测试 每次改完代码,把原来的用例再跑一遍,确认没把旧功能改坏
AEB 自动紧急制动:快撞上时车辆自己刹车。本文举例的被测功能
点估计 用一小把样本算出的那个估计值,如 27/30 = 0.90。只报答案,不报可信度
真实通过率 客观存在但永远测不全的真值,一切抽样都是对它的猜测
置信区间 根据样本算出的一个范围,真值大概率住在里面,如 [0.744, 0.965]
置信度 这套”算范围的方法”的靠谱程度。95% = 用 100 次约 95 次能罩住真值
下界(保底分) 置信区间的左端点:最保守情况下真值也不会低于它。判定该看它
Wilson 方法 计算通过率置信区间的一种标准算法,小样本下也稳定
三分律 经验法则:连跑 N 把零失败,只能保证失败率低于 3/N
flaky(不稳定用例) 同一个用例不改代码,时而过时不过的”神经刀”用例
门禁(质量门禁) CI 流水线上的自动关卡:不达标就不许合入/发布
SPRT(序贯检验) 边跑边算证据的判定方法:证据够了提前收卷,不够继续采样
裕度分析 推导验收线的方法:先测基线,再按”基线 − 可接受退化量”定阈值
证据链 让判定结论可被第三方复算的一整套记录:场景哈希、日志摘要、失败快照
复算 拿着原始证据重新算一遍,验证结论没被修饰过

(文中区间数值为 Wilson 95% 置信区间的统计学计算结果;产品能力以 Cyclone Core 当前版本为准。)

下一步:

了解 Cyclone 判定引擎