all-pairs testing 或者 pairwise testing ,它是组合测试的一种方法,是软件测试领域针对黑盒测试提出的一个行之有效的方法之一。
Pairwise也正是基于数学统计和对传统的正交分析法进行优化后得到的产物。
Pairwise基于如下2个假设:
- 每一个维度都是正交的,即每一个维度互相都没有交集;
- 根据数学统计分析,73%的缺陷(单因子是35%,双因子是38%)是由单因子或2个因子相互作用产生的,19%的缺陷是由3个因子相互作用产生的。因此,Pairwise基于覆盖所有2因子的交互作用产生的用例集合性价比最高而产生的。
我们先从一个例子来感受下Pairwise testing。
假设我们有一个产品,他的组成和值的情况如下。
- listbox: 0-9
- checkbox: checked, unchecked
- radio button: on, off
- textbox: 1-100
如果全覆盖的话,关正向的测试用例就有 1022*100=4000 ,如果包括反向的测试用例的话,则 >4000 条测试用例。
1 使用等价类划分减少测试用例:
对于listbox,可以选择的值是0-9,由于0最特殊(其他的值要么是正数要么是负数), 所以,对于checklist 我们把它简化成 0
和 others(1-9)
checkbox 和 radio button 已经无法再简化了,则继续保留
对于textbox,可以输入的值是1-100,我们可以把它的值简化成 valid Int
,invalid Int
and Alpha Special Char
简化后的结果如下:
listbox | checkbox | radio button | textbox |
---|---|---|---|
0 | checked | on | valid Int |
others | unchecked | off | invalid Int |
Alpha Special Char |
则有 222*3=24 个testcases,也就是我们把 4000+的testcases降到了24个testcases
2 使用pairwise的方法进一步减少测试用例
步骤:
- 变量排序
- 根据第二个变量计算出第一个变量需要的用例数(行数)
- 每增加一列(n),则需要看 1和n,2和n,。。。 n-1和n之间是否覆盖了两列之间所有的组合,如果没有则适当调整上下的位置。直到所有都符合。
- 如何还是有不符合的,则适当增加几行。
2.1 给变量排序
含有值越多的变量放在第一位,第二多的第二位,最少的最后一位,以此类推。
textbox(3) | listbox(2) | checkbox(2) | radio button(2) |
---|
2.2 填写第一列和第二列
根据第一列和第二列值的可能性计算出第一列需要几行,这个例子中,第一列3个值,第二列2个值,所以需要3*2=6行
textbox(3) | listbox(2) | checkbox(2) | radio button(2) |
---|---|---|---|
valid Int | 0 | ||
valid Int | others | ||
invalid Int | 0 | ||
invalid Int | others | ||
Alpha Special Char | 0 | ||
Alpha Special Char | others |
2.3 填写第三列
textbox(3) | listbox(2) | checkbox(2) | radio button(2) |
---|---|---|---|
valid Int | 0 | checked | |
valid Int | others | unchecked | |
invalid Int | 0 | checked | |
invalid Int | others | unchecked | |
Alpha Special Char | 0 | checked | |
Alpha Special Char | others | unchecked |
检查下每一列和第三列之间是否都覆盖了不同组合情况。
我们发现第二列和第三列只有 0-checked 和 others-unchecked情况,没有覆盖 0-unchecked 和 others-checked的情况,所以我们把第三行和第四行对调下。
textbox(3) | listbox(2) | checkbox(2) | radio button(2) |
---|---|---|---|
valid Int | 0 | checked | |
valid Int | others | unchecked | |
invalid Int | 0 | unchecked | |
invalid Int | others | checked | |
Alpha Special Char | 0 | checked | |
Alpha Special Char | others | unchecked |
这样第一列和第三列,第二列和第三列都能覆盖不同的组合情况。
2.4 填写第四列
textbox(3) | listbox(2) | checkbox(2) | radio button(2) |
---|---|---|---|
valid Int | 0 | checked | on |
valid Int | others | unchecked | off |
invalid Int | 0 | unchecked | on |
invalid Int | others | checked | off |
Alpha Special Char | 0 | checked | on |
Alpha Special Char | others | unchecked | off |
检查下每一列和第四列之间是否都覆盖了不同组合情况。
第一列和第四列都覆盖了。 第二列和第四列没有覆盖 0-off 和 others-on的情况
所以我们把五行和第六行换一下位置,如下
textbox(3) | listbox(2) | checkbox(2) | radio button(2) |
---|---|---|---|
valid Int | 0 | checked | on |
valid Int | others | unchecked | off |
invalid Int | 0 | unchecked | on |
invalid Int | others | checked | off |
Alpha Special Char | 0 | checked | off |
Alpha Special Char | others | unchecked | on |
再次检查下每一列和第四列之间是否都覆盖了不同组合情况.发现都符合。
则最终结果就是上面这个表,每一行代表一个测试用例。
使用pairwise组合测试的方法,我们把测试用例从24个降到了6个。
2.5 说明
上面的例子比较简单,所以通过调整位置最终能满足要求,可是有时候变量多的时候,无论你怎么调整都没法满足要求,也许满足了第三列和第四列,可是第二列和第四列就不满足了。这时候可以适当考虑加几行来解决这个问题。
比如在上面的例子里再加两个checkbox这时就无法满足,则需要加上两行:
加上两行,checkbox3为 hex和dec
Textbox | Listbox | Checkbox1 | Raido | Checkbox2 | Checkbox3 |
---|---|---|---|---|---|
valid Int | 0 | checked | on | yes | dec |
valid Int | others | unchecked | off | no | hex |
valid Int | others | unchecked | on | no | hex |
invalid Int | 0 | unchecked | on | yes | hex |
invalid Int | others | checked | on | no | dec |
invalid Int | others | unchecked | off | yes | dec |
Alpha Special Char | 0 | checked | off | no | dec |
Alpha Special Char | others | unchecked | on | yes | hex |
3 pairwise的优缺点
缺点:
- 组合测试可能会错过最重要的取值组合;由于是工具生成测试用例集,而且不是全覆盖测试,所以很可能遗漏的测试集就是最重要而且能发现问题的测试用例(例如默认测试集);
- 组合测试的数学模型没有描述变量之间的约束关系;此时需要加入约束条件(PICT即可实现此功能)
- 组合测试用例可能被卫哨语句过滤;此时需要用到PICT中的~在无效数据前进行标记;
适合的场景:
- 变量的组合特别大的时候
- 参数值很容易划分等价类
4 总结
前面的例子,让我们对于因子组合测试覆盖Pairwise有比较直观的了解。不过对于人肉生成pairwise测试用例还是有点复杂的,特别当你的变量特别多的时候,目前市面上也有一些工具可以帮你生成pairwise测试用例。
比如:
- 可以直接在python中使用的allpairspy库
- 微软的PICT
- Hexawise
- Automatic Effcient Test Generator or AETG
在下面的章节我将会介绍几个工具的使用。
参考:
https://en.wikipedia.org/wiki...
https://mp.weixin.qq.com/s?__...
https://www.cnblogs.com/zhang...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。