分支(判定)覆盖是设计一定量的测试用例使程序中的每个判断语句的真假分支都得到覆盖,但是分支覆盖不能保证判断语句中每个条件的真、假分支都得到覆盖。那么,使用条件覆盖是否可以解决覆盖不全面的问题呢?通过上一小节的学习,我们发现:条件覆盖虽然可以覆盖判断语句中每个条件的真、假分支,但可能没有将所有判断语句的真、假分支覆盖全,仍然做不到对程序的 100% 的覆盖。所以,我们需要把分支(判定)和条件覆盖一起进行综合考虑。
分支-条件覆盖,也叫判定-条件覆盖,是指运行代码进行测试时,程序中所有判断语句中的条件取值为真、取值为假的情况和整个判断语句取真分支、假分支的情况都被覆盖到(即,至少被执行过一次)。分支条件覆盖率的计算方法为:( 测试时覆盖到的条件语句为真、为假情况的总数 + 判断语句为真、为假情况的总数) / (程序中条件语句真、假情况的总数 + 判断语句为真、为假情况的总数)。例如,判断语句 if(a == 0 or b > 2) 中有两个条件 a == 0 和 b > 2 ,如果设计一个测试用例 a = 0 , b = 3 ,可以覆盖条件 a == 0 的真分支和条件 b > 2 的真分支,并可覆盖整个判断语句 if(a == 0 or b > 2) 的真分支,分支-条件覆盖率为 3 / 6 = 50%; 如果再设计一个测试用例 a = 2 , b = 2 ,则可以覆盖条件 a == 0 的假分支和条件 b > 2 的假分支,并可覆盖整个判断语句 if(a == 0 or b > 2) 的假分支,分支-条件覆盖率则可达到 100% 。
本实验主要通过实例介绍使用分支-条件覆盖法设计白盒测试用例的方法。
为了方便作比较,本实验仍然使用如下的代码作为测试对象:
public static int test(int a,int b,int c) {
1 int result = 0;
2 if(a == 0 or b > 2) {
3 result = b - a;
}
4 if(a > 0 and c > 0 ) {
5 result = c * a;
}
6 return result;
}
使用条件覆盖法设计白盒测试用例的具体步骤如下:
第 1 步:分析待测试代码,画出程序的流程图。上述代码的参考流程图如下图所示:
第 2 步:分析流程图。
通过分析流程图,我们可以知道:这段代码中有两个判断语句,分别是上图中标识为 ② 和 ③ 的语句,语句 ② 中有两个条件语句,分别为 a == 0 和 b > 2 ;语句 ③ 中也有两个条件,分别为 a > 0 和 c > 0 。为了使后续的分析过程更加清晰明了,我们先来梳理一下流程图中的判断语句及语句中的条件项,并进行相应的标识。
判断语句:
判断语句 | 取值 | 标识 |
---|---|---|
a == 0 or b > 2 | 真 | T1 |
a == 0 or b > 2 | 假 | F1 |
a > 0 and c > 0 | 真 | T2 |
a > 0 and c > 0 | 假 | F2 |
条件:
条件 | 取值 | 标识 |
---|---|---|
a == 0 | 真 | Y1 |
a == 0 | 假 | N1 |
b > 2 | 真 | Y2 |
b > 2 | 假 | N2 |
a > 0 | 真 | Y3 |
a > 0 | 假 | N3 |
c > 0 | 真 | Y4 |
c > 0 | 假 | N4 |
第 3 步:使用分支-条件覆盖法编写测试用例。
根据分支-条件覆盖法的定义,这种方法是将分支覆盖和条件覆盖结合起来,设计一些测试用例,使程序中每个判定语句中的每个条件为真和为假的情况都至少被执行一次,并且每个判断语句本身为真、为假的情况也至少被执行一次。因此,我们可以设计如下表中的测试用例来对程序中的两个判断语句及其四个条件进行覆盖:
测试用例编号 | 输入数据 | 预期结果 | 条件覆盖情况 | 分支覆盖情况 |
---|---|---|---|---|
testcase_01 | a = 0 , b = 5 , c = 0 | result = 5 | Y1、Y2、N3、N4 | T1、F2 |
testcase_02 | a = 5 , b = 1 , c = 3 | result = 15 | N1、N2、Y3、Y4 | F1、T2 |
通过执行以上两个用例可以实现程序的分支-条件 100% 覆盖。那么,是不是实现了分支-条件覆盖就代表程序已经被覆盖全面了呢?下图是该程序标识了执行路径的流程图:
从上图中可以看出,这段代码共有四条路径,分别为:路径 1( A - C )、路径 2( A - D )、路径 3 ( B - C )、路径 4( B - D )。通过分析,我们可以知道:测试用例 testcase_01 覆盖的路径是路径 3 ( B - C ),测试用例 testcase_02 覆盖的路径是路径 2( A - D ),路径 1 和路径 4 没有被覆盖到。所以,分支-条件覆盖的覆盖强度仍然不够,如果判断语句中的逻辑运算存在问题可能仍然无法被发现。例如,如果将第一个判断语句 if(a == 0 or b > 2) 中的 or 错写成了 and ,使用这两个测试用例仍然能执行通过,但未检查出程序中的逻辑运算错误。
分支-条件覆盖可以使程序中的判断语句以及判断语句中的条件的真、假分支都得到覆盖,但是分支-条件覆盖达到 100% 仍然强度不够,程序中的某些逻辑运算等错误仍然可能不会被发现。
文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr
文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc
文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8
文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束
文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求
文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname
文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立
文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码
文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词
文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限
文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定
文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland