您的位置:首页 > 其它

整理白盒测试中的逻辑覆盖

2015-09-16 13:08 246 查看
举例

public class Coverage

{

public void Main()

{

1 System.out.println("start main function:path a...");

2 int A,B,X;

3 if(A>1 and B==0){

4 X=X/A;

5 System.out.println("path c");

5 } else {

6 System.out.println("path b");

7 }

8 if(A==2 or X>1){

9 X=X+1;

10 System.out.println("path e");

11 } else {

12 System.out.println("path d");

13 }

14 System.out.println("end main function.");

}

}[1]

语句覆盖

语句覆盖 SC(Statement Coverage),就是设计若干个测试用例,运行被测程序,使得程序中每一可执行语句至少执行一次。这里的“若干个”,意味着使用测试用例越少越好。语句覆盖在

测试中主要发现缺陷或错误语句。[1]

例如上边的Coverage类代码,从path a到path c再到path e的路径就是所有可执行的语句路径,所以选择path ace路径设计测试用例即可覆盖所有可执行语句。[1]

语句覆盖率的公式:语句覆盖率=被评价到的语句数量/可执行的语句总数 x 100%[1]

语句覆盖的缺点:对程序执行逻辑的覆盖很低。[1]

判定覆盖(分支覆盖)

判定覆盖DC(Decision coverage),有时也称分支覆盖,就是指设计若干测试用例,运行被测程序,使得每个判定的取真分支和取假分支至少评价一次。例如上边的Coverage类代码,path

ace,path abd,path abe,path acd 四条路径均是符合判定覆盖要求的路径。[1]

判定覆盖的公式: 判定覆盖率=被评价到的判定分支个数/判定分支的总数X100%[1]

判定路径覆盖率(DDP)=被评价到的判定路径数量/判定路径的总数X100%[1]

判定覆盖的缺点:判定覆盖虽然把程序所有分支均覆盖到了,但其主要对整个表达式最终取值进行度量,忽略了表达式内部取值。[1]

例如上边的Coverage类代码的第8行“if(A==2 or X>1)”,[1]

当A==2或者X>1时都会执行第9行代码,判定覆盖只考虑整个“(A==2 or X>1)”表达式的取值,并没有考虑到表达式内部变量的取值(应该将A==2和X>1的情况均考虑)。[1]

条件覆盖

条件覆盖CC(Condition Coverage),设计足够多的测试用例,运行被测程序,使得每一判定语句中每个逻辑条件的可能取值至少满足一次。[1]

条件覆盖率的公式:条件覆盖率=被评价到的条件取值的数量/条件取值的总数X100%[1]

条件覆盖的缺点:只考虑到每个判定语句中的每个表达式,没有考虑到各个条件分支(或者涉及不到全部分支),即不能够满足判定覆盖[1]

例如上边的Coverage类代码,判定语句有两个,分别是第3行和第8行代码。根据条件覆盖的定义,则应考虑“(A>1 and B==0)”和“(A==2 or X>1)”两个表达式中的变量取值。[1]

判定条件覆盖

判定条件覆盖CDC(Condition/ Decision Coverage),设计足够多的测试用例,使得判定中的每个条件的所有可能(真/假)至少出现一次,并且每个判定本身的判定结果也至少出现一次。

[1]

判定条件覆盖率的公式: 条件判定覆盖率=被评价到的条件取值和判定分支的数量/(条件取值总数+判定分支总数)[1]

例如上边的Coverage类代码,不仅考虑到path ace,path abd,path abe,path acd 四条分支路径(判定覆盖),也考虑到了“(A>1 and B==0)”和“(A==2 or X>1)”两个条件中的每个表达式

的取值(条件覆盖)。[1]

判定条件覆盖的缺点:没有考虑单个判定对整体结果的影响,无法发现逻辑错误。[1]

补充:修正判定条件覆盖[1]

修正判定条件覆盖单元的入口与出口必须至少被调用一次,程序中判断的每一个分支必须至少被执行一次。对于程序中通过逻辑运算(AND,OR等)组成判断的基本布尔条件,每个条件必须取遍

所有可能的值且每一个条件对判断的结果具有独立的作用。[1]

条件组合覆盖

条件组合覆盖,也称多条件覆盖MCC (Multiple Condition Coverage),设计足够多的测试用例,使得每个判定中条件的各种可能组合都至少出现一次(以数轴形式划分区域,提取交集,建

立最少的测试用例)。这种方法包含了“分支覆盖”和“条件覆盖”的各种要求。满足条件组合覆盖一定满足判定覆盖、条件覆盖、判定条件覆盖。

例如上边的Coverage类中第8行“if(A==2 or X>1)”代码,所有可能的条件组合为:[1]

“A==2,X>1”、“A==2,X<=1”和“A!=2,X>1”三种。在条件覆盖中仅需考虑到这三种的一种即可,而在条件组合覆盖中需要都考虑到。[1]

条件组合覆盖率的公式:条件组合覆盖率=被评价到的条件取值组合的数量/条件取值组合的总数

条件组合覆盖的缺点:判定语句较多时,条件组合值比较多。[1]

路径覆盖

路径覆盖,设计足够多的测试用例,执行程序所有可能的路径。

路径覆盖率的公式:路径覆盖率=被执行到的路径数/程序中总的路径数。

优点:路径覆盖是覆盖率最高的一种覆盖技术。[1]

路径覆盖测试步骤:

1. 将程序流程图转换成控制流图;

2. 经过语法分析求的路径表达式;

3. 生成路径图;

4. 进行路径编码;

5. 经过译码得到执行的路径;

6. 通过路径枚举产生特定路径测试用例。

7. 修正的条件判断覆盖率(MC/DC)[1]

小结:1.语句覆盖:执行所有语句

2.判定覆盖:只关心一个if中的真假

3.条件覆盖:关心if中的所有取值

4.判定/条件覆盖:定中的每个条件的所有可能(真/假)至少出现一次,并且每个判定本身的判定结果也至少出现一次。

5.条件组合覆盖:使每个条件中的判定组合起来走一遍(包含以上4中覆盖)









内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: