# 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

这种虽然测试覆盖率达到了 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
判定覆盖: // 判定覆盖只需要能让代码分别执行到分支一和分支二就可以。
    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

# 路径覆盖

又称为断言覆盖,“最强覆盖”。

是否程序的每个分支,所有可能的路径都执行到了。这里和判定覆盖是不同的概念。

示例:

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

# 灰盒覆盖

# 黑盒覆盖

# 讨论区

由于评论过多会影响页面最下方的导航,故将评论区做默认折叠处理。

点击查看评论区内容,渴望您的宝贵建议~
Last Updated: 2/17/2023, 11:30:03 AM