逻辑覆盖测试法是常用的一类白盒测试方法,其以程序内部逻辑结构为基础,通过对程序逻辑结构的遍历来实现程序测试的覆盖。逻辑覆盖测试法要求测试人员对程序的逻辑结构有清晰的了解。
逻辑覆盖测试法是一系列测试过程的总称,是使测试过程逐渐进行越来越完整的通路测试。从覆盖源程序语句的详尽程度,可以将其分为语句覆盖、判定覆盖、条件覆盖、判断/条件覆盖、条件组合覆盖和路径覆盖等。接下来将通过下面程序的逻辑覆盖测试用例一一介绍这些覆盖准则,该程序的流程图如图4-1所示,其中,a、b、c、d、e是控制流上的若干程序点。
main(){
int a,b;
float x;
scanf("%d,%d,%f",&a, &b, &x);
if((a>1)and(b = 0))
x = x/a;
if((a = 2)or(x>1))
x= x+1
prinf("x=%f",x);
}
■ 图1 程序流程图
01、逻辑覆盖测试的综合案例
通过一个案例将相关测试方法进行一次综合应用,即设计以下程序的逻辑覆盖测试用例。
图2给出了该例子的流程图,其中a、b、c、d和e是控制流上的若干程序点。
■ 图2程序流程图
- 语句覆盖
要测试DoWork函数,只需设计一个测试用例就可以覆盖程序中所有可执行语句,程序执行的路径是abd,具体测试用例输入如下。
{x=4 y=5 z=5}
分析:语句覆盖可以保证程序中的每个语句都得到执行,但发现不了判定中逻辑运算的错误,即它不是一种充分的检验方法。例如,在第一个判定(x>3)&&(z<10)中把“&&”错误地写成“||”,这时仍使用该测试用例,则程序仍会按照流程图上的路径abd执行,这再次说明语句覆盖是最弱的逻辑覆盖准则。
- 判定覆盖
要实现DoWork函数的判定覆盖,需要设计两个测试用例,其程序执行的路径分别是abd和ace,对应测试用例的输入为:
{x=4 y=5 z=5};{x=2 y=5 z=5}
分析:上述两个测试用例不仅满足了判定覆盖,同时还做到了语句覆盖。从这点看似乎判定覆盖比语句覆盖更强一些,但其仍然无法确定判定内部条件的错误。例如,把第二个判定中的条件y>5错误写为y<5,然后使用上述测试用例,照样能按原路径执行而不影响结果。因此,需要更强的逻辑覆盖准则去检验判定内的条件。
- 条件覆盖
一个判定中通常都包含若干条件。条件覆盖的目的是设计若干测试用例,在执行被测程序后,使每个判定中每个条件的可能值至少满足一次。
对DoWork函数各个判定的各种条件取值加以标记。
(1) 对于第一个判定(x>3&&z<10):
条件x>3取真值记为t1,取假值记为-t1;
条件z<10取真值记为t2,取假值记为-t2。
(2) 对于第二个判定(x==4||y>5):
条件x==4取真值记为t3,取假值记为-t3;
条件y>5取真值记为t4,取假值记为-t4。
根据条件覆盖的基本思想,要使上述4个条件可能产生的8种情况至少满足一次,其设计测试用例如表1所示。
■ 表1 条件覆盖测试用例
分析: 表1中这组测试用例不但覆盖了4个条件的全部8种情况,而且将两个判定的4个分支b、c、d、e也同时覆盖了,即同时达到了条件覆盖和判定覆盖。
虽然前面的一组测试用例同时达到了条件覆盖和判定覆盖,但是,并不是说满足条件覆盖就一定能满足判定覆盖。如果设计了如表2中的这组测试用例,则其虽然满足了条件覆盖,但也只是覆盖了程序中第一个判定的取假分支c和第二个判定的取真分支d,不能满足判定覆盖的要求。、
■ 表2 另一组条件覆盖测试用例
- 判定/条件覆盖
根据判定/条件覆盖的基本思想,只需设计如表3中的两个测试用例便可以覆盖4个条件的8种取值以及4个判定分支。
■ 表3 判定/条件覆盖测试用例
分析: 从表面上看,判定/条件覆盖了各个判定中的所有条件的取值,但实际上,编译器在检查含有多个条件的逻辑表达式时,某些情况下的某些条件将会被其他条件掩盖。例如,对第一判定(x>3)&&(z<10)来说,必须x>3和z<10这两个条件同时满足才能确定该判定为真。如果x>3为假,则编译器将不再会去检查z<10这个条件,那么即使这个条件有错也无法被发现。对第二个判定(x==4)||(y>5)来说,若条件x==4满足,编译器就会认为该判定为真,这时将不会再去检查y>5,那么同样也无法发现这个条件中的错误。因此,判定/条件覆盖也不一定能够完全检查出逻辑表达式中的错误。
- 条件组合覆盖
对DoWork函数中的各个判定的条件取值组合加以标记。
(1) x>3,z<10记为t1,t2,即第一个判定的取真分支。
(2) x>3,z≥10记为t1,-t2,即第一个判定的取假分支。
(3) x≤3,z<10记为-t1,t2,即第一个判定的取假分支。
(4) x≤3,z≥10记为-t1,-t2,即第一个判定的取假分支。
(5) x==4,y>5记为t3,t4,即第二个判定的取真分支。
(6) x==4,y≤5记为t3,-t4,即第二个判定的取真分支。
(7) x≠4,y>5记为-t3,t4,即第二个判定的取真分支。
(8) x≠4,y<=5记为-t3,-t4,即第二个判定的取假分支。
根据组合覆盖的基本思想,以上可得设计测试用例如表4所示。
■ 表4 条件组合覆盖测试用例
分析:表4中这组测试用例覆盖了所有8种条件取值的组合,也覆盖了所有判定的真假分支,但丢失了一条路径abe。
- 路径覆盖
根据路径覆盖的基本思想,在满足组合覆盖测的测试用例中修改第三个测试用例,则可以实现路径覆盖,如表5所示。
■ 表5 路径覆盖测试用例
分析: 虽然前面一组测试用例满足了路径覆盖,但并没有覆盖程序中所有的条件组合(丢失了组合3和7),即满足路径覆盖的测试用例并不一定满足条件组合覆盖。