数据流测试和控制流
测试的比较
专业:软件工程
班级:
姓名:
学号:
首先,在软件测试中包含有黑盒测试和白盒测试两种测试。
黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,
把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程
序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能
适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻
辑结构,主要针对软件界面和软件功能进行测试。
白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一
种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内
部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进
行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,
从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。
而本文我们要讨论的两种测试都来自于白盒测试。
先来说说控制流测试:
控制流测试基本路径测试和循环测试是最常用且最有效的测试技术。在模块中应对每一
条独立执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次。此时
设计测试用例是为了发现因错误计算、不正确的比较和不适当的控制流造成的错误。此时基
本路径测试和循环测试是最常用且最有效的测试技术。
常见错误:
1.误解或用错了算符优先级;
2.混合类型运算;
3.变量初值错;
4.精度不够;
5.表达式符号错。
目的:
6.不同数据类型的对象之间进行比较;
7.错误地使用逻辑运算符或优先级;
8.因计算机表示的局限性,期望理论上相等而实际上不相等的两个量相等;
9.比较运算或变量出错;
10.循环终止条件或不可能出现;
11.迭代发散时不能退出;
12.错误地修改了循环变量。
用例来说明控制流测试:
(1)画出控制流图
Void Sort(int iRecordNum, int iType)
{
int x=0;
Int y=0;
while ( iRecordNum-->0)
{
If(0==iType)
{x=y+2;break;}
else
if(1==iType)
1
2
3
4
5
6
7
8
9
x=y+10;
else
x=y+20;
}
}
画出其程序流程图和对应的控制流图如下:
10
11
12
13
14
(2)计算圈复杂度
有以下三种方法计算圈复杂度:
A 流图中区域的数量对应于环型的复杂性;
B 给定流图 G 的圈复杂度 V(G),定义为 V(G)=E-N+2,E 是流图中边的数量,N 是流图
中结点的数量;
C 给定流图 G 的圈复杂度 V(G),定义为 V(G)=P+1,P 是流图 G 中判定结点的数量。
(3)导出测试用例
根据上面的计算方法,可得出四个独立的路径。(一条独立路径是指,和其他的独立路
径相比,至少引入一个新处理语句或一个新判断的程序通路。V(G)值正好等于该程序的独立
路径的条数。
路径 1:4-14
路径 2:4-6-7-14
路径 3:4-6-8-10-13-4-14
路径 4:4-6-8-11-13-4-14
根据上面的独立路径,去设计输入数据,使程序分别执行到上面四条路径。
(4)准备测试用例
为了确保基本路径集中的每一条路径的执行,根据判断结点给出的条件,选择适当的数
据以保证某一条路径可以被测试到,满足上面例子基本路径集的测试用例是:
路径 1: 4-14
输入数据:iRecordNum=0,或者取 iRecordNum<0 的某一个值
预期结果:x=0
路径 2: 4-6-7-14
输入数据:iRecordNum=1,iType=0
预期结果:x=2
路径 3 : 4-6-8-10-13-4-14
输入数据:iRecordNum=1,iType=1
预期结果:x=10
路径 2: 4-6-8-11-13-4-14
输入数据:iRecordNum=1,iType=2
预期结果:x=20
介绍完控制流测试,我们接着说数据流测试:
数据流测试,他与路径测试的区别在于,路径测试基本上是从纯数学的角度上来分析的,
数据流测试则是利用了变量之间的关系,通过定义使用路径和程序片得到一系列的测试指标
用于衡量功能性测试的覆盖率。
数据流测试与数据流图没有任何的关系。数据流并不研究任何的路径,而是把关注点放
在了变量接受值的点和使用(或引用)这些值的点的结构性测试形式。数据流的测试主要包括
两类,一类是定义使用路径和程序片两种数据流测试方法,这两种方法都形式化了测试人员
的直觉行为(和分析),他们都接近与测试用例。
什么是测试人员的直觉行为(和分析)?从早期的数据流测试分析所应用的领域可以看出
一些端倪:
1、变量被定义,但是从来没有使用(引用)
2、所使用的变量没有被定义
3、变量在使用之前被定义两次
从以上三方面来看,早期的数据流测试大概就是用来检测我们现在写程序时候常常会
出现的一些 warning——"您所定义的变量未被使用等"之内的问题,这些问题光靠简单的语
法分析器或者是语义分析器是无法检测出来的,我想这个是不是就是数据流的功能呢?现在
一般都是依靠静态分析来得到这些异常问题的。
基于数据流的基本的概念等东西倒是非常的简单,我下面阐述一下几个比较重要的关于
数据流的概念,还是按照定义使用路径和程序片两类区分。
首先要明确一个假设,数据流的假设还是和路径的假设一致,程序图是一个单入口,单
出口,并且不允许有从某个结点到其自身的边。定义使用路径:
a,DEF(v,n),定义结点,变量 v 在结点 n 处定义,定义包括输入语句,赋值语句(等号左
侧),过程调用都是定义结点的例子,如果执行这些语句,变量的值往往会发生变化。
b,USE(v,n),使用结点,变量 v 在结点 n 处被使用,使用包括输出语句、赋值语句(等号
右侧)、条件语句、循环语句、过程调用语句都是结点的使用语句,如果执行这类语句,值
不会被改变。
c,P-use 当且进当 USE(v,n)是谓词使用,比如 a>=2,对于 P-use 的程序图出度>=2
d,C-use 当且仅当 USE(v,n)是计算使用,对于 C-use 的程序图入度<=1
e,定义使用路径:开始结点是 DEF(v,n),结束结点是 USE(v,n)的路径
f,清除路径,当定义结点和清除结点中间没有其他的定义结点的时候为清除路径。
定义使用路径也是一组指标,包括全路径、全定义-使用路径、全使用、全计算使用/部
分谓词使用、全谓词使用/部分谓词使用、全定义、全谓词使用、全边、全结点,这些都是
通过对定义使用路径的定义得到的一些测试指标,与前面的 DD 路径一样是用来检测功能性
测试覆盖率的。
程序片:
程序片的概念倒是很简单,就一个 S(V,n)就是说结点 n 之前的所有对 V 中的变量值做出
贡献的所有语句片段的总和。很明显的,做出贡献的一定是上面所述的 USE(v,n),但是要注
意的是这里的使用路径包括直接和间接的。举个例子说明。比如说在结点n 有个变量a=a+b+c,
那么很明显的知道这里影响 a 的值包括 a,b,c,所以自然要将在结点 n 前影响到值 a,b,c 三个变
量的所有结点都算进去,知道出现一个常量语句,例如 b=2230,那么说明没有什么再影响 b
了。
程序片的一个最大的使用我认为是用来排除程序片段的,比如说现在有两个程序片,一
个是第 8 行的 v,一个是第 10 行的 v,假设第 8 行和第 10 行之间没有任何常量对 v 进行赋值,
那么 p2=(p1,9,10),这里假设第 9 行和第 10 行影响了 v 的值,那么很自然的想到,如果 8 行
之前的程序片 p1 中的变量 v 没有发生问题,而第 10 行的程序片 p2 出现了问题,那么变量
v 的异常必然在 p2-p1 这段程序片上。因此程序片能够很快定位出异常,这个和我们在调试
程序的时候的直觉是一致的。另外有个知识点,如果两个不同结点的变量的 v 的程序片 p1
和 p2 相等,那么对应的路径就是清除路径。
如此数据流测试的基本概念就完结了,数据流测试往往应用于计算密集的程序,数据流
能够很方便的描述程序的部分片段结构,定义使用路径具有和程序片相似的性质,如果 p1
是包含了 p2 的一条定义使用路径 ,如果 p2 没有出现问题,那么问题必然出现在 p1-p2 这
段路径上了。然后片与定义使用路径一个区别在于片并不能很好的反应测试用例,这个也很
容易理解,因为片是反应局部状况的,而定义使用路径则是基于路径的,路径是具有结构化
性质指标的。这些就是基于数据流测试的全部。
总结:以上便是我的控制流测试和数据流测试的比较。在做这次作业期间,我结合老师
所讲,并进行了大量的查找资料,终于完成了这次作业。我想说,老师所要求的这次作业,
课本上讲的并不详细,这体现了老师并不死板教条而是因材施教,结合我们的情况给我们讲
了真正重要的知识,让我们在完成这次作业时能够真正对所学知识有所理解!