正交实验设计:用最少的用例覆盖最多的组合
正交实验设计,说白了就是一套「偷懒」的科学方法。但这不是偷工减料,而是用数学工具帮你找到最优解。
我在项目中遇到过很多次这样的场景:测试一个功能,因子有七八个,每个因子又有三四个水平。如果做全组合,用例数直接爆炸。但正交表能帮你用很少的用例,覆盖绝大多数组合情况。
正交表原理:为什么它能「以小博大」?
正交表的核心理念就四个字:均匀分散,整齐可比。
什么意思呢?我举个例子。假设你有3个因子,每个因子2个水平。全组合需要2×2×2=8个用例。但正交表L4(2³)只需要4个用例。
这4个用例是怎么选出来的?
- 每个因子的每个水平出现次数相同(均匀)
- 任意两个因子的所有水平组合都出现一次(正交)
你想想看,这就保证了用最少的点,代表整个空间。我在做电商系统测试时,就靠这个把下单流程的用例从200多个砍到了30多个,覆盖率反而更高了。
因子与水平设计:别把简单问题搞复杂
设计正交实验的第一步,不是找正交表,而是确定因子和水平。这一步做不好,后面全是白搭。
我个人习惯这样做:
- 列出所有可能影响结果的变量——先不管多少,全列出来
- 筛选关键因子——去掉那些「不管怎么变结果都一样」的因子
- 确定水平——每个因子取几个值?一般2~4个水平就够了
水平设计有个原则:水平之间要有区分度。比如测试支付方式,你选「支付」和「支付宝支付」没问题,但再加个「支付(旧版)」就没必要了——它和「支付」本质上是一个东西。
混合水平正交表:现实世界没有那么多对称
理想情况下,所有因子的水平数都一样。但现实呢?
比如测试一个登录功能:
- 用户名:正确、错误(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多个用例才能发现。
正交实验的核心流程
下面这张图是我自己总结的,每次做正交实验都照着走:
这张图我用了很多年了。每次做正交实验,都按这个流程走一遍,基本不会漏东西。
正交实验设计不是银弹,但它是测试用例收敛的利器。你想想看,108个用例压缩到18个,节省了80%以上的执行时间,而且还能发现关键bug。这笔账怎么算都划算。
最后说一句:正交表不是万能的。如果因子之间有明显的主次关系,或者你需要精确评估每个因子的影响程度,那还是用全因子实验或者响应面法更合适。但如果你只是想快速收敛用例、发现主要问题,正交实验值得一试。