3)优点:这种测试方法可以对程序进行彻底的测试,比前面五种的覆盖面都广。
4)缺点:由于路径覆盖需要对所有可能的路径进行测试(包括循环、条件组合、分支选择等),那么需要设计大量、复杂的测试用例,使得工作量呈指数级增长。而在有些情况下,一些执行路径是不可能被执行的,如:
If (!A)B++;
If (!A)D--;
这两个语句实际只包括了2条执行路径,即A为真或假时候对B和D的处理,真或假不可能都存在,而路径覆盖测试则认为是包含了真与假的4条执行路径。这样不仅降低了测试效率,而且大量的测试结果的累积,也为排错带来麻烦。
总结
白盒测试是一种被广泛使用的逻辑测试方法,是由程序内部逻辑驱动的一种单元测试方法。只有对程序内部十分了解才能进行适度有效的白盒测试。但是贯穿在程序内部的逻辑存在着不确定性和无穷性,尤其对于大规模复杂软件。因此我们不能穷举所有的逻辑路径,即使穷举也未必会带来好运(穷举不能查出程序逻辑规则错误,不能查出数据相关错误,不能查出程序遗漏的路径)。
那么正确使用白盒测试,就要先从代码分析入手,根据不同的代码逻辑规则、语句执行情况,选用适合的覆盖方法。任何一个高效的测试用例,都是针对具体测试场景的。逻辑测试不是片面的测试正确的结果或是测试错误的结果,而是尽可能全面地覆盖每一个逻辑路径。作者: 望入飞 时间: 2009-1-10 21:37
ESTCA覆盖(Error Sensitive Test Cases Analysis)
先前的六种测试是从逻辑结构考虑的,其出发点似乎是合理的。所谓“覆盖”,就是想要做到全面、无遗漏。例如,如果把
if( i == 0 ) then i = j
错写成
if( i > 0 ) then i = j
如果使用前面的覆盖测试,就无法发现这个问题。出于这种情况的原因在于,错误边界仅仅在 i = 0 这个点上,测试才能发现错误。这种疏漏恰恰发生在容易发生问题的条件判断场合。因此,要更多地针对容易发生问题的地方设计测试用例。
K.A.Foster从测试工作实践的教训出发,吸收了计算机硬件的测试原理,提出了一种经验型的测试覆盖准则,较好的解决了上述问题。
经验型覆盖准则是从硬件的早期测试方法中得到启发的。在硬件测试中,对每一个门电路的输入、输出测试都是有额定标准的。通常,电路中一个门的错误常常总是“输出总是0”,或是“输出总是1”。与硬件测试这一情况类似,我们应该重视程序中(条件判断)谓词的价值。但实际上它可能比硬件测试更加复杂。Foster通过大量的试验确定了程序中谓词最容易出错的部分,得出了一套错误敏感测试用例分析规则ESTCA(Error Sensitive Test Cases Analysis)。
规则 1 对于A real B(rel 可以是 > 或 < ,A是变量,C是常量)型的分支谓词,应适当地选择A与B的值,使得测试执行到该分支语句时,A < B 、A == B 和 A > B 的情况分别出现一次。
规则 2 对于A real C ( rel 可以是 > 或 < ,A是变量,C是常量)型的分支谓语,当rel为 < 时,应适当地选择A的。使得 A = C - M (M 是距 C最小的容许正数,若A和C均为整型时,M = 1)。同样,当rel为 > 时,应适当地选择A,使得A = C + M 。
规则 3 对外部输入变量赋值,使其在每一测试用例中均有不同的值和符号,并与同一组测试用例中其他变量值与符号不一致。
显然,上述规则 1 是为了检测rel的错误,规则2是为了检测“差一”之类的错误(例如,本应是“if (A > 1)”而错误写成“if (A > 0)”),规则3则是为了检测程序语句中的错误(例如,应引用一个变量而错误写成引用一个常量)。
上述三条规则并不是完备的,但在程序的测试中却是有效的。原因在于规则本身针对程序员容易发生的需哦无,或是围绕着发生错误的频繁区域,从而提高了发现错误的命中率。
试运用这些规则来检查上面的小程序段错误。应用规则1,对它测试时,应选择 i 的值为 0 ,使 i = 0 的情况出现一次。这样一来就立即找出了隐藏的错误。
当然,ESTCA规则也有很多的缺陷。一个缺陷是,有时不容易找到合适的输入数据,使规则所指的变量值满足要求。另一个缺陷是,仍有很多错误发现不了。