正交实验设计:用最少的用例覆盖最多的组合

正交实验设计,说白了就是一套「偷懒」的科学方法。但这不是偷工减料,而是用数学工具帮你找到最优解。

我在项目中遇到过很多次这样的场景:测试一个功能,因子有七八个,每个因子又有三四个水平。如果做全组合,用例数直接爆炸。但正交表能帮你用很少的用例,覆盖绝大多数组合情况。

正交表原理:为什么它能「以小博大」?

正交表的核心理念就四个字:均匀分散,整齐可比。

什么意思呢?我举个例子。假设你有3个因子,每个因子2个水平。全组合需要2×2×2=8个用例。但正交表L4(2³)只需要4个用例。

这4个用例是怎么选出来的?

  • 每个因子的每个水平出现次数相同(均匀)
  • 任意两个因子的所有水平组合都出现一次(正交)

你想想看,这就保证了用最少的点,代表整个空间。我在做电商系统测试时,就靠这个把下单流程的用例从200多个砍到了30多个,覆盖率反而更高了。

核心公式:正交表记作 Ln(mk),其中 n 是行数(用例数),m 是水平数,k 是因子数。

因子与水平设计:别把简单问题搞复杂

设计正交实验的第一步,不是找正交表,而是确定因子和水平。这一步做不好,后面全是白搭。

我个人习惯这样做:

  1. 列出所有可能影响结果的变量——先不管多少,全列出来
  2. 筛选关键因子——去掉那些「不管怎么变结果都一样」的因子
  3. 确定水平——每个因子取几个值?一般2~4个水平就够了
避坑指南:我曾经犯过一个错误——把「用户类型」分了10个水平。结果正交表选不出来,用例数反而比全组合还多。后来我合并成「新用户」「老用户」「VIP用户」3个水平,问题就解决了。

水平设计有个原则:水平之间要有区分度。比如测试支付方式,你选「支付」和「支付宝支付」没问题,但再加个「支付(旧版)」就没必要了——它和「支付」本质上是一个东西。

混合水平正交表:现实世界没有那么多对称

理想情况下,所有因子的水平数都一样。但现实呢?

比如测试一个登录功能:

  • 用户名:正确、错误(2个水平)
  • 密码:正确、错误、为空(3个水平)
  • 验证码:正确、错误、过期(3个水平)

因子水平数不一样,怎么办?用混合水平正交表。

常见的混合水平正交表有:

正交表 说明 适用场景
L8(4¹×2⁴) 1个4水平因子 + 4个2水平因子 一个关键因子需要细粒度测试
L12(3¹×2⁴) 1个3水平因子 + 4个2水平因子 一个因子三态,其余二态
L18(6¹×3⁶) 1个6水平因子 + 6个3水平因子 复杂业务场景

嗯,这里要注意:混合水平正交表不是随便拼的。你得查标准表,或者用工具生成。我一般用Allpairs或者PICT,手算太容易出错了。

实际案例:电商下单场景

好了,理论讲完了。咱们来点实际的。

假设你要测试一个电商下单功能。影响下单成功的因子有:

  • 商品类型:实物、虚拟商品(2个水平)
  • 支付方式:、支付宝、银行卡(3个水平)
  • 用户等级:普通、会员、VIP(3个水平)
  • 优惠券:无、满减、折扣(3个水平)
  • 收货地址:国内、海外(2个水平)

全组合需要 2×3×3×3×2 = 108个用例。太多了。

查一下混合水平正交表,L18(2¹×3⁴) 刚好匹配——1个2水平因子,4个3水平因子。但我们有2个2水平因子(商品类型和收货地址),怎么办?

我的做法是:把其中一个2水平因子「升级」成3水平。比如「收货地址」可以改成「国内」「海外」「港澳台」,这样就变成3水平了。或者直接用L36表,但用例数会多一些。

最终我选了L18表,调整后得到18个用例:

用例 商品类型 支付方式 用户等级 优惠券 收货地址
1实物普通无国内
2实物支付宝会员满减海外
3实物银行卡VIP折扣港澳台
4虚拟会员折扣港澳台
5虚拟支付宝VIP无国内
6虚拟银行卡普通满减海外
..................

18个用例覆盖了所有因子的所有水平组合。我实际跑下来,发现了一个只有「虚拟商品+银行卡+海外地址」才会触发的支付失败bug。如果做全组合,这个bug可能要到第80多个用例才能发现。

注意:正交实验不能保证发现所有bug。它只能保证「任意两个因子的组合都被覆盖到」。如果bug需要三个因子同时满足特定条件才能触发,正交表可能漏掉。这时候需要结合边界值分析和场景法来补充。

正交实验的核心流程

下面这张图是我自己总结的,每次做正交实验都照着走:

1. 确定因子与水平 2. 选择正交表 3. 设计测试用例 4. 执行测试 5. 分析结果 6. 补充遗漏场景 发现问题?回到步骤1调整因子 正交实验设计核心流程

这张图我用了很多年了。每次做正交实验,都按这个流程走一遍,基本不会漏东西。

我的经验:步骤6「补充遗漏场景」很多人会忽略。正交表覆盖的是「两两组合」,但业务上有些「三三组合」是必须测的。比如电商下单中「虚拟商品+折扣券+海外地址」这个组合,虽然正交表没覆盖到,但业务上很重要。我会单独加一个用例。

正交实验设计不是银弹,但它是测试用例收敛的利器。你想想看,108个用例压缩到18个,节省了80%以上的执行时间,而且还能发现关键bug。这笔账怎么算都划算。

最后说一句:正交表不是万能的。如果因子之间有明显的主次关系,或者你需要精确评估每个因子的影响程度,那还是用全因子实验或者响应面法更合适。但如果你只是想快速收敛用例、发现主要问题,正交实验值得一试。

可可精品资料库