
啊胡
2022/09/15阅读:160主题:自定义主题1
白盒测试 测试策略
之前几篇笔记记录了白盒测试几种主要的测试方法:静态测试、程序插桩、逻辑覆盖、基本路径测试,今天接着介绍剩下的几种白盒测试方法。
域测试
域测试是一种基于程序结构
的测试方法。Howden曾对程序中出现的错误进行分类,将程序错误分为域错误
、计算型错误
和丢失路径错误
3种。这是相对于执行程序的路径来说的,每条执行路径对应于输入域的一类情况,是程序的一个子计算。
若程序的控制流有错误,对应某一特定的输入可能执行的是一条错误路径,这种错误称为路径错误
,也叫做域错误
。如果对于特定输入执行的是正确路径,但由于赋值语句的错误致使输出结果不正确,则称此为计算型错误
。还有一类错误是丢失路径错误
,它是由于程序中某处少了一个判定谓词而引起的。
域测试主要是针对域错误进行的程序测试。域测试的“域”是指程序的输入空间
,其测试方法是基于对输入空间的分析。任何一个被测程序都有一个输入空间,测试的理想结果就是检验输入空间中的每一个输入元素是否都通过被测程序产生正确的结果。
输入空间又可分为不同的子空间,每一子空间对应一种不同的计算。子空间的划分是由程序中分支语句的谓词决定的。输入空间的一个元素,经过程序中某些特定语句的执行而结束(也可能出现无限循环而无出口的情况),输入空间中的元素都满足这些特定语句被执行所要求的条件。
基本路径测试法正是在分析输入域的基础上,选择适当的测试点以后进行测试的。
域测试有两个致命的弱点,一是为进行域测试而对程序提出的限制过多,二是当程序存在很多路径时,所需的测试也就很多。
符号测试
符号测试的基本思想是允许程序不仅仅输入具体的数值数据,也可以输入符号值,这一方法也因此而得名。这里所说的符号值可以是基本符号变量值,也可以是这些符号变量值的一个表达式。这样,在执行程序过程中以符号的计算代替了普通测试中对测试用例的数值计算,所得到的结果自然是符号公式或是符号谓词。
更明确地说,普通测试执行的是算术运算,符号测试则是执行代数运算。因此符号测试可以被认为是普通测试的一个自然扩充。符号测试可以看作是程序测试和程序验证的一个折衷。一方面,它沿用了传统的程序测试方法,通过运行被测程序来验证它的可靠性。另一方面,由于一次符号测试的结果代表了一大类普通测试的运行结果,实际上证明了程序接受此类输入所得到的输出是正确的还是错误的。最为理想的情况是,程序中仅有有限的几条执行路径,如果对这有限的几条路径都完成了符号测试,就能较有把握地确认程序的正确性了。从符号测试方法的使用来看,问题的关键在于开发出比传统的编译器功能更强、能够处理符号运算的编译器和解释器。
目前符号测试存在如下几个未得到圆满解决的问题。
(1)分支问题。当采用符号测试进行到某一分支点处,分支谓词是符号表达式时,在这种情况下通常无法决定谓词的取值,也就不能决定分支的走向,需要测试人员做人工干预,或是执行树的方法进行下去。如果程序中有循环,而循环次数又决定于输入变量,那就无法确定循环的次数。
(2)二义性问题。数据项的符号值可能是有二义性的,这种情况通常出现在带有数组的程序中。在下面这段程序中,如果I=J,则C=3,否则C=2+A。但由于使用符号值运算,这时无法知道I是否等于J。
...
X(I)=2+A
X(J)=3
C=X(I)
...
(3)大程序问题。符号测试中总要处理符号表达式。随着符号测试的执行,一些变量的符号表达式越来越大。特别是如果当符号执行树很大,分支点很多时,路径条件本身将变成一个非常长的合取式。如果能够有办法将其简化,自然会带来很大好处。但如果找不到简化的办法,那将给符号测试的时间和运行空间带来大幅度的增长,甚至使整个问题的解决遇到难于克服的困难。
Z路径覆盖
分析程序中的路径是指:从入口开始检验程序,执行过程中经历的各个语句,直到出口为止。这是白盒测试最为典型的分析方法,着眼于路径分析的测试被称为路径测试
,完成路径测试的理想情况是做到路径覆盖。对于比较简单的小程序实现路径覆盖是可能做到的。但是如果程序中出现多个判断和多个循环,可能的路径数目将会急剧增长,甚至达到天文数字,以至不可能实现路径覆盖。为了解决这一问题,必须舍掉一些次要因素,对循环机制进行简化,从而极大地减少路径的数量,使得覆盖这些有限的路径成为可能。
一般称简化循环意义下的路径覆盖为Z路径覆盖
。所谓的循环简化是指限制循环的次数。无论循环的形式和实际执行循环体的次数是多少,只考虑循环一次和零次两种情况,即只考虑执行时进入循环体一次和跳过循环体这两种情况。图(a)和图(b)所示为两种最典型的循环控制结构。前者先作判断,循环体B可能执行(假定只执行一次),再经判断转出,其效果也与图(c)中给出的条件选择结构只执行右分支的效果一样。

对于程序中的所有路径可以用路径树来表示,其具体表示方法本文略。当得到某一程序的路径树后,从其根结点开始,一次遍历,再回到根结点时,把所经历的叶结点名排列起来,就得到一个路径。如果设法遍历了所有的叶节点,那就得到了所有的路径。当得到所有的路径后,生成每个路径的测试用例,就可以做到Z路径覆盖测试。
程序变异
程序变异是一种错误驱动测试
,错误驱动测试方法是针对某类特定程序错误的。经过多年的测试理论研究和软件测试的实践,人们逐渐发现要想找出程序中所有的错误几乎是不可能的。比较现实的解决办法是将搜索错误的范围尽可能地缩小,以利于专门测试某类错误是否存在。这样做便于将目标集中到对软件危害最大的可能错误,暂时忽略对软件危害较小的可能错误。这样可以取得较高的测试效率,并降低测试的成本。
错误驱动测试主要有2种,即程序强变异
和程序弱变异
。为便于测试人员使用变异方法,一些变异测试工具陆续被开发出来。
测试策略
在测试工作中,由于每种类型的软件都有各自的特点,每种测试方法也都有各自的长处和不足,针对不同软件如何合理地使用白盒测试方法是非常重要的。
在实际测试中,往往在不同的测试阶段、根据不同的测试目标,有针对性地选择使用白盒测试方法,才能有效发现更多的软件错误、提高测试效率和测试覆盖率,这就需要测试人员认真掌握这些方法的原理,积累更多的测试经验,有效地提高测试水平。
以下是各种白盒测试方法的综合应用策略,可供测试人员在实际应用过程中参考。
(1)在测试中,应尽量先使用工具进行静态结构分析。
(2)测试中可采取先静态后动态的组合方式:先进行静态结构分析、代码检查,再进行覆盖率测试。
(3)利用静态分析的结果作为引导,通过代码检查和动态测试的方式对静态分析结果做进一步的确认,使测试工作更为有效。
(4)覆盖率测试是白盒测试的重点,一般可使用基本路径测试法达到语句覆盖标准;对于软件的重点模块,应使用多种覆盖率标准衡量测试的覆盖率。
(5)在不同的测试结点,测试的侧重点不同:在单元测试阶段,以代码检查、逻辑覆盖为主;在集成测试阶段,需要增加静态结构分析等;在系统测试阶段,应根据黑盒测试的结果,采取相应的白盒测试。
作者介绍
