前情介绍:
测试过程中,对于多参数参数多值的情况进行测试用例组织,之前一直使用【正交分析法】进行用例组织,就是把每个参数的所有值分别和其他参数的值做一个全量组合,用Python脚本实现,就是itertools模块中product方法(又称笛卡尔积法),然后再用正交表进行筛选。
pairwise算法
Pairwise (结对)算法源于对传统的正交分析方法优化后得到的产物,Pairwise是L. L. Thurstone(29 May1887 – 30 September 1955)在1927年首先提出来的。他是美国的一位心理统计学家。Pairwise也正是基于数学统计和对传统的正交分析法进行优化后得到的产物。
Pairwise基于如下2个假设:
(1)每一个维度都是正交的,即每一个维度互相都没有交集。
(2)根据数学统计分析,73%的缺陷(单因子是35%,双因子是38%)是由单因子或2个因子相互作用产生的。19%的缺陷是由3个因子相互作用产生的。
因此,pairwise基于覆盖所有2因子的交互作用产生的用例集合性价比最高而产生的。
pairwise算法详解
假设有3个维度,每个维度有几个因子。如下:
浏览器:M(Firefox),O(Opera),IE
操作平台:W(windows),L(Linux),i(iOS)
语言:C(chinese),E(english)
求解:
使用pairwise算法,有多少个测试case?具体是什么case?
我们沿用数学做题的格式。
解:如果不用pairwise算法,我们需要 332=18个测试case。下面是具体的case:
1,M W C
2,MW E
3,M L C
4,M L E
5,M I C
6,M I E
7,O W C
8,O W E
9,O L C
10,O L E
11,O I C
12,O I E
13,P W C
14,P W E
15,P L C
16,P L E
17,P I C
18,P I E
一共有18个,很繁琐。但是这是100%的测试覆盖率,缺陷率也是100%。
现在我们使用pairwise,看看结果如何?
首先咱们从最下方一个18号开始,它是 P I E,两两组合是 PI ,PE ,IE。看这3个组合在以上的相同位置出现过没有,PI在17号,PE在16号,IE在12号出现过。所以18这个case就可以舍去。
最终剩下的如下:
1,MWC
4,MLE
6,MIE
7,OWE
9,OLC
11,OIC
14, PWE
15, PLC
17,PIC
共计9个测试case,节省了50%的测试case。
现在我们从上面开始重新做一次。1号是MWC,两两组合是MW MC WC 都出现过,去掉。最终剩下的是:
2,MWE
4, MLE
5, MIC
8, OWE
10, OLE
11, OIC
13 PWC
15 PLC
18 PIE
这样也是剩下9个测试case,但是具体的case内容不一样。
经过L. L. Thurstone证明,pairwise算法最终剩下的测试case个数肯定相同,但是可以有不同的case组合。
Pairwise算法的效率
Pairwise算法和正交分析法进行比较,当有3个维度,每个维度有4个因子的时候:
(1)正交分析法的case数量:444=64个
(2)Pairwise算法的case数量:20个
Pairwise的case数量是正交设计法的三分之一。当维度越多的时候,效果越明显。当有10个维度的时候 444433322*2=55296个测试case,pairwise为24个。是原始测试用例规模的0.04%。
pairwise算法的比较
Pairwise算法和单因素测试用例设计的比较,能够覆盖到两个维度的正交组合设计。能适当减少遗漏的测试。
Pairwise算法和全正交设计法的比较,全正交设计法,测试case太多,投入的成本太大。Pairwise算法在数学统计分析的基础上,对传统的全正交设计法进行了优化,适当的提高了效率。
现有很多程序都是围绕pairwise算法产生的,最著名的就是ReduceArray;SmartDesgin 和微软的PICT。
不出意外的在PYPI上找到一个pairwise的第三方包:AllPairspy
安装后本身就自带了一个Example的目录,里面有一些使用的例子,以上面的测试需求为例,代码如下:
#!/usr/bin/env python
# encoding: utf-8
"""
Demo of the basic functionality - just getting pairwise/n-wise combinations
"""
from __future__ import print_function
from allpairspy import AllPairs
parameters = [
["Windows", "Linux","MAC"],
["Firefox", "Opera", "IE"],
["Chinese", "English"],
]
# sample parameters are is taken from
# http://www.stsc.hill.af.mil/consulting/sw_testing/improvement/cst.html
print("PAIRWISE:")
for i, pairs in enumerate(AllPairs(parameters)):
print("{:2d}: {}".format(i, pairs))
运行结果:
是不是很方便,很好用~~~以后遇到多因素的测试用例的时候,这个神器还是很好用的,当然前提是你搞懂原理。
而且Pairiwise算法也有它不足的地方:
(1)Pairwise对于维度的分解来说,需要对业务很熟悉。以及需要正交测试法的理论支持。需要中等专业的测试人员才能完成。
(2)pairwise还是有一定的遗漏。相比于全正交设计法来说,pairwise算法对于多于2个因素相互作用所产生的bug,没有覆盖率上会有遗漏。