谈谈白盒测试中的几种覆盖方法
  白盒测试用例设计的一个很重要的评估标准是对代码的覆盖度。一说到覆盖,大家都感觉非常熟悉,但是常见的覆盖都有哪些?各自有什么优缺点?在白盒测试的用例设计中我们应该如何自如地运用呢?小编为大家总结了一下几种常见的覆盖以及各自的优缺点。
  白盒测试中常见的覆盖有六种:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。下面我们分别看看这几种不同的覆盖究竟是什么鬼。
  一、语句覆盖(Statement Coverage)
  语句覆盖,顾名思义是针对代码语句的嘛。它的含义是我们设计出来的测试用例要保证程序中的每一个语句至少被执行一次。通常语句覆盖被认为是“弱的覆盖”,原因是它仅仅考虑对代码中的执行语句进行覆盖而没有考虑各种条件和分支,因此在实际运用中语句覆盖很难发现代码中的问题。举个非常简单的例子:
  public int foo(int a,int b)
  {
  return a/b;
  }
  这是一个求两数之商的函数。如果我们设计如下的测试用例:
  TestCase: a = 2, b = 1
  这时候我们会发现,该函数的代码覆盖率达到了,并且设计的case可以顺利通过测试。但是显然该函数有一个很明显的bug:当 b=0 时,会抛出异常。
  二、判定覆盖(Decision Coverage)
  判定覆盖也被成为分支覆盖(Branch Coverage),也是说设计的测试用例要保证让被测试程序中的每一个分支都至少执行一次。举个例子,有如下流程图:

  针对该图我们想要做到判定覆盖,可以设计如下case:
  TestCase1: a=1, b=1    (路径:ab)
  TestCase2: a=-1, b=-1    (路径:acd)
  TestCase3: a=2, b=-1    (路径:ace)
  判定覆盖比语句覆盖强一些,能发现一些语句覆盖无法发现的问题。但是往往一些判定条件都是由多个逻辑条件组合而成的,进行分支判断时相当于对整个组合的终结果进行判断,这样会忽略每个条件的取值情况,导致遗漏部分测试路径。
  三、条件覆盖(Condition Coverage)
  条件覆盖于分支覆盖不同,条件覆盖要求所设计的测试用例能使每个判定中的每一个条件都获得可能的取值,即每个条件至少有一次真值、有一次假值。
  仍然以上面流程图作为例子来说明。上图中涉及到的条件一共有4个:
  a>0, a<0, b>0, b<0
  为了达到条件覆盖的目的,我们设计的用例需要在 a 点有:
  a>0, a≤0, b>0, b≤0,
  这些情况出现,并且在 c 点有:
  a<0, a≥0, b<0, b≥0
  这些情况出现。现在可以设计如下用例:
  TestCase1: a=1, b=1    (路径:ab)
  TestCase1: a=-1, b=-1    (路径:acd)
  TestCase1: a=-1, b=0    (路径:ace)
  TestCase1: a=1, b=-1    (路径:ace)
  通常而言条件覆盖比判定覆盖强,因为条件覆盖使得判定中的每一个条件都取到了不同的结果,这一点判定覆盖则无法保证。但条件覆盖也有缺陷,因为它只能保证每个条件都取到了不同结果,但没有考虑到判定结果,因此有时候条件覆盖并不能保证判定覆盖。