枚举的思想:组合测试

被测对象期望能不能实现,跟很多环境因素都有关。有一些缺陷,只有在某些特定的因素组合下,才会被激活。也就是说,不同的因素之间,可能是存在耦合的。被测对象能不能正确处理这些耦合,是质量的一个重要方面。组合测试的目的,就是验证被测对象在因素耦合处理方面的正确性。

举个例子。假设我们要测的是一个电信交换机,被测对象期望是“交换机要具备正常的通话功能”。跟这个期望相关的影响因素主要有4个:呼叫种类、资费方式、接入方式和状态。每个因素又包括3种可能的取值。

经验告诉我们,这4个因素之间很可能是存在耦合的。所以,如果要判定通话功能的正确性,我们就有必要验证这4个因素的各种组合情况。

这时候,组合测试方法就能派上用场了。组合测试利用组合覆盖表来选择测试用例,这个例子里,最终选出的是这样9个用例:

大家可能会比较奇怪,4个因素, 每个因素都有3种取值,那一共的组合数不应该是81吗?

实际上,我们这里用的是“两两组合覆盖表”,覆盖的是这4个因素不同取值的两两组合情况。为什么只测两两组合呢?首先,因素耦合相关的缺陷,大多发生在较低的组合维数上。有人统计过Mozilla浏览器和Apache服务器的历史缺陷,发现两两组合缺陷的占比在70%以上;其次,我们还可以通过审查设计文档,了解系统里各种决策逻辑的复杂度,最终我们确认,测两两组合就够了。

可能有的同学又会问了,还是不对啊,4个因素, 每个因素都有3种取值,两两组合数不应该是54吗?怎么只有9个用例?

这就涉及到组合测试的精髓了。因为一个用例实际上是可以覆盖多个两两组合的,覆盖得越多,最终需要的用例数就越少,这样就实现了枚举测试的“无损压缩”。那么,具体用什么办法,才能得到这样的两两组合覆盖表呢?最经典的方法就是贪心法。

贪心法的原则是“每一步都谋取最大的收益”:在测试选择的过程里,时刻关注哪些组合还没有被覆盖,每选择一个用例,都尽可能覆盖最多的“未覆盖组合”,这样,最终需要的用例数就是最少的。

我们来看一个更简单的例子,来说明贪心法的思路。假设有3个影响因素A、B、C,其中A和B有两个取值,C有3个取值。

我们用贪心法来生成两两组合覆盖表,步骤是这样的:

  ① 首先,我们用4个用例覆盖A、B两个因素的两两组合,C的取值待定;

  ② 然后,把C的3种取值依次放进前3个用例里。第4个用例的C应该取什么值呢?我们要看这时候还有哪些两两组合没有被覆盖:

  ③ 第4个用例的C取什么值,才能覆盖最多的“未覆盖组合”呢?显然应该取C1,这样就可以覆盖2个未覆盖组合,而其它取值只能覆盖1个。这时候,我们已经确定了4个用例,剩下还没被覆盖的组合有4个:

  ④ 我们增加第5个用例,覆盖(A2,C2)这个组合,B的取值待定。这样,未覆盖的组合还剩下3个:

  ⑤ 那么,第5个用例的B取什么值,才能覆盖最多的“未覆盖组合”呢?显然是B1。这样第5个用例也确定了。这时候,未覆盖的组合还剩下2个:

  ⑥ 我们增加第6个用例,覆盖(A1,C3)这个组合,B的取值待定。未覆盖的组合还剩下最后一个:

  ⑦ 显然,第6个用例的B取B2的话,就能够覆盖这个组合。到这里,所有的两两组合就都被覆盖了,一共需要6个用例:

还有一种开展组合测试的思路,就是排除法。如果我们预先就知道,某些因素之间不存在耦合关系,那么我们在设计组合测试的时候,就可以排除掉这些组合。

具体怎么做呢?我们来看一个电路领域的例子。在电路测试里,测试输入变量是给到输入管脚的电平信号,有“0”和“1”两种取值。假设被测电路有7个输入管脚、5个输出管脚:

如果我们要覆盖所有输入组合,一共需要128个用例。但是,通过审查电路的设计文件,我们已经知道了每个输出跟哪些输入有关系。比如,输出f1只跟a、b、e这3个输入有关。也就是说,对于f1这个输出来讲,只需要考虑a、b、e之间可能存在的耦合。这样,128个组合测试用例里,就有相当一部分是冗余的。

这时候,我们可以按下面的两个步骤排除掉这些冗余用例:

  ① 首先,根据已知的输入输出关联关系,构造一个矩阵,每一列对应一个输入,每一行对应一个输出。元素值为1,表示输入输出之间存在关联:

  ② 然后,我们把输入的排序调整一下,再划分成这样3个子矩阵:

这样做的目的,是要保证每一个子矩阵里,每一行都最多只有一个1。也就是说,在每一个子矩阵里,每个输出最多只跟一个输入有关,因此这个子矩阵里的所有输入之间,就不存在耦合关系。比方说a、c、f这3个输入,对任何输出来说都没有耦合关系,所以我们可以把它们看做同一个输入变量,取相同的值。这样,7个输入变量就可以整合成3个,最终我们需要的组合测试用例就只有8个。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值