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 我们把它简化成 0others(1-9)

checkbox 和 radio button 已经无法再简化了,则继续保留

对于textbox,可以输入的值是1-100,我们可以把它的值简化成 valid Int,invalid Int and Alpha Special Char

简化后的结果如下:

listboxcheckboxradio buttontextbox
0checkedonvalid Int
othersuncheckedoffinvalid 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 Int0
valid Intothers
invalid Int0
invalid Intothers
Alpha Special Char0
Alpha Special Charothers

2.3 填写第三列

textbox(3)listbox(2)checkbox(2)radio button(2)
valid Int0checked
valid Intothersunchecked
invalid Int0checked
invalid Intothersunchecked
Alpha Special Char0checked
Alpha Special Charothersunchecked

检查下每一列和第三列之间是否都覆盖了不同组合情况。

我们发现第二列和第三列只有 0-checked 和 others-unchecked情况,没有覆盖 0-unchecked 和 others-checked的情况,所以我们把第三行和第四行对调下。
textbox(3)listbox(2)checkbox(2)radio button(2)
valid Int0checked
valid Intothersunchecked
invalid Int0unchecked
invalid Intotherschecked
Alpha Special Char0checked
Alpha Special Charothersunchecked

这样第一列和第三列,第二列和第三列都能覆盖不同的组合情况。

2.4 填写第四列

textbox(3)listbox(2)checkbox(2)radio button(2)
valid Int0checkedon
valid Intothersuncheckedoff
invalid Int0uncheckedon
invalid Intotherscheckedoff
Alpha Special Char0checkedon
Alpha Special Charothersuncheckedoff

检查下每一列和第四列之间是否都覆盖了不同组合情况。

第一列和第四列都覆盖了。 第二列和第四列没有覆盖 0-off 和 others-on的情况

所以我们把五行和第六行换一下位置,如下

textbox(3)listbox(2)checkbox(2)radio button(2)
valid Int0checkedon
valid Intothersuncheckedoff
invalid Int0uncheckedon
invalid Intotherscheckedoff
Alpha Special Char0checkedoff
Alpha Special Charothersuncheckedon

再次检查下每一列和第四列之间是否都覆盖了不同组合情况.发现都符合。

则最终结果就是上面这个表,每一行代表一个测试用例。

使用pairwise组合测试的方法,我们把测试用例从24个降到了6个。

2.5 说明

上面的例子比较简单,所以通过调整位置最终能满足要求,可是有时候变量多的时候,无论你怎么调整都没法满足要求,也许满足了第三列和第四列,可是第二列和第四列就不满足了。这时候可以适当考虑加几行来解决这个问题。

比如在上面的例子里再加两个checkbox这时就无法满足,则需要加上两行:

加上两行,checkbox3为 hex和dec

TextboxListboxCheckbox1RaidoCheckbox2Checkbox3
valid Int0checkedonyesdec
valid Intothersuncheckedoffnohex
valid Intothersuncheckedonnohex
invalid Int0uncheckedonyeshex
invalid Intotherscheckedonnodec
invalid Int othersuncheckedoffyesdec
Alpha Special Char0checkedoffnodec
Alpha Special Charothersuncheckedonyeshex

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...

lucy
18 声望7 粉丝