Pairwise算法简介
Pairwise是L. L. Thurstone(29 May1887 – 30 September 1955)在1927年首先提出来的。他是美国的一位心理统计学家。Pairwise也正是基于数学统计和对传统的正交分析法进行优化后得到的产物。
测试过程中,对于多参数参数多值的情况进行测试用例组织,把每个参数的所有值分别和其他参数的值做一个全量组合,就是正交分析法, 优点是测试用例覆盖率100%,缺点测试用例数量庞大,执行用例消耗的人工巨大。
Pairwise (结对)算法源于对传统的正交分析方法优化后得到的产物,它的理论来自于数学统计。
核心理念
1、一组测试用例(每个用例有3个参数的值组成,如[业务类型,证件类型,联系方式])中每一个2个元素组合起来,两两组合,就有3种组合方式(有位置的[业务类型,证件类型],[业务类型,联系方式],[证件类型,联系方式]);
2、这第一组测试用两两组合出的3种组合方式,与其他组元素的对比原则是 :[业务类型,证件类型]只会和其他组的第一个元素对比,[业务类型,联系方式]只会和其他组中第二个元素对比;
如果[业务类型,证件类型],[业务类型,联系方式],[证件类型,联系方式] 这三个元素分别出现在其余有效组相同位置的元素中,就可以认为这一组Case为多余Case,并进行删除。
3、最终得到测试用例,就是结对算法计算出来的最优测试用例集合.
对这段说明写个例子,如果一个测试场景有业务类型
,证件类型
,联系方式
三个字段要填,它们可选值如图, 全覆盖的话需要3*3*3
=27个用例.
上面第2点,体现在图上就是:
- 前两位是
1和a
的,只取一个,其他全部删除. - 后两位是
a和x
的,只第一个,后面全部删除. - 前两位是
1和b
的,只第一个,后面全部删除. - …
- 依次类推下去,就只剩下图片圈起来的9个组合.
Pairwise基于如下2个假设:
(1)每一个维度都是正交的,即每一个维度互相都没有交集。
(2)根据数学统计分析,73%的缺陷(单因子是35%,双因子是38%)是由单因子或2个因子相互作用产生的。19%的缺陷是由3个因子相互作用产生的。
因此,pairwise基于覆盖所有2因子的交互作用产生的用例集合性价比最高而产生的。
再来个例子:
银行的柜面开户业务,涉及十多个输入框,每个输入框都有多个选项,如果要全覆盖所有参数,用例数会十分庞大.
选其中5个输入框选项为例,
['开卡','开账户','开存折'],
['身份证','军官证','户口本','护照'],
['手机','固定电话'],
['现金','转账','待销账'],
['个人活期存款','随心取','个人定活','个人整存整取'],
这五个输入框的选项,完全组合的话,有3*4*2*3*4=288
个测试用例.
然而用Pariwise算法过滤后,只需要测试19个用例即可覆盖绝大多数场景.
代码演示
from allpairspy import AllPairs
parameters = [
['开卡','开账户','开存折'],
['身份证','军官证','户口本','护照'],
['手机','固定电话'],
['现金','转账','待销账'],
['个人活期存款','随心取','个人定活','个人整存整取'],
]
print("PAIRWISE:")
for i, pairs in enumerate(AllPairs(parameters)):
print("{:2d}: {}".format(i, pairs))
输入结果
PAIRWISE:
0: ['开卡', '身份证', '手机', '现金', '个人活期存款']
1: ['开账户', '军官证', '固定电话', '转账', '个人活期存款']
2: ['开存折', '户口本', '固定电话', '待销账', '随心取']
3: ['开存折', '护照', '手机', '转账', '个人定活']
4: ['开账户', '护照', '手机', '待销账', '个人整存整取']
5: ['开卡', '户口本', '固定电话', '现金', '个人整存整取']
6: ['开卡', '军官证', '手机', '待销账', '个人定活']
7: ['开账户', '身份证', '固定电话', '转账', '个人定活']
8: ['开存折', '身份证', '手机', '现金', '随心取']
9: ['开存折', '军官证', '手机', '现金', '个人整存整取']
10: ['开账户', '户口本', '手机', '转账', '随心取']
11: ['开卡', '护照', '固定电话', '转账', '随心取']
12: ['开账户', '护照', '手机', '现金', '个人定活']
13: ['开存折', '户口本', '手机', '转账', '个人活期存款']
14: ['开存折', '身份证', '手机', '待销账', '个人活期存款']
15: ['开存折', '身份证', '手机', '转账', '个人整存整取']
16: ['开存折', '户口本', '手机', '转账', '个人定活']
17: ['开存折', '护照', '手机', '转账', '个人活期存款']
18: ['开存折', '军官证', '手机', '转账', '随心取']