白盒测试 语句覆盖、断定覆盖、条件覆盖、断定条件覆盖、条件组合覆盖、路径覆盖

转自 http://blog.csdn.net/nashviller/article/details/7383814单元测试

白盒测试做为测试人员经常使用的一种测试方法,愈来愈受到测试工程师的重视。白盒测试并非简单的按照代码设计用例,而是须要根据不一样的测试需求,结合不一样的测试对象,使用适合的方法进行测试。由于对于不一样复杂度的代码逻辑,能够衍生出许多种执行路径,只有适当的测试方法,才能帮助咱们从代码的迷雾森林中找到正确的方向。本文介绍六种白盒子测试方法:语句覆盖、断定覆盖、条件覆盖、断定条件覆盖、条件组合覆盖、路径覆盖。测试

  白盒测试的概述优化

  因为逻辑错误和不正确假设与一条程序路径被运行的可能性成反比。因为咱们常常相信某逻辑路径不可能被执行, 而事实上,它可能在正常的状况下被执行。因为代码中的笔误是随机且没法杜绝的,所以咱们要进行白盒测试。spa

  白盒测试又称结构测试,透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运做的。.net

  白盒的测试用例须要作到:设计

  ·保证一个模块中的全部独立路径至少 被使用一次
  ·对全部逻辑值均需测试 true 和 false
  ·在上下边界及可操做范围内运行全部循环
  ·检查内部 数据结构以确保其有效性

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

  白盒测试的特色:依据软件设计说明书进行测试、对程序内部细节的严密检验、针对特定条件设计测试用例、对软件的逻辑路径进行覆盖测试。blog

  白盒测试的实施步骤:图片

  1.测试计划阶段:根据需求说明书,制定测试进度。
  2.测试设计阶段:依据程序设计说明书,按照必定规范化的方法进行软件结构划分和设计测试用例。
  3.测试执行阶段:输入测试用例,获得测试结果。
  4.测试总结阶段:对比测试的结果和代码的预期结果, 分析错误缘由,找到并解决错误。

  白盒测试的方法:整体上分为静态方法和动态方法两大类。ci

  静态分析是一种不经过执行程序而进行测试的技术。静态分析的关键功能是检查软件的表示和描述是否一致,没有冲突或者没有歧义。

  动态分析的主要特色是当软件系统在模拟的或真实的环境中执行以前、之中和以后 , 对软件系统行为的分析。动态分析包含了程序在受控的环境下使用特定的指望结果进行正式的运行。它显示了一个系统在检查状态下是正确仍是不正确。在动态分析技术中,最重要的技术是路径和分支测试。下面要介绍的六种覆盖测试方法属于动态分析方法。

  白盒测试的优缺点

  1. 优势

  ·迫使测试人员去仔细思考软件的 实现
  ·能够检测代码中的每条分支和路径
  ·揭示隐藏在代码中的错误
  ·对代码的测试比较完全
  ·最优化

  2. 缺点

  ·昂贵
  ·没法检测代码中遗漏的路径和数据敏感性错误
  ·不验证规格的正确性

六种覆盖方法

  首先为了下文的举例描述方便,这里先给出一张程序流程图。(本文以1995年软件设计师考试的一道考试题目为例,图中红色字母表明程序执行路径)。

  

  一、语句覆盖

  1)主要特色:语句覆盖是最起码的结构覆盖要求,语句覆盖要求设计足够多的测试用例,使得程序中每条语句至少被执行一次。

  2)用例设计:(若是此时将A路径上的语句1—〉T去掉,那么用例以下)

  

 
X
Y
路径
1
50
50
OBDE
2
90
70
OBCE

  3)优势:能够很直观地从源代码获得测试用例,无须细分每条断定表达式。

  4)缺点:因为这种测试方法仅仅针对程序逻辑中显式存在的语句,但对于隐藏的条件和可能到达的隐式逻辑分支,是没法测试的。在本例中去掉了语句1—〉T去掉,那么就少了一条测试路径。在if结构中若源代码没有给出else后面的执行分支,那么语句覆盖测试就不会考虑这种状况。可是咱们不能排除这种之外的分支不会被执行,而每每这种错误会常常出现。再如,在Do-While结构中,语句覆盖执行其中某一个条件分支。那么显然,语句覆盖对于多分支的逻辑运算是没法全面反映的,它只在意运行一次,而不考虑其余状况。

  二、断定覆盖

  1)主要特色:断定覆盖又称为分支覆盖,它要求设计足够多的测试用例,使得程序中每一个断定至少有一次为真值,有一次为假值,即:程序中的每一个分支至少执行一次。每一个判断的取真、取假至少执行一次。

  2)用例设计:

  

 
X
Y
路径
1
90
90
OAE
2
50
50
OBDE
3
90
70
OBCE

  3)优势:断定覆盖比语句覆盖要多几乎一倍的测试路径,固然也就具备比语句覆盖更强的测试能力。一样断定覆盖也具备和语句覆盖同样的简单性,无须细分每一个断定就能够获得测试用例。

  4)缺点:每每大部分的断定语句是由多个逻辑条件组合而成(如,断定语句中包含AND、OR、CASE),若仅仅判断其整个最终结果,而忽略每一个条件的取值状况,必然会遗漏部分测试路径。

  三、条件覆盖

  1)主要特色:条件覆盖要求设计足够多的测试用例,使得断定中的每一个条件得到各类可能的结果,即每一个条件至少有一次为真值,有一次为假值。

  2)用例设计:

  

 
X
Y
路径
1
90
70
OBC
2
40
 
OBD

  3)优势:显然条件覆盖比断定覆盖,增长了对符合断定状况的测试,增长了测试路径。

  4)缺点:要达到条件覆盖,须要足够多的测试用例,但条件覆盖并不能保证断定覆盖。条件覆盖只能保证每一个条件至少有一次为真,而不考虑全部的断定结果。

 四、断定/条件覆盖

  1)主要特色:设计足够多的测试用例,使得断定中每一个条件的全部可能结果至少出现一次,每一个断定自己全部可能结果也至少出现一次。

  2)用例设计:

  

 
X
Y
路径
1
90
90
OAE
2
50
50
OBDE
3
90
70
OBCE
4
70
90
OBCE

  3)优势:断定/条件覆盖知足断定覆盖准则和条件覆盖准则,弥补了两者的不足。

  4)缺点:断定/条件覆盖准则的缺点是未考虑条件的组合状况。

  五、组合覆盖

  1)主要特色:要求设计足够多的测试用例,使得每一个断定中条件结果的全部可能组合至少出现一次。

  2)用例设计:

  

 
X
Y
路径
1
90
90
OAE
2
90
70
OBCE
3
90
30
OBDE
4
70
90
OBCE
5
30
90
OBDE
6
70
70
OBDE
7
50
50
OBDE

  3)优势:多重条件覆盖准则知足断定覆盖、条件覆盖和断定/条件覆盖准则。更改的断定/条件覆盖要求设计足够多的测试用例,使得断定中每一个条件的全部可能结果至少出现一次,每一个断定自己的全部可能结果也至少出现一次。而且每一个条件都显示能单独影响断定结果。

  4)缺点:线性地增长了测试用例的数量。

  六、路径覆盖

  1)主要特色:设计足够的测试用例,覆盖程序中全部可能的路径。

  2)用例设计:

  

 
X
Y
路径
1
90
90
OAE
2
50
50
OBDE
3
90
70
OBCE
4
70
90
OBCE

  3)优势:这种测试方法能够对程序进行完全的测试,比前面五种的覆盖面都广。

  4)缺点:因为路径覆盖须要对全部可能的路径进行测试(包括循环、条件组合、分支选择等),那么须要设计大量、复杂的测试用例,使得工做量呈指数级增加。而在有些状况下,一些执行路径是不可能被执行的,如:
  If (!A)B++;
  If (!A)D--;

  这两个语句实际只包括了2条执行路径,即A为真或假时候对B和D的处理,真或假不可能都存在,而路径覆盖测试则认为是包含了真与假的4条执行路径。这样不只下降了测试效率,并且大量的测试结果的累积,也为排错带来麻烦。

  总结

  白盒测试是一种被普遍使用的逻辑测试方法,是由程序内部逻辑驱动的一种单元测试方法。只有对程序内部十分了解才能进行适度有效的白盒测试。可是贯穿在程序内部的逻辑存在着不肯定性和无穷性,尤为对于大规模复杂软件。所以咱们不能穷举全部的逻辑路径,即便穷举也未必会带来好运(穷举不能查出程序逻辑规则错误,不能查出数据相关错误,不能查出程序遗漏的路径)。

  那么正确使用白盒测试,就要先从代码分析入手,根据不一样的代码逻辑规则、语句执行状况,选用适合的覆盖方法。任何一个高效的测试用例,都是针对具体测试场景的。逻辑测试不是片面的测试正确的结果或是测试错误的结果,而是尽量全面地覆盖每个逻辑路径。