带缓存的flakey测试套件:多变量试验成功前期望次数计算问询
量化Flakey测试导致的期望重试次数
这个问题刚好戳中了很多开发团队的痛点——flakey测试简直是隐形的时间小偷!咱们用概率论的方法一步步拆解,算出成功前的期望试验次数。
核心思路:容斥原理+期望线性性
先明确规则:每次运行套件时,只跑之前没通过的测试,通过的会被缓存;直到所有测试都通过为止,我们要算总共需要运行多少次的期望值。
这里的关键技巧是利用期望的线性性结合容斥原理,最终可以推导出通用公式:
$$
E = \sum_{k=1}^n (-1)^{k+1} \cdot \sum_{1 \leq i_1 < i_2 < \dots < i_k \leq n} \frac{1}{1 - \prod_{j=1}^k (1-p_{i_j})}
$$
公式拆解(人话版)
我们一步步拆解这个公式的含义:
- 单个测试的情况:当只有一个测试$T_i$时,k=1,公式简化为$\frac{1}{p_i}$——这就是几何分布的期望,很直观:每次成功概率是$p_i$,平均需要$\frac{1}{p_i}$次才能通过。
- 两个测试的情况:比如$T_1(p_1)$和$T_2(p_2)$,公式变成:
$$
E = \frac{1}{p_1} + \frac{1}{p_2} - \frac{1}{1 - (1-p_1)(1-p_2)}
$$
举个例子:如果两个测试的成功概率都是0.5,代入得$E=2+2-\frac{1}{0.75}=\frac{8}{3}≈2.67$次,和实际推导的结果完全一致。 - n个测试的通用情况:
- 先计算所有单个测试的期望重试次数之和(k=1的项);
- 再减去所有两两测试组合的“重复计算”部分(k=2的项)——因为一次运行可能同时通过两个测试,避免重复统计;
- 接着加回三个测试组合的修正项(k=3的项),以此类推,直到k=n的最后一项。
特殊场景简化
如果所有测试的成功概率都是$p$,公式可以进一步简化为:
$$
E = \sum_{k=1}^n (-1)^{k+1} \cdot \binom{n}{k} \cdot \frac{1}{1 - (1-p)^k}
$$
比如3个测试,每个成功概率0.5,代入得$E≈3.14$次,完全符合实际场景的预期。
实际意义
这个公式能帮你实打实量化时间损耗:比如每次运行测试套件需要5分钟,期望重试次数是3,那平均每次checkin要花15分钟在测试上——和无flakey测试的5分钟比,差值就是团队被浪费的时间。你还可以单独计算某个flakey测试的贡献,判断是否值得投入精力优先修复它。
内容的提问来源于stack exchange,提问作者Airball
相关产品推荐
相关产品推荐

