当前课程知识点:软件工程 > 第3章 单元测试 > 3.3 白盒测试方法 > 代码覆盖标准
白盒测试方法
使用代码覆盖率
作为测试的衡量指标
代码覆盖率描述的是
代码被测试的比例和程度
如果我们只是编写测试用例
进行测试
而不检查究竟哪些代码被测试过
哪些还没有测试过
就很容易形成测试的漏洞
通过代码覆盖率
我们可以知道
哪些代码没有被覆盖
然后再进一步地
补充更多的测试用例
代码覆盖通常包括语句覆盖
判定覆盖 条件覆盖
判定条件覆盖 条件组合覆盖
和路径覆盖
这六种类型
下面
我们结合一个简单的程序例子
来讲解一下这六种覆盖类型
右边是这个程序的流程图
它一共有5个节点
其中有两个判断节点
第一个
语句覆盖
它要求程序中每一个可执行语句
至少要被执行一次
看一下前面这个例子
如果我们选择a等于2
b等于1 c等于6
这样一个测试用例
三个可执行语句
2 4和5
都执行了一次
那么可以满足语句覆盖的要求
但是如果判断条件有问题
比如说
第一个条件判断中
与被错误地写成或
显然这个测试用例
是无法检查出来的
由于这种方法
仅仅针对程序中
显示存在的可执行语句进行测试
那么对于隐藏条件
和可能达到的隐式逻辑分支
是无法覆盖的
可以说语句覆盖
是最弱的逻辑覆盖准则
第二个
判定覆盖 也称分支覆盖
它要求程序中
每一个判断的取真和取假分支
至少经历一次
也就是判断的真假值都要被覆盖
还是前面这个例子
输入a等于2 b等于1 c等于6
这样一个测试用例可以同时覆盖
判断1和判断2两个取真的分支
输入a等于-2 b等于-1
c等于-3
这个测试用例同时覆盖了判断1
和判断2取假的分支
判定覆盖比语句覆盖要多
几乎一倍的测试路径
当然也具有更强的测试能力
但是如果第二个条件判断中
a等于1写成a小于1
还是无法检测出来
我们知道
大部分判定语句
是由多个逻辑条件组合而成的
如果仅仅是判断
整个判断的最终结果
而忽略每一个条件的取值情况
那么就会遗漏部分的测试路径
显然判定覆盖具有比语句覆盖
更强的测试能力
但仍然是比较弱的逻辑覆盖
第三 条件覆盖
它要求每个判断中
每一个条件的可能取值
至少要满足一次
对于这个例子
输入a等于2 b等于-1
c等于-2
这个测试用例覆盖了
a大于0 b小于等于0
a等于1 c小于等于1
四个条件
输入a等于-1 b等于2 c等于3
这个测试用例就覆盖了
a小于等于0 b大于0
a小于等于1 c大于1
这样四个条件
这两个测试用例
覆盖了两个判断的
所有条件的可能取值
需要说明的是
条件覆盖不一定包含判定覆盖
比如说
上面的测试用例
就没有覆盖判断1的取真分支
和判断2的取假分支
显然条件覆盖只能保证
每一个条件至少有一次为真
而没有考虑到整个判定的结果
第四 判定条件覆盖
它要求判断中
所有条件的可能取值
至少执行一次
而且所有判断的可能结果
也要至少执行一次
对于前面那个例子
输入a等于2 b等于1 c等于6
这个测试用例是覆盖了ab大于0
ac大于1
这样的四个条件
同时也覆盖了两个判断都为真
这样的结果
输入a等于-1 b等于-2
c等于-3
这个测试用例覆盖了
ab小于等于0
ac小于等于1 四个条件
同时覆盖了两个判断为假
这样的结果
显然判定条件覆盖
能够同时满足判定和条件
两种覆盖的标准
但是它还是有不足的
它没有考虑到
条件的各种组合的情况
第五 条件组合覆盖
它是在判定条件覆盖的基础上
增加了每一个条件的
所有可能取值的组合情况
对于示例程序的判断1来说
这里是四种条件的组合情况
这里是对应的判断1的结果取值
最后是判断1满足
判定条件组合的四种取值情况
同样也可以得到判断2的结果
根据前面的分析
我们选择了
图上所示的四个测试用例
它们可以满足每个条件
所有可能的组合
而且覆盖了
每一个判断的所有结果
但是我们在进一步看一下
这些测试用例所覆盖的路径
显然1 2 5这个路径
是没有被覆盖的
第六 路径覆盖
它要求覆盖程序中
所有可能的执行路径
我们把前面条件组合覆盖的
第二个测试用例进行了修改
得到了上面的这样的结果
这个测试用例的结果
覆盖了所有的执行路径
但是我们再进一步地看
它没有覆盖
每一个条件的所有组合情况
为了在覆盖所有执行路径的同时
还能够覆盖所有条件组合的情况
我们又补充了一个测试用例
最终得到了上面显示的
五个测试用例的结果
测试覆盖率
是对测试完全程度的一种评价
但是达到百分之百
只是一个理想的情况
而且即使达到了百分之百
也很难说明测试是完全彻底的
测试覆盖率只能代表
测试过哪些代码
并不能代表测试的好坏
测试覆盖率过低
说明测试做得不够
反过来并不成立
我们不能盲目地追求高的覆盖率
要结合整体要求
和测试成本来决定
-1.1 软件无处不在
--讲课视频
-1.2 软件的本质特性
--讲授视频
-1.3 软件工程的产生与发展
--讲授视频
-1.4 软件工程的基本概念
--讲授视频
-1.5 软件质量实现
--讲授视频
-1.6 业界人士谈软件工程
-测验题--作业
-讨论题
--讨论题
-作业题
--第一张 作业题
-2.1 编程过程与规范
--讲课视频
-2.2 良好的编程实践
--讲课视频
-2.3 Python集成开发环境
--讲课视频
-2.4 代码静态检查
--讲课视频
-2.5 代码性能分析
--讲课视频
-2.6 结对编程实践
--讲课视频
-2.7 刘贺谈软件工程
--讲课视频
--讨论
-测验题--作业
-作业题
--第二章 作业题
-3.1 单元测试概述
--讲课视频
-3.2 黑盒测试方法
--黑盒测试方法
-3.3 白盒测试方法
--基本概念
--代码覆盖标准
--基本路径测试
-3.4 单元测试工具
--单元测试工具
--html
-测验题--作业
-作业题
--第三章 作业题
--作业题附件
-4.1 软件过程
--讲课视频
-4.2 软件过程模型
--讲课视频
-4.3 敏捷开发过程
--讲课视频
-4.4 微软公司开发过程
--邹欣经理自我介绍
--微软开发过程之一
--微软开发过程之二
-测验题--作业
-5.1 团队组织与管理
--讲课视频
-5.2 项目沟通管理
--讲课视频
-5.3 软件项目计划
--讲课视频
-5.4 软件项目估算
--讲课视频
-测验题--作业
-讨论题
--讨论
-6.1 敏捷开发之Scrum
-- 敏捷开发之Scrum
--html
-6.2 用户故事与估算
--讲课视频
-6.3 团队协作工具Tower
-6.4 配置管理
--讲课视频
-6.5 配置管理工具Git
--讲课视频
-测验题--作业
-作业题--作业
-7.1 需求工程师
--讲课视频
-7.2 需求定义
--讲课视频
-7.3 需求的类型
--讲课视频
--讲课视频(2)
-7.4 需求工程过程
--讲课视频
-7.5 需求的主要来源
--讲课视频
-7.6 需求获取技术
--讲课视频
--讲课视频二
--讲课视频三
-7.7 撰写需求文档
--讲课视频
-测验题--作业
-讨论题
--讨论
-8.1 用例建模概念
--讲课视频
-8.2 用例建模过程
--讲课视频
-8.3 用例建模精讲
--讲课视频
-8.4 建模工具介绍
--讲课视频
-8.5 微信抢票应用案例
--讲课视频
-测验题--作业
-讨论题
--讨论
-9.1 面向对象分析
--讲课视频
-9.2 CRC卡片分拣法
--讲课视频-1
--讲课视频-2
-9.3 面向对象设计
--讲课视频-1
--讲课视频-2
-9.4 类图建模
--讲课视频-1
--讲课视频-2
-第9章 面向对象分析与设计--测验题
-讨论题
--讨论
-10.1 顺序图概念
--讲课视频
-10.2 顺序图建模
--讲课视频
-10.3 顺序图风格
--讲义视频
-10.4 状态建模
--讲课视频
-10.5 状态图
--讲课视频
-10.6 状态图精讲
--讲义视频
-测验题--作业
-讨论题
--讨论
-11.1 软件体系结构概念
--讲授视频
-11.2 软件设计原则
--讲授视频
-11.3 软件体系结构风格(一)
--讲授视频
-11.4 软件体系结构风格(二)
--讲授视频
-11.5 软件体系结构风格(三)
--讲授视频
-11.6 软件设计过程
--讲授视频
-11.7 Web系统架构设计
--讲授视频
-11.8 数据库选择策略
--讲授视频
-测验题--作业
-作业题
--html
--html
--html
-作业题--作业
-12.1 交互设计概述
--讲授视频
-12.2 交互设计目标
--讲授视频
-12.3 GUI设计原则
--讲课视频
-12.4 KLM效率模型
--Video
-12.5 Fitts定律
--讲授视频
-12.6 交互设计过程
--讲授视频
-测验题--作业
-13.1 软件测试概念
--讲课视频
-13.2 软件测试类型
--讲课视频
-13.3 软件功能测试
--讲课视频
-13.4 软件性能测试
--讲课视频
-测验题--作业
-14.1 软件部署与交付
--讲课视频
-14.2 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)