|
知识路径: > 测试技术的分类 > 白盒测试技术 > 白盒测试综合策略 >
|
考试要求:掌握
相关知识点:2个
|
|
|
|
|
前面介绍的逻辑覆盖,其出发点似乎是合理的。所谓“覆盖”,就是想要做到全面而无遗漏。但事实表明,它并不能真的做到无遗漏。甚至对于像前面提到的,将程序段:
|
|
|
|
|
|
|
我们分析出现这一情况的原因在于,错误区域仅仅在I=0这个点上,即仅当I取0时,测试才能发现错误。它的确是在我们力图通过全面覆盖来查找错误的测试的“网上”钻了空子,并且恰恰在容易发生问题的条件判断那里未被发现。面对这类情况,我们应该从中吸取的教训是测试工作要有重点,要多针对容易发生问题的地方设计测试用例。
|
|
|
K.A.Foster从测试工作实践的教训出发,吸收了计算机硬件的测试原理,提出了一种经验型的测试覆盖准则,较好地解决了上述问题。
|
|
|
Foster的经验型覆盖准则是从硬件的早期测试方法中得到启发的。我们知道,硬件测试中,对每一个门电路的输入、输出测试都是有额定标准的。通常,电路中一个门的错误常常是“输出总是0”,或是“输出总是1”。与硬件测试中的这一情况类似,我们常常要重视程序中谓词的取值,但实际上它可能比硬件测试更加复杂。Foster通过大量的实验确定了程序中谓词最容易出错的部分,得出了一套错误敏感测试用例分析ESTCA(Error Sensitive Test Cases Analysis)规则。事实上,规则十分简单。
|
|
|
. [规则1]对于A rel B(rel可以是<,=和>)型的分支谓词,应适当地选择A与B的值,使得测试执行到该分支语句时,AB的情况分别出现一次。
|
|
|
. [规则2]对于A rel1 C(rel1可以是“>”或是“<”,A是变量,C是常量)型的分支谓词,当rel1为“<”时,应适当地选择A的值,使:
|
|
|
|
(M是距C最小的容器容许的正数,若A和C均为整型时,M=1)。同样,当rel1为“>”时,应适当地选择A,使:
|
|
|
|
. [规则3]对外部输入变量赋值,使其在每一测试用例中均有不同的值和符号,并与同一组测试用例中其他变量的值和符号不一致。
|
|
|
显然,上述规则1是为了检测rel的错误,规则2是为了检测“差1”之类的错误(如本应是“IF A>1”而错成“IF A>0”),而规则3则是为了检测程序语句中的错误(如应引用一变量而错成引用一常量)。
|
|
|
上述三个规则并不完备,但在普通程序的测试中确是有效的。原因在于规则本身针对着程序编写人员容易发生的错误,或是围绕着发生错误的频繁区域,从而提高了发现错误的命中率。
|
|
|
根据这里提供的规则来检验上述小程序段错误。应用规则1,对它测试时,应选择I的值为0,使I=0的情况出现一次。这样一来就立即找出了隐藏的错误。
|
|
|
当然,ESTCA规则也有很多缺陷。一方面是,有时不容易找到输入数据使得规则所指的变量值满足要求。另一方面是,仍有很多缺陷发现不了。对于查找错误的广度问题在变异测试中得到了较好的解决。
|
|
|
|
Woodward等人曾经指出结构覆盖的一些准则,如分支覆盖或路径覆盖,都不足以保证测试数据的有效性。为此,他们提出了一种层次LCSAJ覆盖准则。
|
|
|
LCSAJ(Linear Code Sequence and Jump)的意思是线性代码序列与跳转。一个LCSAJ是一组顺序执行的代码,以控制流跳转为其结束点。它不同于判断—判断路径。判断—判断路径是根据程序有向图决定的。一个判断—判断路径是指两个判断之间的路径,但其中不再有判断。程序的入口、出口和分支结点都可以是判断点。而LCSAJ的起点是根据程序本身决定的。它的起点是程序第一行或转移语句的入口点,或是控制流可以跳达的点。几个首尾相接,且第一个LCSAJ起点为程序起点,最后一个LCSAJ终点为程序终点的LCSAJ串就组成了程序的一条路径。一条程序路径可能是由两个、三个或多个LCSAJ组成的。基于LCSAJ与路径的这一关系,Woodward提出了LCSAJ覆盖准则。这是一个分层的覆盖准则,具体如下。
|
|
|
|
|
. [第三层]:LCSAJ覆盖。即程序中的每一个LCSAJ都至少在测试中经历过一次。
|
|
|
. [第四层]:两两LCSAJ覆盖。即程序中每两个首尾相连的LCSAJ组合起来在测试中都要经历一次。
|
|
|
|
. [第n+2层]:每n个首尾相连的LCSAJ组合在测试中都要经历一次。
|
|
|
|
在实施测试时,若要实现上述的Woodward层次LCSAJ覆盖,需要产生被测程序的所有LCSAJ。
|
|
|