六.白盒测试
1.程序控制流图
是对程序流程图进行简化后得到的,它可以更加突出的表示程序控制流的结构。
控制流图中包括两种图形符号:
1.节点
2.控制流线
常见结构的控制流图:
1.顺序结构
2.IF选择结构
3.while重复结构
4.until 重复结构,不管条件如何先做一次循环
5. CASE多分支结构
判定节点(谓词节点)
由判定节点发出的边必须终止于某一个节点
流程图转换为流图:
如果判断中的条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)连接的复合条件表达式,则需要改为一系列只有单条件的嵌套的判断。(A和B叫做判断节点)
例如:
1 if a or b
2 x
3 else
4 y
2.逻辑覆盖测试
2.1 语句覆盖
概述:根据每个可执行语句是否被执行,即每行代码是否都被执行了并且别测试了
含义:选择足够多的测试数据使被测程序中每条语句至少被执行一次
要求:要达到100%声明覆盖面,每一条语句都要被测试覆盖
优点:它可以直接应用于目标代码,并且不需要处理源代码
缺陷:它对一些控制结构是不敏感的,对程序执行逻辑的覆盖很低,往往发现不了判断逻辑中逻辑运算符出现的错误
2.2 分支覆盖
概述: 又称判定覆盖,报告在控制结构中是否测试了布尔表达式取值分别为真和假的情况。分支覆盖保证只要程序能跳转,就能跳转到所有可能的目的语句
含义:设计足够的测试用例,使得每个判定至少都获得一次“真”和“假”,或使得每一个去“真”分支和取“假”分支至少经历一次
优点: 具有语句覆盖的简单性且没有语句覆盖所存在的问题
缺陷:忽略了在布尔表达式内的分支,当程序中分支的判断由几个条件组合构成时,它未必能发现每个条件的错误
2.3 条件覆盖
概述:报告每个布尔型子表达式的结果是真是假,是否都被执行和测试了。子表达式是用逻辑与运算符和逻辑或运算符分离开的。条件覆盖检查每个判定点(例如真、假的判定)是否被执行和测试了
含义:构建一组测试用例,使得每一个判定语句 中每个子逻辑条件的可能值至少满足一次
2.4 分支/条件覆盖
概述: 条件覆盖和分支覆盖的一个混合
归纳:有两者的简单性但没有两者的缺点。分支/条件覆盖的含义是设计足够的测试用例,使得判定中每一个布尔型子表达式条件的所有可能(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次
2.5 路径覆盖
概述:路径覆盖报告是否每个函数的每一条可能的路径都被走过。它检查代码中给定部分每条可能的路径是否都被执行了并且被测试了。一条路径是从函数的入口到出口分支里的一个唯一序列
优点:进行非常彻底的测试,比判定覆盖强
缺点:路径是以分支的数增加而指数级增加,许多路径由于数据相关不可能被执行
3.路径分析与测试
3.1 程序路径表示
独立路径:所谓独立路径,是指至少包含一条新边的路径,也就是包含一些前面的路径未包含的语句
3.2 程序中线性独立路径数计算
环路复杂度也叫圈复杂度,其值等于流程图中的区域个数,利用圈复杂度可以确定程序基本路径集合的独立路径数
有以下三种方法计算环路复杂度:
1.流图中区域的数量对应于环型的复杂性,圈复杂度 =流图中的区域个数
2.给定流图G的环路复杂度V(G),定义为V(G)=E-N+2 , E是流图中边的数量,N是流图中结点的数量
3. 给定流图G的环路复杂度V(G),定义为V(G)=P+1 ,P是流图G中判定结点的数量
3.3 Z路径覆盖
为解决实际操作中路径覆盖难以实现问题,必须舍弃一些次要因素,简化循环结构,从而极大地减少路径的数量,使得覆盖这些有限的路径成为可能,采用简化循环方法的路径覆盖就是Z路径覆盖
所谓简化循环就是减少循环的次数,不考虑循环体的形式和复杂度如何,也不考虑循环体实际上需要执行多少次,只考虑通过循环体零次和一次这两种情况,零次虚幻是指跳过循环体,从循环体的入口直接到循环体的出口,
通过一次循环体是指检查循环初始值。根据简化循环的思路,循环要么执行,要么跳过,这和判定分支的效果是一样的,可见,简化循环就是讲循环结构变成选择结构
3.4 独立路径测试及测试用例生成
1.生成控制流图:

第二步;计算环路复杂度
计算如下:
流图中有四个区域:
V(G)=10条边-8节点+2=4;
V(G)=3个判定节点+1=4
第三步,导出测试用例
根据上面的计算方法,可得出四个独立的路径(一条独立路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判定的程序通路。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
根据上面的独立路径,去设计输入数据使程序分别执行到上面四条路径
第四步,准备测试用例
为了确保基本路径集中的每一条路径的执行,根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测到
3.5 独立路径测试及测试用例生成步骤总结
1.流程图---控制流图
2.计算圈复杂度
3.找到四条基本路径
4.根据基本路径找到输入输出
4.数据流分析
定义、使用缺陷:
1. 变量被定义,但从来没有使用(引用)
2.所使用的变量没有被定义
3. 变量在使用之前被定义两次
数据流测试 指关注变量接收值和使用这些值的路径,是结构性测试的一种
4.1 定义节点 (DEF(v,n))
输入语句,赋值语句,循环控制语句和过程调用。就是说这个值被修改、被赋值就叫做定义节点
4.2 使用节点(VSE(v,n))
输出语句,赋值语句,条件语句,循环控制语句和过程调用
4.3 谓词使用(P-use)/ 计算使用(C-use)
谓词使用对应谓词使用节点的出度>=2
计算使用对应计算使用的节点的出度<=1
4.3 使用路径(dc-path)
定义节点出现一次
4.4 清除路径(du-path)
定义节点可出现两次
使用路径和清除路径描述了从值被定义的点到值被使用的点的源数据的数据流
5.变异测试
尽可能缩小错误搜索的范围
1.便于集中目标于对软件 危害较大的错误
2.暂时忽略危害较小的错误,以此取得较高的测试效率,降低测试成本
5.1 强变异
给定一个程序P和一个测试数据集T,通过变异算子为P产生一组变异体Mi(Mi要合乎语法的变更)
对P和M都使用T进行测试运行,如果某Mi在某个测试输入t上与P产生不同的结果,则该Mi被杀死;
若某Mi在所有的测试数据集上都与P产生相同的结果,则称其为活的变异体。接下来对或的变异体进行分析,检测其是否等价于P;对不等价
于P的变异体M进行进一步的测试,直到充分性度量达到满意的程度
p' 称为P的变异体
如果对于T中的测试t,有P(t)!= P'(t) ,称做P' 与P有区别,或者t杀死P'
如果T中所有的测试t使得P(t)=P'(T), 称T不能区别P和P',那么称在测试过程中P’ 是活的
如果在程序P的输入域中不存在任何测试用例t使得p与P’区别,则称P’等价于P
如果P' 不等价于P,而且T中没有测试能够经P' 与P区分,则认为T是不充分的
不等价而且是活的变异体为测试人员提供一个生成新测试用例的机会,进而增加测试T
5.2 弱变异

浙公网安备 33010602011771号