覆盖率
覆盖率计算: 覆盖率 = 至少被执行一次的 i t e m 数 i t e m 的总数 \text{覆盖率}=\frac{至少被执行一次的item数}{item的总数} 覆盖率=item的总数至少被执行一次的item数
- 白盒覆盖率(语句、判定、条件、路径)
- 灰盒覆盖率(接口(函数))
- 黑盒覆盖率(功能)
测试用例不能一味追求覆盖率,存在测试成本的问题
白盒覆盖率
语句覆盖
代码每一行的覆盖情况
-
语句覆盖率 = 至少被执行一次的语句数量 可执行的语句总数 语句覆盖率=\frac{至少被执行一次的语句数量}{可执行的语句总数} 语句覆盖率=可执行的语句总数至少被执行一次的语句数量
-
举例:
public static void main(String[] str){ if(a>1 && b=0){ c = c / a; } if(a=0 || x>1){ c = c + 1; } }
a = 2 b = 0 x = 3 a=2\\b=0\\x=3 a=2b=0x=3,语句覆盖率为 100 % 100\% 100%, a = 2 b = 1 x = 3 a=2\\b=1\\x=3 a=2b=1x=3,语句覆盖率为 75 % 75\% 75%(第二个判断题没有执行)
-
思考:
public static void main(String[] str){ if(a>1 || b=0){ c = c / a; } if(a=0 && x>1){ c = c + 1; } }
a = 2 b = 0 x = 3 a=2\\b=0\\x=3 a=2b=0x=3,语句覆盖率同样为 100 % 100\% 100%但是两个判断语句的逻辑已经不一样了,所以无法测出此类错误。
判定覆盖率
if-else switch-case
判断语句的取真分支和取假分支
-
判定覆盖率 = 判定结果被评价的次数 判定结果的总数 判定覆盖率=\frac{判定结果被评价的次数}{判定结果的总数} 判定覆盖率=判定结果的总数判定结果被评价的次数
-
举例:
public static void main(String[] str){ if(a>1 && b=0){ c = c / a; } if(a=0 || x>1){ c = c + 1; } }
a = 2 b = 0 x = 3 a=2\\b=0\\x=3 a=2b=0x=3和 a = 1 b = 0 x = 1 a=1\\b=0\\x=1 a=1b=0x=1,判定覆盖率为 100 % 100\% 100%(4个判断都走到了)
-
思考:
public static void main(String[] str){ if(a>1 && b=0){ c = c / a; } if(a=0 || x<1){ c = c + 1; } }
a = 2 b = 0 x = 3 a=2\\b=0\\x=3 a=2b=0x=3和 a = 1 b = 0 x = 1 a=1\\b=0\\x=1 a=1b=0x=1,判定覆盖率为 100 % 100\% 100%(本应该是x>1但x<1,此错误没有识别出来)
条件覆盖率
所有判断语句中的每个条件的可能取值(一个判断可能有多个条件)
-
条件覆盖率 = 条件操作数值至少被评价一次的数量 条件操作数的总数 条件覆盖率=\frac{条件操作数值至少被评价一次的数量}{条件操作数的总数} 条件覆盖率=条件操作数的总数条件操作数值至少被评价一次的数量
-
举例:
public static void main(String[] str){ if(a>1 && b=0){ c = c / a; } if(a=0 || x>1){ c = c + 1; } }
1: a>1 2: b=0 3: a=0 4: x>1
用例 | a b x | 覆盖条件 |
---|---|---|
case1 | 2 0 3 | T 1 T_1 T1 T 2 T_2 T2 T 3 T_3 T3 T 4 T_4 T4 |
case2 | 1 0 1 | F 1 F_1 F1 T 2 T_2 T2 F 3 F_3 F3 F 4 F_4 F4 |
case3 | 2 1 1 | T 1 T_1 T1 F 2 F_2 F2 T 1 T_1 T1 F 4 F_4 F4 |
条件覆盖率 100 % 100\% 100%就表示为测试用例包括 T 1 − T 4 T_1-T_4 T1−T4、 F 1 − F 4 F_1-F_4 F1−F4
-
思考:
用例 a b x 覆盖条件 case1 1 0 3 T 1 T_1 T1 T 2 T_2 T2 T 3 T_3 T3 T 4 T_4 T4 case2 2 1 1 F 1 F_1 F1 T 2 T_2 T2 F 3 F_3 F3 F 4 F_4 F4 条件覆盖率 100 % 100\% 100%,但是判断覆盖率只有 50 % 50\% 50%
判定-条件覆盖率
设计足够多的用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断本省的所有可能判断结果至少执行一次。
-
判定条件覆盖率 = 条件操作数值或判定结果至少被评价一次的数量 条件操作数的总数 + 判定结果总数 判定条件覆盖率=\frac{条件操作数值或判定结果至少被评价一次的数量}{条件操作数的总数+判定结果总数} 判定条件覆盖率=条件操作数的总数+判定结果总数条件操作数值或判定结果至少被评价一次的数量
-
举例:
public static void main(String[] str){ if(a>1 && b=0){ c = c / a; } if(a=0 || x>1){ c = c + 1; } }
a = 2 b = 0 x = 3 a=2\\b=0\\x=3 a=2b=0x=3,判定: 50 % 50\% 50%,条件覆盖率: 50 % 50\% 50%,判断条件覆盖率: 2 + 4 4 + 8 = 50 % \frac{2+4}{4+8}=50\% 4+82+4=50%
a = 0 b = 0 x = 1 a=0\\b=0\\x=1 a=0b=0x=1,判定: 50 % 50\% 50%,条件覆盖率: 50 % 50\% 50%,判断条件覆盖率: 2 + 4 4 + 8 = 50 % \frac{2+4}{4+8}=50\% 4+82+4=50%
结合两个用例:判定: 75 % 75\% 75%,条件覆盖率: 100 % 100\% 100%,判断条件覆盖率: 3 + 8 4 + 8 = 11 12 \frac{3+8}{4+8}=\frac{11}{12} 4+83+8=1211
条件组合覆盖率
判定-条件不存在组合所有无法识别and和or
-
条件组合覆盖率 = 条件组合至少被评价一次的数量 条件组合的总数 条件组合覆盖率=\frac{条件组合至少被评价一次的数量}{条件组合的总数} 条件组合覆盖率=条件组合的总数条件组合至少被评价一次的数量
-
举例:
public static void main(String[] str){ if(a>1 && b=0){ c = c / a; } if(a=0 || x>1){ c = c + 1; } }
一个两个判定四个条件,第一个判定的条件组合有4种情况:
a>1 b=0、a<1 b=0、a<1 b不等于0、a>1 b不等于0
用例 a b x 覆盖条件 判定路径 case1 2 0 3 T 1 T_1 T1 T 2 T_2 T2 T 3 T_3 T3 T 4 T_4 T4 T T case2 2 1 1 T 1 T_1 T1 F 2 F_2 F2 T 1 T_1 T1 F 4 F_4 F4 F F case3 1 0 3 F 1 F_1 F1 T 2 T_2 T2 F 1 F_1 F1 T 4 T_4 T4 F T case4 1 1 1 F 1 F_1 F1 F 2 F_2 F2 F 1 F_1 F1 F 4 F_4 F4 F F 条件组合覆盖率为100%,但发现T F 路径没有覆盖
路径覆盖率
- 路径覆盖率 = 至少被执行到一次的路径数 路径总数 路径覆盖率=\frac{至少被执行到一次的路径数}{路径总数} 路径覆盖率=路径总数至少被执行到一次的路径数
总结
每种覆盖率度量都有自己的局限性,因此要把各种覆盖率组合起来对测试进行度量。
目前感觉条件组合+路径覆盖是最为全面的组合