菜鸟笔记--软件测试--百盒测试技术

时间:2024-03-28 07:35:40

白盒测试技术

白盒测试技术是把测试对象看作一个打开的盒子,利用白盒测试法进行动态测试时,除了要验证软件的功能特性之外,还要需要测试软件产品的内部结构和处理过过程

白盒测试法的覆盖标准有逻辑覆盖测试,基本路径测试和循环结构覆盖测试,同时程序插桩也是白盒测试中一种常用的方法。

     逻辑覆盖测试

逻辑覆盖测试是以程序内部的逻辑结构为基础设计测试用例的方法。根据程序内部逻辑结构的覆盖程度,逻辑覆盖测试具有不同的覆盖标准,由弱到强排序为:语句覆盖,判定覆盖,条件覆盖,判定/条件覆盖,条件组合覆盖和修正条件判定覆盖

               语句覆盖

语句覆盖的含义是,设计足够多的测试用例,使被测程序中的每条可执行语句至少被执行一次,语句覆盖也称为点覆盖

如代码:If((A>1)&&(B=0))

                X=X/A;

               Else if((A=2) ||(x>1))

               X=X+1;

               Else

               Exit();

菜鸟笔记--软件测试--百盒测试技术

程序流程图如上图,对这样的程序,如果要做到语句覆盖,那么程序的执行路径只需要是sabcde就可以执行完所有可执行语句,所以可以设计测试用例:A=2,B=0,X=2

语句覆盖是一种很弱的逻辑覆盖测试,它针对程序的逻辑覆盖很少,语句覆盖只关系判定的结果,没有考虑判定中的条件及条件之间的逻辑关系。对于一段代码而言,语句覆盖仅仅能够证明这段代码可以运行,对于程序的逻辑是否正确,没有任何支持作用。

                  判定覆盖

判定覆盖的含义是设计足够多的测试用例,使得被测程序中的每个判定取得每种可能的结果,即覆盖每个判定的所有分支

对于上图的程序,如果要实现判定覆盖,那么执行路径应该是sabcde和sace,或者sabce和sacde这两条路径

所以可以设计测试用例为:A=2,B=0,X=2,和A=1,X=1,或者  A=3,B=0,X=1和A=2,B=1,(希望我某天回来看到这博客,不会再有这特么傻逼的想法,,,,GG)

                条件覆盖

条件覆盖的含义是,设计足够多的测试用例,使得被测程序的每个条件取得各种情况的结果。对上图的程序,考虑包含两个判定中的四个条件,每个条件均可取值真或假。条件覆盖一般比判定覆盖强,因为条件覆盖关心判定中每个条件的取值,而判定覆盖只关心整个判定的取值(真或假)。

               判定/条件覆盖

判定/条件覆盖的含义是,设计足够多的测试用例,使被测程序中的每个条件取得各种可能的结果,且每个判定取到各种可能的结果。那么针对上图的程序,可以设计测试用例:A=1,B=1,X=1,和A=2,B=0,X=4

              条件组合覆盖

当某个判定中存在多个条件的时候,仅仅考虑单个条件的取值使不够的,条件组合覆盖的含义是,设计足够多的测试用例,使被测程序中每个判定的所有条件组合取值至少都出现一次,即单个条件的取值真假都要实现,同时要注意边界值。如上图的程序,使用条件组合覆盖的测试用例要使得以下的结果都至少出现一次:

A>1,B=0,A>1,B!=0      ,A=1,B=0,A=1,B!=0,        A=2,X>1,A=2,X=1,      A!=2,X>1,A!=2,X=1

为了覆盖上述所有可能情况,可以设计测试用例:

A=2,B=0,X=2   A=2,B=1,X=1    A=1,B=0,X=2,     A=1,B=1,X=1  

所以如果实现了条件组合覆盖,那么一定实现了判定覆盖,条件覆盖,判定/条件覆盖,但是条件组合覆盖不一定能覆盖程序中的每条路径

            修正条件判定覆盖

这个覆盖需要足够的测试用例来确定各个条件是否能否够影响到包含的判定的结果。这需要两个条件,首先每个程序模块的入口和出口点至少要被调用一次,每个程序的判定到所有可能的结果值要至少转换一次,其次,程序的判定被分解为通过逻辑操作符连接的布尔条件,每个条件对于判定的结果值是一定的。

不论是哪种覆盖,对于程序而言,都不是充分的测试,覆盖率并不是白盒测试的终极目标,尤其在单元测试中,即使达到国军标要求的两个百分之百。覆盖率应该是指导测试的指标,而不是决定测试是否结束的指标。

       基本路径测试

流图的含义和基本的流图类型就不再叙述。

由图论知,独立路径的最大数量等于程序控制流图中的区域数,也就是程序的圈复杂度,圈复杂度可以度量一个程序的复杂性,圈复杂度=控制流图的边数--控制流图的节点+2

基本路径测试的执行步骤是:

找出程序的所有独立路径

选择一条独立路径,设计这样一组测试数据,他们能使得这条独立路径都执行一次

重复上述步骤,直到覆盖所有的独立路径

      循环结构测试

在程序中,循环有两类:循环次数固定和循环执行次数不固定的循环

首先,对于循环次数固定的循环,有两种情况,假设循环次数为m,一是循环执行M次的情况,二是不执行循环的情况

在循环次数不固定的循环中,因为有可能会中途退出循环。所以每次循环的执行次数不一样,假设循环的最大次数为n(n>3),那么我们应该考虑以下情况:

跳过这个循环

只循环一次

循环两次

循环m次(2<m<n)

分别循环n-1,n,n+1次

那么,在测试这样的循环的时候,应该设计一组输入数据组合,使得上面所有情况都出现

嵌套循环的测试方法如下:

使用前面的单层循环测试方法测试最内层循环,同时把他的恶循环的次数设为一小时

由内向外构造一些一个循环的测试

继续向外构造,直到测试所有层次的循环

还要考虑两种情况:

重叠交叉循环

两个循环重叠在一起,但是不嵌套,这是非结构化的程序

前后相接的循环

一个循环结束后,接着又是一个循环,如果两个之间技术变量彼此无关,则应该采用单层循环测试方法,否则采用嵌套循环方法(把后面的循环堪称嵌入到前面的循环中的循环)

程序插桩测试

程序插桩是一种通过向被测程序中插入操作来发现和定位错误的方法。

设计程序插桩方法时需要考虑如下问题:

需要探测程序中的哪些位置?

在程序的什么位置设置探测点

这需要根据实际考虑,但是对于第二点,有一个准则有一定帮助,那就是在一般情况下,在由没有分支结构的多条连续语句构成的一段程序中,只插入一个计数语句,这样有利于将探测语句的数目减小到最少,若是程序中出现多种控制结构,整个结构比较复杂的时候,应该具体分析。

切记在调试和测试之后删除这些插桩语句,若要保留,请注释,程序插桩之后,就变成了另一个程序,所以测试的可信性,需要认真评估,同时要注意插桩语句本身的正确性。

白盒测试方法的综合使用策略:

1:静态测试和动态测试的时序关系

一般可以先及逆行静态测试,接着动态测试(白盒)

2:白盒测试的重点

覆盖率测试时白盒测试的一个重点,一般可以使用基本路径测试方法使得基本路径集合中的每条独立路径都至少执行一次,多余重要的程序模块,应该使用多种覆盖率标准衡量对代码 的覆盖率

3:不同测试阶段使用白盒测试方法

在单元测试阶段,以代码审查方法,逻辑覆盖法,基本路径测试为主

在集成测试阶段,需要增加静态结构分析和代码质量度量等方法

在集成测试之后的阶段,应该尽量使用黑盒测试方法。