逻辑覆盖主要考察使用测试数据运行被测程序时对程序逻辑的覆盖程度。
通常希望选择最少的测试用例来满足所需的覆盖标准。
主要的覆盖标准有:语句覆盖,判定覆盖,条件覆盖,判定-条件覆盖,条件组合覆盖,路径覆盖。
例:对下列子程序进行测试
procedureexample(y,z:real;var x:real);
begin
if (y>1) and (z=0) then x:=x/y;
if (y=2) or (x>1) then x:=x+1;
end;
该子程序接受x、y、z的值,并将计算结果x的值返回给调用程序。与该子程序对应的流程图如下:
该子程序有两个判定:
a:(y>1) and(z=0)
c:(y=2) or(x>1)
判定a中有两个判定条件: y>1、 z=0;
判定c中有两个判定条件: y=2 、“x>1”
•当判定a为“真”时,“x>1”实际是“x/y>1”,即“x>y”;
•当判定a为“假”时,“x>1”仍是“x>1”。
该子程序有四条可执行路径:
路径1 sabcde , 其执行条件(L1)是a为“t”且c为“t”
路径2sace,其执行条件(L2)是a为“f”且c为“f”)
路径3 sacde,其执行条件(L3)是a为“f”且c为“t”)
路径4sabce,其执行条件(L4)是a为“t”且c为“f”)
§语句覆盖
语句覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个可执行语句都至少执行一次
欲使每个语句都执行一次,只需执行路径L1(sabcde)即可。
L1=(y=2) and (z=0) or (y>1) and (z=0) and (x>y)
测试用例如下:
§ 判定覆盖
判定覆盖(也称分支覆盖)是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定的所有可能结果都至少执行一次(即判定的每个分支至少经过一次)
注意:一个判定可以是一个条件,也可以是多个条件。
欲使每个分支都执行一次,只需执行路径L3(sacde ,a为“f”且c为“t”)和L4(sabce ,a为“t”且c为“f”)即可。或者,执行路径:
L1(sabcde,a为“t”且c为“t”)
L2(sace,a为“f”且c为“f”)
L3(sacde ,a为“f”且c为“t”):(y ≤ 1) and (y=2) or (y ≤ 1) and (x>1)or (z ≠ 0) and (y=2)or(z ≠ 0) and (x>1)
L4(sabce ,a为“t”且c为“f”):(y>1) and (z=0) and (y ≠ 2) and (x ≤ y)
测试用例如下:
•判定覆盖将每个判定的所有可能结果都至少执行一次,所以,程序中的所有语句也必定都至少执行一次。因此,满足判定覆盖标准的测试用例也一定满足语句覆盖标准。
§ 条件覆盖
条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定中的每个条件的所有可能结果都至少出现一次。
判定a中各种条件的所有可能结果:y>1, y ≤ 1 ,z=0, z ≠ 0。
判定c中各种条件的所有可能结果:y=2, y ≠ 2 ,x>1(或x>y),x≤ 1 (或x ≤ y) 。
测试用例如下:
§ 判定-条件覆盖
判定/条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定的所有可能结果都至少执行一次,并且,每个判定中的每个条件的所有可能结果都至少出现一次。
•显然,满足判定/条件覆盖标准的测试用例一定也满足判定覆盖、条件覆盖、语句覆盖标准。
测试用例如下:
§ 条件组合覆盖
条件组合覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定中条件结果的所有可能组合都至少出现一次。
•满足条件组合覆盖标准的测试用例一定也满足判定覆盖、条件覆盖、判定/条件覆盖、语句覆盖标准。
判定a中条件结果的所有可能组合:
① y>1, z=0 ; ② y>1, z ≠ 0; ③ y ≤ 1 , z=0 ; ④ y ≤ 1 , z ≠ 0
判定c中条件结果的所有可能组合:
⑤ y=2, x>1 ; ⑥ y=2, x ≤ 1 ; ⑦ y ≠ 2 ,x>1; ⑧ y ≠ 2 ,x ≤ 1
测试用例如下:
§ 路径覆盖
路径覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每条可能执行到的路径都至少经过一次。(如果程序中包含环路,则要求每条环路至少经历一次)。
本例中所有可能执行的路径有:
L1 (sabcde,a为“t”且c为“t”) =(y=2) and(z=0)or (y>1) and (z=0) and (x> y)
L2 (sace,a为“f”且c为“f”) = (y≤1)and (y≠2) and (x ≤ 1)or (z ≠ 0) and (y ≠ 2) and (x ≤ 1)
L3 (sacde,a为“f”且c为“t”) =(y ≤ 1) and (y=2)or (y ≤ 1) and (x>1)or (z ≠ 0) and (y=2)or(z ≠ 0) and (x>1)
L4( sabce,a为“t”且c为“f”) =(y>1) and(z=0) and (y ≠ 2) and (x ≤ y)
测试用例如下:
注意:
路径覆盖实际上考虑了程序中各种判定结果的所有可能组合。
路径覆盖未必能覆盖判定中条件结果的各种可能情况。
路径覆盖是一种比较强的覆盖标准,但不能替代条件覆盖和条件组合覆盖标准。