控制流测试

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

原则

  • 控制流图是一个带有开始节点和结束节点的有向图
  • 程序的指令(语句)是通过节点来表示的
  • 一个不带分支和汇总的语句序列可以简单地用一个节点来表示
  • 语句之间的路径通过有向线(控制流)表示
  • 控制流图的开始和结束节点在实际应用中常常被省略

测试活动

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

主要的控制流测试方法:

  • 语句覆盖
  • 分支覆盖
  • 判定覆盖
  • 路径覆盖(包括结构化的路径覆盖等)

语句覆盖

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

  • 必要的、最简单的,但也是最弱的标准
  • 无法检测到缺失的语句
  • 但能发现无法执行到的语句(死代码)

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

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

分支覆盖

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

  • 在实践中作为最小的测试标准
  • 能发现无法执行到的程序分支
  • 无法发现缺失的分支
  • 没有测试到分支的组合

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

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

判定覆盖

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

  • 如果达到 100% 判定覆盖,则等价于分支覆盖
  • 但这里计数的不是分支,而是判定的输出,判定覆盖在小于 100% 时,判定的覆盖率与分支的覆盖率可能有所不同!

覆盖率:
判定覆盖 = 已执行的判定结果 / 所有的判定结果总数 * 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):在控制流图内的每一个分支序列(路径)都应该执行一次!

强标准,因为

  • 在包含循环时,可能会有无数的路径
  • 在具有 k 个连续的分支时,则会有 2k种不同的路径

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

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

  • 从最简单的、功能上有意义的路径开始(从入口到出口的最简单路径)
  • 每次新的路径应该只是对现有的微小变化(如果可能,仅只改变一个判定输出/真值)
  • 优先考虑短的路径、简单路径、功能上有意义的路径、不带循环的路径
  • 应该达到 100% 判定覆盖
  • 避免功能上无意义的路径,如果为了达到判定覆盖必须执行这路径,则应该检查是否是一个错误,如果不是,则增加此路径。
  • 优先考虑那些很有可能是实际执行的路径

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

  • 部分路径测试经常用在安全关键软件的测试中
  • 常用条件覆盖方法组合使用,因为它们检查软件的另一个方面
  • 当只需要增加少量的测试用例时,它可以作为分支测试的深入
  • 应该使用工具来创建控制流图

结构化的路径覆盖

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

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

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

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

  • 最小和最大迭代次数,排除迭代数
  • 在程序中的循环一般:嵌套、交叉、非结构化的循环

条件测试

  • 简单条件测试
  • 条件测试/判定测试 或 判定条件测试
  • 改进的条件/判定测试(MC/DC)
  • 复合条件测试

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

简单条件测试

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

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

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

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

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

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

  • 每一个判定都应该要对它的二个值(真和假)进行测试
  • 每个原子条件都应该要对它的二个值(真和假)进行测试

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

  • 此方法适合于测试那些重要的,但还不是关键和核心的代码
  • 此方法与后面的二种方法相比需要较少的测试用例,但是比单纯的判定覆盖要更繁琐(还要看原子条件的覆盖)

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

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

  • 每一个判定都应该要对它的二个真值(真和假)进行测试
  • 每一个原子条件都应该对它的二个真值(真和假)进行测试
  • 在测试中能够表明,每一个原子条件的值独立地影响表达式的结果

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

  1. 先列出所有可能的真值组合
  2. 选出那些单个原子条件影响结果的测试用例对
  • 提供一个更高的控制流覆盖并能发现比条件覆盖/判定覆盖更多的缺陷
  • 需要更多的测试用例,但是:
    • 当有 n 个原子条件,通常需要 n+1 个测试用例。测试用例的数目与条件的数目是线性关系(线性增长)。
    • 很适合安全关键系统,例如,在航空和航天业广泛采用改进的条件测试/判定测出(MC/DC)方法

限制:耦合的条件

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

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

解决方法:

  • MC/DC 仅仅针对不耦合的条件
  • 对于含有耦合条件的每个判定作为特例,视不同的情况生成测试用例

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

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

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

  • 要覆盖这个条件的二个真值(真/假)
  • 要覆盖整个判定式的二个真值(真/假)
  • 所有其他原子条件具有相同的逻辑或不进行评估。

复合条件测试

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

  • 复合条件覆盖包含了 MC/DC 覆盖
  • 因为测试用例可以从真值表直接导出,所以测试的设计更为简单
  • 缺点:非常耗资(n 个原子条件将会有 2n个组合)
  • 长期需要稳定可靠的嵌入式系统测试中常会使用此方法(例如,在电话网内的交换机系统,按要求应该运行 30 年),但也逐渐被 MC/DC 所替代

控制流测试 (语句覆盖、分支覆盖、判定覆盖、路径覆盖) 与条件测试相关推荐

  1. 软件测试(基本路径测试、环形复杂度、路径覆盖)

    程序集中独立路径的确定方法 如图所示的控制流图,采用基本路径测试法,给出此程序的基本集: 环形复杂性是一种为程序逻辑复杂性提供定量测量的软件度量.当该度量用于基本路径测试方法,计算所得的值给出了程序基 ...

  2. ssl1341-最小路径覆盖【最大匹配,最小路径覆盖,图论】

    正题 大意 给一个无向图,求最少需要多少条路径可以连接所有点. 解题思路 一个公式就好了 最小路径覆盖数=最大匹配数 代码 #include<cstdio> #include<cst ...

  3. shell变成中的测试语句

    Shell编程中的条件测试 在Linux编程中经常会用到判断数值的大小,字符串是否为空这样或那样的条件测试语句 今天说说Linux中的常用的条件测试语句 1,  判断两个数字的大小 -eq 数值相等 ...

  4. 白盒测试之语句覆盖、判定覆盖、条件覆盖等

    1.定义说明 (1)白盒测试:白盒测试是一种测试用例设计方法:白盒测试的方法总体上分为静态分析方法和动态分析方法两大类.主要用于单元测试阶段,代码和逻辑的测试,重点复杂的测试,是一种测试用例设计方法. ...

  5. 白盒测试---基本路径覆盖法

    转载自:https://blog.csdn.net/xieminyao123/article/details/79133449 白盒测试的测试方法有代码检查法.静态结构分析法.静态质量度量法.逻辑覆盖 ...

  6. 最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)

    在讲述这两个算法之前,首先有几个概念需要明白: 二分图:  二分图又称二部图,是图论中的一种特殊模型.设G=(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边( ...

  7. 【网络流24题】解题报告:C、最小路径覆盖问题(有向无环图最小路径覆盖)(最大流)

    C.最小路径覆盖问题(有向无环图最小路径覆盖)(最大流)[省选/NOI- ] 拆点最大流 [问题分析] 有向无环图最小路径覆盖,可以转化成二分图最大匹配问题,从而用最大流解决. [建模方法] 构造二分 ...

  8. POJ 1422 Air Raid (最小路径覆盖)

    题意 给定一个有向图,在这个图上的某些点上放伞兵,可以使伞兵可以走到图上所有的点.且每个点只被一个伞兵走一次.问至少放多少伞兵. 思路 裸的最小路径覆盖. °最小路径覆盖 [路径覆盖]在一个有向图G( ...

  9. 基于BINN算法的CCPP全路径覆盖算法

    1.CCPP整体算法文档 1.1 ccpp基础介绍 全路径覆盖算法(CCPP: Complete Coverage Path Planning)作为扫地机器人较为关键的组成部分,其问题的本质是:在栅格 ...

最新文章

  1. java File 的相对路径
  2. 如何解决java.lang.NoClassDefFoundError:Java 9中的javax / xml / bind / JAXBException
  3. [usb]usb otg和host
  4. Maven 项目名称红色感叹号的问题总结
  5. 【每周NLP论文推荐】 聊天机器人中FAQ相关的论文推荐
  6. OpenTSDB介绍
  7. 在.Net 模板页中使用CSS样式
  8. 核心频率个加速频率_流处理器、核心频率、 位宽……这些显卡参数你知道吗?—— 电脑硬件科普篇(八)...
  9. [深入学习C#]LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询
  10. no.7_qzhai 开心版_开心宝贝GM版下载-开心宝贝GM版安卓下载
  11. 家里有古玩古董摆放在家中好吗?
  12. U盘安装系统时黑屏! 无法进入解决办法
  13. 虚拟机的安装中遇到的问题(WIN10主机)
  14. DB9 公头母头引脚定义及连接、封装
  15. java同构数_Java 同构数的问题
  16. 电脑html5播放黑屏,电脑看视频黑屏,教您电脑看视频黑屏有声音怎么办
  17. 手游实时阴影方案之Projector Shadow
  18. ensp路由器MTU设置1200后,ping不通丢包问题
  19. python教程 廖雪_Python 2.7教程
  20. C语言基础——数据输入输出

热门文章

  1. 集合和数组的相互转换
  2. Java 字符串压缩/解压【开发记录】
  3. 掌握基本的命令行,迈向 Linux 第一步
  4. 短文《“窝囊”的父亲》
  5. 华为手机如何升级鸿蒙系统_四款华为手机可以直接升级鸿蒙2.0系统,正在用的赚大了!...
  6. java 方法中final_Java中final的使用方法
  7. Java之super用法
  8. 3分钟整明白 缓存热点 是咋回事
  9. com.netflix.hystrix.exception.HystrixRuntimeException: 类名#方法名(String,String) failed错误引起的一连串思考
  10. 配置NTP服务器时间同步