# Test
# 测试覆盖率
覆盖率按照测试方法大体上可以划分为三大类:
- 白盒覆盖(white-Box Coverage)
- 灰盒覆盖(Gray-Box coverage)
- 黑盒覆盖(Black-Box Coverage)
# 白盒覆盖
白盒覆盖率中使用最常见的就是逻辑覆盖率,也叫代码覆盖率/结构化覆盖率。
常见逻辑覆盖包括:
- 语句覆盖
- 判定覆盖/分支覆盖
- 条件覆盖
- 判定条件覆盖
- 条件组合覆盖
- 路径覆盖
# 语句覆盖
公式:覆盖率 = (至少被执行一次的语句数)/(可执行的语句总数)
“最弱覆盖”,测试结果最不理想,例如:
int divide(int a, int b) {
return a / b;
}
TestCase: int a = 1, int b = 2
1
2
3
4
5
2
3
4
5
这种虽然测试覆盖率达到了 100%,但是当 b = 0 的时候,程序就会异常,所以即使覆盖率达到了 100%,也会存在有缺陷发现不了。
# 判定覆盖
也称为分支覆盖,满足判定覆盖的一定满足语句覆盖。
判定条件的 true 和 false 是否都被测到了。
# 条件覆盖
判定条件的每个子表达式的 true 和 false 的情况是否都被测到了。
# 判定覆盖和条件覆盖的区别
示例:
int foo (int a, int b) {
if (a < 10 || b < 10 ) { // 判定
return 0; // 分支一
} else {
return 1; // 分支二
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
判定覆盖: // 判定覆盖只需要能让代码分别执行到分支一和分支二就可以。
TestCase1:a=1,b=任意
TestCase2:a=10,b=10
// 这里已经达到 100% 覆盖率,但是当 a=1,b=1 的时候,那么就没有测试 a<10,b>10 的情况。
条件覆盖: // 条件覆盖只需要让每个子表达式的每种情况都测到就可以了。
TestCase1:a=1,b=1 // true true
TestCase2:a=11,b=11 // false false
// 这里测试覆盖率已经达到 100%,但是却没有测到子表达式 true false 和 false true 的情况。
如果使用另一种方式:
TestCase1:a=1,b=11 // true false
TestCase2:a=11,b=1 // false true
//这里的条件覆盖率也是 100%,但是却只覆盖了分支一的代码。
// 完整的条件覆盖并不等同于完整的判定覆盖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 路径覆盖
又称为断言覆盖,“最强覆盖”。
是否程序的每个分支,所有可能的路径都执行到了。这里和判定覆盖是不同的概念。
示例:
if (a < 10) { // 分支一
nReturn += 1;
}
if (b < 10) { // 分支二
nReturn += 10;
}
// 判定覆盖:
TestCase1: a=1,b=1
TestCase2: a=11,b=11
// 这里每个表达式的 true 和 false 的情况都测到了,但是这里只测到了 true true 和 false false 的情况。
// 路径覆盖:
TestCase1: a=1,b=1
TestCase2: a=1,b=11
TestCase3: a=11,b=1
TestCase4: a=11,b=11
// 路径覆盖是要进行排列组合,执行所有可能的路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 灰盒覆盖
# 黑盒覆盖
# 讨论区
由于评论过多会影响页面最下方的导航,故将评论区做默认折叠处理。