控制流测试

控制流测试 (Control Flow Testing):是一种在考虑测试对象的控制流情况下导出测试用例的测试方法,并且借助于控制流图能评估测试的完整性(覆盖率)。

原则

测试活动

  1. 列出应该覆盖的路径
  2. 设计输入、输出使得程序能按逻辑含义走到此路径
  3. 运行测试来观察此路径是否走到。如果没有走到,则要么是对逻辑理解不足,要么是逻辑本身有错误。

主要的控制流测试方法:

语句覆盖

语句覆盖(C0-覆盖)/ 语句覆盖测试 / 语句测试(Statement testing):在控制流中每条可执行的语句至少被执行一次!

覆盖率:
语句覆盖 = 已执行的语句数目 / 所有语句的总数目 * 100%

语句即节点,控制流图内的所有节点都走到即为 100% 语句覆盖

分支覆盖

分支覆盖(C1-覆盖)/ 分支覆盖测试 / 分支测试(Branch testing):在控制流图内的每一条边都至少被执行一次!

覆盖率:
分支覆盖 = 已执行的分支数目 / 分支总数目 * 100%

每一条边即每一条控制流(有向线)都走过了,才为 100% 分支覆盖

判定覆盖

判定覆盖 / 判定测试(Decision testing):每一个可能的判定输出都应该被测试到!

覆盖率:
判定覆盖 = 已执行的判定结果 / 所有的判定结果总数 * 100%

判定覆盖计数的是判定的结果,即布尔值truefalse的个数

示例代码:

if (x > y) {
    y = x;
}
if (y > z) {
    z = y;
}

这段代码一共有两个if判定,每个判定都可以有truefalse两个判定结果,一共是四个判定结果。

所以如果只用一条 case 同时覆盖x > yy > z,实际上执行到的是两个判定结果,判定覆盖率为 2 / 4 = 50%

在同一条 case 的情况下,画出控制流图,分支覆盖一共有 9 条有向线(包括开始节点和结束节点的两条有向线),有两条分支没有走到,所以分支覆盖率为 7 / 9 = 77.8%

路径覆盖

路径覆盖(C-覆盖,C4-覆盖)/ 路径覆盖测试 / 路径测试(Path testing):在控制流图内的每一个分支序列(路径)都应该执行一次!

强标准,因为

定制选择有意义的路径(Beizer)
限制重复次数:循环覆盖测试方法
限制考虑的路径:片段对覆盖(Segment pair)

针对路径测试,按照 Beizer 的启发式方法 [Beizer90]:

从开始节点到结束节点之间全部可能的路径都走过才是 100% 路径覆盖

结构化的路径覆盖

结构化的路径覆盖(Ci(k)-覆盖):执行在一个内循环中运行次数还没有超过 k 次的所有路径!

对于 k = 2 时,这种方法也成为内部边界 - 路径覆盖(Boundary Interior)

仅仅当 k 为很小值时才有实际意义。

其他针对循环的测试的标准:


条件测试

它们的区别是测试的深度(从上往下越来越深入),需要的测试用例数,以及能发现多少缺陷

简单条件测试

简单条件测试(Condition testing:一个布尔表达式内的每个原子条件(Atomic condition) 都应该对其二个值(真/TRUE 和 假/FALSE)进行测试。

一个原子条件是一个不包含逻辑运算符 NOT、AND 或 OR 的条件

如果在程序内的所有条件都仅仅是一个原子条件,则相应的简单条件测试对应为判定测试。

满足简单条件覆盖不一定会满足判定覆盖,所以简单条件测试仅仅是理论上进行探讨,没有太大实际意义

条件测试/判定测试 或 判定条件测试

条件测试/判定测试(Decision condition testing)

包含了简单条件覆盖以及判定覆盖。通常不需要比简单条件覆盖更多的测试用例,但是必须谨慎选择。

改进的条件/判定测试(MC/DC 测试)

改进的条件/判定测试(Modified Condition/Decision Coverage)

针对单个的原子条件,必须关注具有不同结果的测试用例,结对进行比较。

  1. 先列出所有可能的真值组合
  2. 选出那些单个原子条件影响结果的测试用例对

限制:耦合的条件

例如: (A AND B) OR ((NOT A) AND C)

这些条件称作耦合(重叠),而这些耦合的项往往无法实现 MC/DC 测试。

解决方法:

限制:短路/精简的评判(Short-circuiting)

在有条件的进行评价的程序设计语言中往往无法达到 MC/DC 的覆盖。

解决方法:必须降低“测试用例对”的要求,对于每个原子条件生成一对测试用例,

复合条件测试

复合条件测试(Multiple condition testing):测试原子条件的所有可能的真值(真/假)组合


↙↙↙阅读原文可查看相关链接,并与作者交流