白盒测试分类

白盒测试概述

        白盒测试是对软件的过程性细节做细致的检查,把测试对象看做一个打开的盒子,允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。  
        白盒测试只测试软件产品的内部结构和处理过程,而不测试软件产品的功能,用于纠正软件系统在描述、表示和规格上的错误,是进一步测试的前提。白盒测试分静态和动态两种:静态白盒测试是在不执行的条件下有条理地仔细审查软件设计、体系结构和代码,从而找出软件缺陷的过程,有时也称为结构分析。动态白盒测试也称结构化测试,通过查看并使用代码的内部结构,设计和执行测试
 

逻辑覆盖测试

 

1.语句覆盖

概述:根据每个可执行语句是否被执行,即每行代码是否都被执行了并且被测试了。
 
含义:选择足够多的测试数据使被测程序中每条语句至少执行一次。
 
要求:要达到100%声明覆盖面,每一条语句都要被测试覆盖。
 
优点:它可以直接应用于目标代码,并且不需要处理源代码。
 
缺陷:它对一-些控制结构是不敏感的,对程序执行逻辑的覆盖很低,往往发现不了判断逻辑中逻辑运算符出现的错误。
 
 

2.分支覆盖(判定覆盖)

概述:报告在控制结构中是否测试了布尔表达式取值分别为真和假的情况。分支覆盖保证只要程序能跳转,就能跳转到所有可能的目的语句。
 
含义:设计足够的测试用例,使得每个判定至少都获得一次“真”和“假,或使得每一个取“真”分支和取“假”分支至少经历一次。。
 
优点:具有语句覆盖的简单性且没有语句覆盖所存在的问题。
 
缺陷:忽略了在布尔表达式内的分支,当程序中分支的判定由几个条件组合构成时,它未必能发现每个条件的错误。
 
 

3.条件覆盖

概述:报告每个布尔型子表达式的结果是真是假,是否都被执行和测试了。子表达式是用逻辑与运算符和逻辑或运算符分离开的。条件覆盖检查每个判定点(例如真/假的判定)是否被执行和测试了。
 
含义:构建一组测试用例,使得每一个判定语句中每个子逻辑条件的可能值至少满足一次。
 
 

4.修正条件判定覆盖

 
        修正条件判定覆盖是判定中每个条件的所有可能结果至少出现一次,每个判定本身的所有可能结果也至少出现一次,每个入口点和出口点至少要唤醒一次,并且每个条件都显示能单独影响判定结果。  
        MC/DC定义的第一部分是标准的语句覆盖,第一和第二部分是条件判定覆盖准则,第四部分是MC/DC特有的判定条件。定义中最关键的字是“独立影响”,也就说明每一次每一个判定条件发生改变,必然会导致一次判定结果的改变,消除判定中的某些条件会被其它的条件所掩盖的问题,从而使得测试更加完备。  
        MC/DC的目的就是消除测试过程中的各个单独条件之间的相互影响并且保证每个单独条件能够分别影响判定结果的正确性。
        MC/DC继承了语句覆盖准则、条件判定覆盖准则、多重条件覆盖等判定条件,同时加入了新的判定条件。在条件判定覆盖准则中,不能够保证在模型中所有的条件都被覆盖,因为一个判定中的某些条件会被其它的一些条件所掩盖。如:任何一个条件与“1”进行“或”运算时,这个条件都不会起到任何的作用;同样,任何一个条件与“0”进行“与”运算时,这个条件都不会起到任何的作用。
 
优点:
(1) 继承了多重条件覆盖的优点;  
(2) 线性地增加了测试用例的数量;  
(3) 对操作数及非等式条件变化反应敏感;  
(4) 具有更高的目标码覆盖率。  
        在许多软件系统中,尤其是以嵌入式和实时性为特征的航空机载软件中,MC/DC得到了广泛的应用。如:MC/DC已经被应用于RTCA/DO-178B标准当中,这个标准主要用于美国测试飞行软件的安全性审查。
 

5.分支/条件覆盖(条件组合覆盖)

 
基本思想:设计测试用例使得判断中每个条件的所有可能至少出现一次,并且每个判断本身的判定结果也至少出现一次,与条件覆盖的差别是条件组合覆盖不是简单地要求每个条件都出现“真”与“假”两种结果,而是要求这些结果的所有可能组合都至少出现一次。  
        条件组合覆盖是一种相当强的覆盖准则,可以有效地检查各种可能的条件取值的组合是否正确。它不但可覆盖所有条件的可能取值的组合,还可覆盖所有判断的可取分支,但仍可能会遗漏掉某些路径,测试还不完全。
 
概述:条件覆盖和分支覆盖的一个混合。
 
归纳:有两者的简单性但是没有两者的缺点。分支/条件覆盖的含义是设计足够的测试用例,使得判定中每个布尔型子表达式条件的所有可能(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次。
 
 
 
缺陷:例如,判定条件a&& (b | c)中的第一个运算符“&&”错写成运算符“|I”或第二个运算符“||” 错写成运算符“&&”时,虽然使用表一中的2组测试用例可以使得覆盖率为100%,但它们无法发现这类错误。
 
 

6.路径覆盖

 
概述:路径覆盖报告是否每个函数的每一条 可能的路径都被走过。它检查代码中给定部分每条可能的路径是否都被执行了并且被测试了。一条路径是从函数的入口到出口分支里的一一个唯一序列。
 
优点:进行非常彻底的测试,比判定覆盖强。
 
缺陷:路径是以分支的数增加而指数级增加许多路径由于数据相关不可能被执行
 

7.逻辑覆盖总结

 
         逻辑覆盖法中语句覆盖、判定覆盖、条件覆盖、条件判定覆盖、条件组合覆盖和路径覆盖具有相互包含的关系,其中语句覆盖最弱,从下至上依次增强,路径覆盖的效果最好。
 
        根据测试用例设计的需要,逻辑覆盖法将不同的设计方法有效地结合起来,设计出覆盖率最大、最有效的测试用例。
 
 
 

程序控制流图

1.定义:

        (简称流图)是对程序流程图进行简化后得到的,它可以更加突出的表示程序控制流的结构。
 
        基本路径测试使用程序流程图来描述程序的结构性。程序流程图是一个有向图,又称为框图,采用不同图形符号标明条件或者处理等。由于这些符号在路径分析时不重要,为了突出控制流结构,将程序流程图进行简化,便产生控制流图。

 

2.控制流图中包括两种图形符号:

  • 节点:以标有编号的圆圈表示,用于表示程序流程图中矩形框、菱形框的功能,是一个或多个无分支的语句或源程序语句。
  • 控制流线或弧:以箭头表示,与程序流程图中的流线功能一致,表示控制的顺序。
 

3.常见的控制流图

  控制流图是用于描述程序控制流的一种图示方法。控制流图只有节点和控制流线(或弧)两种图形符号

 
 
判定节点(谓词节点)
由判定节点发出的边必须终止于某一个节点,
由边和节点所限定的范围被称为区域,
当对区域计数时,图形外的区域也应记为一个区域。
 
 

4.流程图转换为流图

 
①如果判断中的条件表达式是由一个或多个逻辑运算符(OR, AND, NAND, NOR连接的复合条件表达式,则需要改为一系列只有单条件的嵌套的判断。(A和B叫做判断节点)
 
 
②一个节点可以包含1个或多个连续的无分支语句,节点不允许含有复合节点
 

 
 

 
 
程序流程图简化成控制流图时,需注意以下情况:
  (1) 在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。
  (2) 边和结点圈定的范围称为区域。需要注意,图形外的区域也应记为一个区域。
 
 
        为了评估程序的控制结构,控制流图矩阵项加入连接权值,连接权值为控制流提供了如下附加信息:
  (1) 执行连接(边)的概率;
  (2) 穿越连接的处理时间;
  (3) 穿越连接时所需的内存;
  (4) 穿越连接时所需的资源。
 
        控制流图表示成矩阵的形式,称为控制流图矩阵。一个图形矩阵是一个方阵,其行列数目为控制流图中的结点数,行列依次对应到一个被标识的结点,矩阵元素对应到结点间的连接。
        控制流图的结点用数字标识,边用字母标识,第i结点到第j结点有x边相连接,则对应的图形矩阵中第i行与第j列有一个非空的元素x。
 
  最简单情况是连接权值为1(存在连接)或0(不存在连接)。如图5.5所示,将图5.4(c)的控制流图矩阵转化为连接矩阵。字母替换为1,表示存在边(为表述清晰,0没有画在图中)。
 
 
图5.4  程序流程图转化为控制流图示意图
 
 
图5.5  控制流图矩阵转化为连接矩阵
 
 

路径分析与测试

 

1.基础路径:

        基本路径是指所有程序路径作为一个集合,在这些路径当中必然存在一个最小路径的集合。基本路径测试通过确定测试用例是否完全覆盖基本路径而进行测试。
   基本路径测试法是在程序控制流图的基础上,通过分析控制构造环路复杂性,导出基本可执行路径集合,设计测试用例。
 

2.基本路径的测试方法:

基本路径测试法主要步骤如下所示。
        步骤一:以详细设计或源代码作为基础,导出程序的控制流图。
        步骤二:计算控制流图G的圈复杂度V(G)。  圈复杂度为程序逻辑复杂性提供定量的测度,该度量用于计算程序的基本独立路径数目,确保所有语句至少执行一次的测试数量的上界。
        步骤三:确定独立路径的集合,即确定线性无关的路径的基本集。独立路径是指至少引入程序的一个新处理语句集合或一个新条件的路径,即独立路径必须包含一条在定义之前不曾使用的边。
        步骤四:测试用例生成,确保基本路径集中每条路径的执行。
 
图5.6  控制流图G

3.计算圈复杂度的方法:

 
方法一:控制流图G的圈复杂度V(G)的定义为V(G)=E-N+2,E是图中边的数量,N是图中结点的数量。
方法二:将圈复杂度定义为控制流图中的区域数。
方法三:V(G)=P+1,P是控制流图G中判定(谓词)结点的数量。
方法四:将控制流图转化为连接矩阵,根据图5.5原理,可得图5.6中的判定结点为4,故圈复杂度同样为5。
 

4.独立路径表示

独立路径:所谓独立路径,是指至少包含一条新边的路径,也就是包含一些前面的路径未包含的语句。
 
路径1 : 1-11
路径2 : 1-2-3-4-5-10-1-11
路径3 : 1-2-3-6-8-9-10-1-11
路径4 : 1-2-3-6-7-9-10-1-11
 
 
 

5.Z路径覆盖

        为解决实际操作中路径覆盖难以实现问题,必须舍弃一些次要因素,简化循环结构,从而极大地减少路径的数量,使得覆盖这些有限的路径成为可能。采用简化循环方法的路径覆盖就是Z路径覆盖。
 
        所谓简化循环就是减少循环的次数,不考虑循环体的形式和复杂度如何,也不考虑循环体实际上需要执行多少次, 只考虑通过循环体零次和一次这两种情况。零次循环是指跳过循环体,从循环体的入口直接到循环体的出口。通过一次循环体是指检查循环初始值。根据简化循环的思路,循环要么执行,要么跳过,这和判定分支的效果是一样的可见,简化循环就是将循还结构编程选择结构。
 

 

6.独立路径测试及测试用例生成

 
独立路径测试法主要步骤如下所示。
第一步:以详细设计或源代码作为基础,导出程序的控制流图。
程序控制流图  
控制流图
 
 
 
第二步:计算环路复杂度V(G)
  圈复杂度为程序逻辑复杂性提供定量的测度,该度量用于计算程序的基本独立路径数目,确保所有语句至少执行一次的测试数量的上界。
计算如下:
流图中有四个区城;
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
根据上面的独立路径,去设计输入数据使程序分别执行到上面四条路径
 
第四步:准备测试用例,确保基本路径集中每条路径的执行。
为了确保基本路径集中的每一条路径的执行,根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到,满足上面例子基本路径集的测试用例是:
 
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)
                x=y+10;
            else
                x=y+20;
        }
}
 
路径1:4-14
        输入数据:iRecordNum=0,或者取iRecordNum<0的某个取值
        预期结果:x=0,y=0;
 
路径2: 4-6-7-14
        输入数据: iRecordNum= 1, iType= 0
        预期结果: x=2
 
路径3: 4-6-8-10-13-4-14
        输入数据: iRecordNum= I, iType= 1
        预期结果: x= 10
 
路径4: 4-6-8-11-13-4-14
        输入数据: iRecordNum= 1, iType = 2
        预期结果: x= 20
 
 

 

7.独立独立路径测试及测试用例生成步骤总结:

流程图一控制流图
计算圈复杂度
找到四条基本路径
根据基本路径找到输入输出
 
 
 

数据流测试分析

控制流一逻辑
数据流一定义和使用
 
定义使用异常缺陷
变量被定义,但从来没有使用(引用)
所使用的变量没有被定义
变量在使用之前被定义两次
 
数据流测试指关注变量接收值(点)和使用(或引用)这些值(点)的路径,是结构性测试方法的一种。
 

1.定义节点def:

会发现,当且仅当变量v的值是用对应节点,用对应的语句片段所定义时,节点N是变量V的定义节点,执行时与变量相关的存储单元内内容会改变,其实这就是我们所说的赋值。 输入语句,赋值语句,循环控制语句和过程调用

 

2.使用节点use:

输出语句,赋值语句,条件语句,循环控制语句和过程调用。

 

3.谓词使用P-use/计算使用C-use

当且仅当语句原因是谓词语句时,使用节点use是一个谓词使用,否侧use就是一个所谓的计算使用。
谓词使用对应谓词使用的节点的出度>=2
计算使用对应计算使用的节点的出度<=1
 

3.使用路径use-path

使用路径是指PATH中使得对某个节点属于V的节点中,存在和定义使用节点DEF和USE之间使得M和N是该路径的所谓最终节点或者最初节点。( 定义节点可出现多次
 

4.清除路径dc-path

是具有最初和最终节点,DEF和USE节点、PATH路径使得路径中其他的节点都是定义节点( 定义节点出现 一次
 
使用路径和清除路径描述了从值被定义的点到值被使用的点的源数据的数据流。
 
例如:
变量的定义和使用
1    a=5; //定义a
2     While(C1) {
3    if (C2){
4    b=a*a;//使用a
5    a=a-1;//定义且使用a
6    }
7    print(a); } //使用a  
  

 
Du-path      dc-path
1234                y
1237                y
12345              y
1234567          n
567                  y
 

5.测试用例的产生的步骤:

●选择定义/使用路径测试覆盖指标
●由测试覆盖指标构造定义/使用路径
●选择一条路径,使得其至少包含一条“定义/使用路径”
●由路径产生测试用例
 

6.定义-使用路径测试覆盖指标

数据流指标假设所有程序变量都标识了定义节点和使用节 点,且关于各变量都标识了定义-使用路径
T:拥有变量集合V的程序P的程序图G(P)中的一个路径集合
 

7.全定义准则

集合T满足程序b的全定义准则,当且仅当所有变量v∈V,T包含从v的每个定义节点到v的一个使用的定义清除路径。
 

8.全使用准则

集合T满足程序P的全使用准则,当且仅当所有变量v∈V,T包含从v的每个定义节点到v的所有使用以及到所有USE(v,n)后续节点的定义清除路径。
 

9.全谓词使用/部分计算使用准则

集合T满足一样的规则,如果这些谓词使用没有一个谓词使用的时候,我们就认为需要有一个计算使用作为定义点
 

10.全计算使用/部分谓词使用准则

假设如果没有计算使用,那么我们会发现所有的定义清除节点就会导致一个谓词使用。
 

11.全定义-使用路径准则

它包含从v到V的一个所有使用以及到所有USE VIN的后续节点所有路径
 

 
定义/使用测试提供一种检查缺陷可能发生点的严格和系统化的方法。
 
 

变异测试

 
尽可能缩小错误押索的范围
  • 便于集中目标于对软件危害较大的错误
  • 暂时忽略危害较小的错误以此取得较高的测试效率,降低测试成本
 

1.变异测试(Mutation Testing):

(有时也叫做“变异分析”)是一种在细节方面改进程序源代码的软件测试方法。这些所谓的变异,是基于良好定义的变异操作,这些操作或者是模拟典型应用错误(例如:使用错误的操作符或者变量名字),或者是强制产生有效地测试(例如使得每个表达式都等于0)。目的是帮助测试者发现有效地测试,或者定位测试数据的弱点,或者是在执行中很少(或从不)使用的代码的弱点。
 
 

2.分类

(1)程序强变异测试(程序变异)
(2)程序弱变异测试
 

3.基本思想

P        e1,e2 ,···, en
P'       P1,P2 ,···, Pn
 
P i称为P的变异因子测试数据Ci
 
C={C1,C2,····,Cn}
如果对每一个Ci,P都是正确的,而Pi都是错误的,这说明P的正确性较高。
如果对某个Ci, P是错误的,而Pi是正确的,这说明P存在错误,而错误就是ei。
 

4.缺点

  • 需要大量的计算机资源来完成测试充分性分析
  • 对于一个中等规模的软件,所需的存储空间巨大
  • 运行大量变异因子导致时间上巨大的开销
  • 实际使用中,对故障类型难以把握
  • 变异测试局限性很大
 
 

5.强变异

    给定一个程序P和一个测试数据集T,通过变异算子为P产生一组变异体Mi ( 合乎语法的变更),对P和M都使用T进行测试运行,如果某Mi在某个测试输入t.上与P产生不同的结果,则该Mi 被杀死;若某Mi在所有的测试数据集上都与P产生相同的结果,则称其为活的变异体。接下来对活的变异体进行分析,检查其是否等价于P;对不等价于P的变异体M进行进一步的测试, 直到充分性度量达到满意的程度。
 
假设程序P已使用测试T中的测试用例测试通过,而且没有错误。变异是一种轻微改变程序的操作。
C(n)=C(n)+1
n=1,2,3,·····,n;

 
 
 
练习

一、选择题
  1. 以下不属于白盒测试技术的是(   D   )。
  A. 逻辑覆盖          B. 基本路径测试           C. 循环覆盖测试         D. 等价类划分
 
  2. 以下不属于逻辑覆盖的是(    D    )。
  A. 语句覆盖            B. 判定覆盖             C. 条件覆盖               D. 基本路径
 
  3.  (   A   )方法根据输出对输入的依赖关系设计测试用例。
  A. 路径测试           B. 等价类                C. 因果图               D. 归纳测试
 
    4.  McCabe建议模块规模应满足V(G)≤(    A    )。
  A.  20            B.  10                  C.  30            D.  40
 
      5.下列关于覆盖逻辑,说法错误的是(   B   )
        A.满足条件覆 盖并不一-定 满足判断覆盖
        B.满足条件组合覆盖的测试一定满足判断覆盖、条件覆盖和判定/条件覆盖
        C.满足路径覆盖也- -定满足条件组合覆盖
        D.满足判断1条件覆盖同时满足判定覆盖和条件覆盖
 
    6.使用白盒测试方法时,确定测试数据应根据(   A   )和指定的覆盖标准
        A.程序的内部逻辑
        B. 程序的复杂程度
        C.使用说明书
        D.程序的功能
 
     7.白盒测试方法的优点是(   C   )
        A.可测试软件的特定功能
        B. 能站在用户立场上测试
        C.可按软件内部结构测试
        D.可发现实现功能需求中的错误
 
 
  二、简答题
  1. 白盒测试是什么?白盒测试和黑盒测试的区别体现在哪些方面?
答:
        白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构 测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进 行,检验程序中的每条通路是否都能按预定要求正确工作。 这一方法是把测试 对象看作一个打开的盒子, 测试人员依据程序内部逻辑结构相关信息, 设计或选 择测试用例, 对程序所有逻辑路径进行测试, 通过在不同点检查程序的状态, 确 定实际的状态是否与预期的状态一致。
        黑盒测试也称功能测试或数据驱动测试, 它是在已知产品所应具有的 功能, 通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盒子, 在完全不考虑程序内部结构和内部特性的情况下, 测试者在 程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使 用,程序是否能适当地接收输入数锯而产生正确的输出信息, 并且保持外部信息 (如数据库或文件)的完整性。黑盒测试方法主要有等价类划分、边值分析、因 —果图、错误推测等,主要用于软件确认测试。 “黑盒”法着眼于程序外部结 构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试。 “黑盒”法是穷 举输入测试, 只有把所有可能的输入都作为测试情况使用, 才能以这种方法查出 程序中所有的错误。 实际上测试情况有无穷多个, 人们不仅要测试所有合法的输 入,而且还要对那些不合法但是可能的输入进行测试。
        白盒测试也称结构测试或逻辑驱动测试, 它是知道产品内部工作过程, 可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行, 按照程序 内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作, 而不顾它的功能, 白盒测试的主要方法有逻辑驱动、 基路测试等, 主要用于软件 验证。
白盒测试技术 (White Box Testing) : 深入到代码一级的测试, 使用这种技术 发现问题最早,效果也是最好的。 该技术主要的特征是测试对象进入了代码内部, 根据开发人员对代码和对程序的熟悉程度,对有需要的部分进行在软件编码阶 段,开发人员根据自己对代码的理解和接触所进行的软件测试叫做白盒测试。 这 一阶段测试以软件开发人员为主,在 JAVA 平台使用 Xunit 系列工具进行测 试, Xunit 测试工具是类一级的测试工具对每一个类和该类的方法进行测试
 
 
  2. 为什么说语句覆盖是最弱的逻辑覆盖?
答:
        语句覆盖对一些控制结构不敏感,不能发现判断中逻辑运算符的错 误,覆盖率低。
 
  3. 条件覆盖为什么不一定包含判定覆盖?
答:
        条件覆盖比判定覆盖增加了对符合条件情况的测试,增加了测试路 径,但条件覆盖只能保证每个条件至少有一次为真,为不考虑所有的判定结果。
 
  4.采用白盒法进行测试时,测试用例覆盖路径的种类有哪几种? 它们相互之间是什么关系?
答:
覆盖路径:
1、 语句覆盖
 
2 、 判定覆盖
 
3 、 条件覆盖
 
4 、 判定、条件覆盖
 
5 、 条件组合覆盖
他们之间的关系:
1. 语句覆盖是很不充分的一种标准。
 
2. 判断覆盖比语句覆盖更严格, 因为如果每个根治执行过了, 则每个 语句也就执行过了。
 
3. 条件覆盖比判断覆盖强因为他使一个判定中的每一个条件都去到两个不同的结果,而判定覆盖则不保证这一点。
 
4. 满足条件组合覆盖的测试用例、 是一定满足判定覆盖, 条件覆盖和 判定、条件覆盖的。
 
 
  5. 请把下面的程序流程图转换成控制流图。
 

答:

发布了61 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Dnesity/article/details/105248971