白盒测试-测试覆盖方法

白盒测试

白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,即清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是一种穷举路径测试方法。

白盒测试是通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试。在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致。

原则

  • 一个模块中的所有独立路径至少被测试一次
  • 所有逻辑值均需测试true和false两种情况
  • 检査程序的内部数据结构,保证其结构的有效性
  • 在取值的上、下边界及可操作范围内运行所有循环

后续介绍的测试方法都是参考上述原则。

测试覆盖设计方法

白盒测试其重点就是衡量被测代码的覆盖情况,常见测试覆盖率的方法有以下几种:

  • 语句覆盖
  • 判定覆盖
  • 条件覆盖
  • 判定/条件覆盖&&条件组合覆盖
  • 路径覆盖
语句覆盖(StatementCoverage):

又称行覆盖(LineCoverage)
"语句覆盖率 = (至少被执行一次的语句数量) / (可执行的语句总数)"
这是最常用也是最常见的一种覆盖方式,就是度量被测代码中每个可执行语句是否被执行到了。这里说的是“可执行语句”,只统计能够执行的代码被执行了多少行。

注意:语句覆盖是“最弱的覆盖”,它只管覆盖代码中的执行语句,却不考虑各种分支的组合等等。实际测试效果的不明显,很难发现代码中存在的问题。

# 示例代码1
def foo(a, b, x):
    if a > 1 and b == 0:
        x /= a
    if a == 2 or x > 1:
    x = x + 1
case 1:foo(a=2, b=0, x=3)

仅从case1来分析会发现,所有的语句均被覆盖,此时可以认为覆盖率为100%。但是是否能够有效的发现问题是未知的。因为语句覆盖的局限性导致即使执行了所有的代码,但是并不能保证能够发现程序本身存在的问题。

判定覆盖(DecisionCoverage):

又称分支覆盖(BranchCoverage),它度量程序中每一个判定的分支是否被执行,指在测试时运行被测试程序后,程序中所有判定语句的取真分支和取假被执行到的比率:
"判定覆盖率 = (判定结果被评价的次数) / (判定结果的总数)"

结合上面示例代码输入以下两组case:

case 2= foo(a=2, b=0, x=3)
case 3= foo(a=1, b=0, x=1)

case 2 走了两次true,case 3走了两次false ,此时可以判定覆盖率达到了100%。判定覆盖只关注判定为true和false的结果,看起来好像是比语句覆盖强了那么一点,仅仅也就是那么一点。呵!

条件覆盖(ConditionCoverage)

在测试时运行被测程序后,所有的判断语句中每个条件的可能取值(真和假)出现过的情况。
路径覆盖率 = (至少被执行到一次的路径数) / (总的路径数)
参考示例代码输入以下几种情况:

case 4 = foo(a=2, b=0, x=3)
case 5 = foo(a=1, b=0, x=1)
case 6 = foo(a=2, b=1, x=1)

仅关注条件是否执行,有遗漏分支的可能。想要以条件覆盖做到尽可能多的覆盖,那么可以考虑结合判定+条件覆盖和组合覆盖去设计。具体详细这里就过多介绍,因为这些不是重点,仅仅了解即可。

路径覆盖(PathCoverage)

又称断言覆盖(PredicateCoverage)。它度量了是否函数的每一个分支都被执行了。 这句话也非常好理解,就是所有可能的分支都执行一遍,有多个分支嵌套时,需要对多个分支进行排列组合,很显然比上面几种都显得靠谱许多。路径覆盖也是目前使用最多的。

参考示例代码1输入以下几种情况:

case 7= foo(a=2, b=0, x=2) 
case 8= foo(a=1, b=1, x=1) 
case 9= foo(a=2, b=0, x=1) 
case 10= foo(a=3, b=1, x=2) 

路径覆盖较于其他覆盖是较为合适的,但是看似完美覆盖了,实际仍然不够,存在所有路径都覆盖的情况下,问题依然可能存在。而且,当系统的复杂度过高,测试路径会随着分支的数量指数级别增加,面临穷举的可能性增大,测试工作量也随之提升。

穷举路径测试的局限性

“白盒”法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的所有独立路径数是天文数字。但即使每条路径都测试了仍然可能存在错误:

  1. 白盒测试决不可能检查出程序违反了设计规范,即程序本身是个错误的程序。
  2. 白盒测试不可能查出程序中因遗漏路径而出错。
  3. 白盒测试可能发现不了一些与数据相关的错误。

最后

所以说,每种覆盖率都有自己的局限性,因此在测试中, 首先需要合理利用各种覆盖率设计方法及黑盒测试方法,结合实际业务组合对测试用例进行综合考量和设计。

逻辑覆盖率可以作为软件测试的一个度量,但是,即使达到了 100% 的逻辑覆盖率,仍然无法保证程序的正确性。所以在进行白盒测试时,不要过度关注覆盖率指标。合理有效的覆盖才能事半功倍。

你可能感兴趣的:(白盒测试-测试覆盖方法)