跳转至

Lecture 9. Conditon Coverage 条件覆盖(没听懂)

条件覆盖

目标就是,在每一个判定条件当中,让每一个独立的条件的真假都被测到。

假如有 $n$ 个独立的条件,那么就需要至多 $2^n$ 种条件取值。(怎么听起来像是真值表测试呢?)

但是其实并不是真值表测试。真值表要求测至多 $2^n$ 个测试数据,但是这里只需要让每个条件的真和假都取到,比如一个测试点让所有条件都是真,另一个测试点让所有的都是假,总共俩测试数据,就能满足这个要求——覆盖所有条件的真假。

条件判定覆盖(condition decision coverage)

刚才条件覆盖看起来很搞笑~假如只用了俩测试数据就覆盖了所有条件,必然有一些分支是走不到的啊!

所以这个条件判定覆盖是对于条件覆盖的一个补充。

条件判定覆盖,就是不仅要让每个单独的条件覆盖到真假,还要补充上一个让每个组合起来的判定条件,整体的真假也被覆盖掉。这样就能稍微靠谱一点了~同时,设计测试数据的时候,可以不考虑短路。比如对于一行 if 语句:if ((passengers > 0) && (passengers <= allSeats)),可以设计如下的条件判定覆盖测试点(前两个点是整体的真假,三四个点是第一个条件的真假,五六点是第二个条件的真假):

Test case Condition / Decision
CDC-1 ((passengers > 0) && (passengers <= allSeats))
CDC-2 !((passengers > 0) && (passengers <= allSeats))
CDC-3 (passengers > 0)
CDC-4 !((passengers > 0)
CDC-5 (passengers <= allSeats)
CDC-6 !(passengers <= allSeats)

得到测试点之后,可以开始设计测试数据。每一个 decision 当中的 condition 的真假都要覆盖掉(原文:every condition in every decision takes on the value true and false)。

疑问:为啥 ppt 第 7 页上的 decision sequence 2 不是 246?

回答:其实上面第二条路径的 2 4 相当于 2 4 5 的短路。然而重点在于:46 不可能同时满足。

还有一个疑问:为啥第二条第三条路径不能直接合成一条 2 4 6?

回答:!(A && B) 的形式,要分两类讨论,一类是 A && !B,另一类是 !A && B.

image-20221104032137552

更复杂的一个例子(一个 if 里仨子条件)

image-20221104032302601

疑问:这里 decision sequence 2 为什么没有拆成 246、2458 俩?

回答:!(A || B) 比较好拆,就是 !A && !B。重要的是,68 可以同时取到。

但是这样会产生无法完全覆盖所有组合的情况。

小结

比分支覆盖和条件覆盖都要强一些

但是没有测试到条件的组合情况。比如一个判定有三个条件,这里只考虑每个条件整体取真还是假,但是没有测试整体条件的每个子条件是真是假。

测试输入数据的设计有一点麻烦。

多条件覆盖 multiple condition coverage

多条件覆盖当中,对于每个具有 $n$ 个子条件的判定,设计 $2^n$ 个测试点($n > 1$)。

弄测试数据的时候,还是要先把所有的 decisions 列出来,然后对于当前 decision 的取值,从真值表里面找能实现这个取值的所有的 condition 的组合。

image-20221104033223600

当然,期望的输出结果,要根据规格说明书来确定,千万不能根据代码来确定!

更复杂的一个例子

千万要注意,对于 if (xxx) {} else if (yyy) {},这种含有 else if 的结构,其实 yyy 条件还隐含了一个 !xxx

对于代码

if (passengers <= 0)
    status = Status.ERROR;
else if (passengers >= 121 || (passengers >= 81 && comfortFlag))
    status = Status.FAILURE;

可以设计如下的测试数据:

image-20221104033901347

此外还需要注意,对于只含有一个条件的判定,要单独考虑。

总结一下,MCC 就是对于所有判定的所有可能的条件组合都会被测试到,但是测试数据依然不太好设计。

Modified Condition Decision Coverage 修订的条件判定覆盖(晕)

测试数据是基于条件判定覆盖的,但是增加了一些验证独立条件的、对输出有影响的条件变化。

MCDC 的目标是,实现所有的判定、条件、输出的覆盖。

~~不懂:课件 23 页,MCDC3 和 MCDC 7 有啥区别?~~

相比于多条件覆盖,强度较低了一点;但是相比于条件判定覆盖强了很多,因为每一个测试数据都需要再考虑一下输出结果。