软件测试技术之: 白盒测试和黑盒测试(3)

发表于:2016-06-02来源:C博客作者:好儿郎-志在四方点击数: 标签:
判定/条件覆盖准则的一个缺点是尽管看上去所有条件的所有结果似乎都执行到了,但由于有些特定的条件会屏蔽掉其他的条件,常常并不能全部都执行到


  判定/条件覆盖准则的一个缺点是尽管看上去所有条件的所有结果似乎都执行到了,但由于有些特定的条件会屏蔽掉其他的条件,常常并不能全部都执行到。请参见图2?2来观察此种情况。图2?2 中的流程图描述的是编译器将图2?1中的程序编译生成机器代码的过程。源程序中的多重条件判断被分解成单个的判断和分支,因为大多数的机器都没有能执行多重条件判断的单独指令。那么,更为完全的测试覆盖似乎是将每个基本判断的全部可能的结果都执行到,而前两个判定覆盖的测试用例都做不到这点,它们未能执行到判断 I 中的结果为 “假”的分支, 以及判断 K 中结果为“真”的分支。


  图 2?2 图 2?1中程序的机器码

  如图2?2所示,其中的原因是“与”和“或”表达式中某些条件的结果可能会屏蔽掉或阻碍其他条件,的判断。举例来说,如果“与”表达式中有个条件为 “假”,那么就无须计算该表达式中的后续条件。 同样, 如果 “或”表达式中有个条件为 “真” ,那么后续条件也无须计算。因此,条件覆盖或判定/条件覆盖谁都不一定会发现逻辑表达式中的错误。

  2.1.5 多重条件覆盖

  所谓的多重条件覆盖准则能够部分解决这个问题。该准则要求编写足够多的测试用例,将每个判定中的所有可能的条件结果的组合,以及所有的入口点都至少执行一次。举例来说,考虑下面的伪代码程序;

  NOTFOUND=TRUE;

  DO I=1 TO TABSIZE WHILE (NOTFOUND); /*SEARCHTABLE*/

  ……searching logic……;

  END

  要测试四种情况:

  1. I<=TABSIZE,并且 NOTFOUND 为真;

  2. I<=TABSIZE,并且 NOTFOUND 为假(在到达表格尾部前查询指定条目) ;

  3. I>TABSIZE,并且 NOTFOUND 为真(查询了整个表格,未找到指定条目) ;

  4. I>TABSIZE,并且 NOTFOUND 为假(指定条目位于表格的最后位置) 。

  很容易发现,满足多重条件覆盖准则的测试用例集,同样满足判定覆盖准则、条件覆盖准则以及判定/条件覆盖准则。

  再次回到图2?1中,测试用例必须覆盖以下 8 种组合:

  1. A > 1, B = 0

  2. A > 1, B != 0

  3. A <= 1,B = 0

  4. A <= 1, B != 0

  5. A = 2, X > 1

  6. A = 2, X <= 1

  7. A != 2, X > 1

  8. A != 2, X <= 1

  注意,第 5 至8 组合表示了第二个 if 语句的值。由于 X可能在该 if 语句之前发生了改变,因此这个 if 语所需的值必需对程序逻辑进行回溯,以找到相对应的输入值,要测试的这 8 种组合并不一定意味着需要设计出 8 个测试用例。实际上,用 4 个测试用例就可以覆盖它们。下面是这些测试用例的输入,以及它们覆盖的组合:

  A=3,B=0,X=4 覆盖组合 1,5

  A=2,B=1,X=1 覆盖组合 2,6

  A=1,B=0,X=2 覆盖组合 3,7

  A=1,B=1,X=1 覆盖组合 4,8

  图 2?1的程序存在 4 条不同的路径,需要 4 个测试用例,这样的情况纯属巧合。事实上,这 4 个用例也没有覆盖到每条路径,路径 acd 就被遗漏掉了。

  举例来说,对于如下所示的判断语句,尽管它只包舍两条路径,仍可能需要 8个测试用例:

  if (x==y && length(z)==0 && FLAG)

  {

  j=1 ;

  }

  Else

  {

  i=1;

  }

  在存在循环的情况下,多重条件覆盖准则所需要的测试用例的数量通常会远远小于其路径的数量。

  总的来说,对于包含每个判断只存在一种条件的程序,最简单的测试准则就是设计出足够数量的测试用例,实现:(1)将每个判断的所有结果都至少执行一次;(2)将所有的程序入口都至少调用一次,以确保全部的语句都至少执行一次。而对于包含多重条件判断的程序,最简单的测试准则是设计出足够数量的测试用例,将每个判断的所有可能的条件结果的组合,以及所有的入口点都至少执行一次(加入“可能”二字,是因为有些组合情况难以生成)。

  2.1.6 路径覆盖

  在以上测试用例中,我们发现漏掉了路径acd。路径覆盖则要求覆盖程序所有可能的路径,路径覆盖需要对所有可能的路径进行测试(包括循环、条件组合、分支选择等)。那么需要设计大量、复杂的测试用例,使得工作量呈指数级增长。而在有些情况下,一些执行路径是不可能被执行的。

原文转自:http://blog.csdn.net/rl529014/article/details/51556707#t1