
作者|韩柯
软件故障有很多是“交互故障”,即只有当两个或更多输入值相互作用时才会发生故障。NASA应用出现的故障,67%是单要素故障,93%是二要素故障,98%是三要素故障。其他领域的应用,80%左右是二要素故障,90%作用是三要素故障。更多要素的交互故障占比很小,六要素以上的交互故障基本可以忽略。
组合测试可以在不考虑程序结构的情况下,评估测试用例设计的充分性,同时能够以最少的测试用例覆盖更多的交互故障发生空间。
组合测试覆盖度量指标
一、简单t要素组合覆盖,即给定一组n个变量测试用例集合,n个变量的t要素组合数,除以所有可能的变量-取值配置数。
举例:
对于a、b、c、d四个二值输入的软件,测试用例集合中4个测试用例:
a b c d
0 0 0 0
0 1 1 0
1 0 0 1
0 1 1 1
对于二要素,共有4个可能配置:00、01、10和11。在总共6个二要素组合中,ab、ac、ad和cd不能满足覆盖全部4个可能配置的要求,只有bd和cd满足。这样,这组测试用例集合的“简单2要素组合覆盖率”就是33%。
对于三要素,共有8个可能配置:000、001、010、011、100、101、110和111。在总共4个三要素组合中,abc、abd、acd和bcd都不能满足覆盖全部8个可能配置的要求,那么简单3要素组合覆盖率为0%。
2、简单(t+k)要素组合覆盖
满足t要素组合覆盖率的测试用例集合也会具有一定高阶要素组合覆盖率。
例如将前面的例子进行扩展,得到:
a b c d
0 0 0 0
1 1 1 0
1 0 0 1
0 1 1 1
0 1 0 1
1 0 1 1
1 0 1 0
0 1 0 0
对这个测试用例集合,简单2要素组合覆盖率为100%,而3要素组合覆盖率也可以达到25%,4要素组合覆盖率为0%。这样这个测试用例集的简单(2+1)要素组合覆盖率是25%,简单(2+2)要素组合覆盖率为0%。
3、三元密度
将上面(t+k)中的k取1。三元密度就是t➕(t+1)元组覆盖值除以(t+1)元组所有的可能取值。
对于上例,既满足二要素的组合覆盖要求,同时还覆盖了4变量三要素全部24个可能配置中的10个,所以这个测试用例集的(2+1)元组密度=2+26/32=2.81
4、变量取值配置覆盖
即变量取值覆盖的百分比。对于第一个例子,对于4变量二要素的全部24种组合,19种被覆盖,只有ab=11、ac=11、ad=10、bc=01和bc=10没有被这个测试用例集合覆盖,其中只有bd和cd覆盖所有4种取值。那么该测试用例集合的配置覆盖率就是19/24=79%。
小结
1、组合测试对于发现交互故障非常重要
2、引起故障的参与变量数通常较少,一般2到3个,最多6个
3、组合测试既考虑了测试充分性,也兼顾可行性,一定程度上可缓解组合爆炸问题
4、通过算法可以用较少的测试用例数满足组合测试覆盖率要求
5、既满足低阶元素组合测试覆盖率,又尽可能多地覆盖高阶(通常为高1阶)元素组合,是更好的测试用例集
6、通过度量指标可以客观评价针对功能、接口、安装等关键常用测试类型的测试充分性,降低测试风险
7、组合测试覆盖针对黑盒测试,可一定程度弥补逻辑测试在程序规模、测试级别和程序设计语言、源程序可获得性等方面的限制,具有更好的适用性
8、组合测试不太适合时序问题等其他类型引起的故障。


