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

发表于:2016-06-02来源:C博客作者:好儿郎-志在四方点击数: 标签:
2.1.2 判定(分支)覆盖 判定覆盖或分支覆盖是较强一些的逻辑覆盖准则。该准则要求必须编写足够的测试用例,使得每一个判断都至少有一个为真和为假的输


  2.1.2 判定(分支)覆盖

  判定覆盖或分支覆盖是较强一些的逻辑覆盖准则。该准则要求必须编写足够的测试用例,使得每一个判断都至少有一个为“真”和为“假”的输出结果。换句话说,也就是每条分支路径都必须至少遍历一次。分支或判定语句的例子包括switch,do-while 和 if-else 语句。

  判定覆盖通常可以满足语句覆盖。由于每条语句都是在要么从分支语句开始,要么从程序入口点开始的某条子路径上,如果每条分支路径都被执行到了,那么每条语句也应该被执行到了。但是,仍然有些例外情况:

  • 程序中不存在判断。

  • 程序或子程序/方法有着多重入口点。只有从程序的特定入口点进入时,某条特定的语句才能执行到。

  我们的探讨仅针对有两个选择的判断或分支,当程序中包含有多重选择的判断时,判定/分支覆盖准则的定义就必须有所改变。典型的例子有包含select(case)语句的 Java 程序,包含算术 (三重选择) IF 语句、计算或算术 GOTO 语句的 FORTRAN 程序,以及包含可选 GOTO 语句或 GO-TO-DEFENDING-ON 语句的 COBOL 程序。对于这些程序,判定/分支覆盖准则将所有判断的每个可能结果都至少执行一次,以及将程序或子程序的每个入口点都至少执行一次。

  在图2?1 中,两个涵盖了路径 ace 和 abd,或涵盖了路径 acd 和 abe 的测试用例就可以满足判定覆盖的要求。如果我们选择了后一种情况,两个测试用例的输入是 A=3,B=0,X=3 和 A=2,B=1,X=1。

  判定覆盖是一种比语句覆盖更强的准则,但仍然相当不足。举例来说,我们仅有 50%的可能性遍历到那条 X 未发生变化的路径(也即, 仅当我们选择前一种情况) 。

  如果第二个判断存在错误(例如把 X>1 写成了 X<1,那么前面例子中的两个测试用例都无法找出这个错误。

  2.1.3 条件覆盖

  比判定覆盖更强一些的准则是条件覆盖。在条件覆盖情况下,要编写足够的测试用例以确保将一个判断中的每个条件的所有可能的结果至少执行一次。因为,就如同判定覆盖的情况一样,这并不总是能让每条语句都执行到,因此作为对这条准则的补充就是对程序或子程序。举例来说,分支语句

  DO K=0 to 50 WHILE (J+K

  包含两种情况:K 是否小于或等干 50?以及 J+K 是否小于 QUEST? 因此,需要针对K <= 50、 K >50 (达到循环的最后一次迭代)以及J+K=QUEST的情况设计测试用例。

  图 2?1 有四个条件:A>1、B=0、A=2 以及 X>1。因此需要足够的测试用例,使得在点 a 处出现 A=2、A<2、X>1 及 X<=1 的情况。有足够数量的测试用例满足此准则,用例及其遍历的路径如下所示:

  1.A=2,B=0,X=4 ace

  2.A=1,B=1,X=1 adb

  请注意,尽管在本例中生成的测试用例数量是一样的,但条件覆盖通常还是要比判定覆盖更强一些。因为,条件覆盖可能(但并不总是这样)会使判断中的各个条件都取到两个结果(“真”和“假” ) ,而判定覆盖却做不到这一点。举例来说,在相同的分支语句

  DO K=0 to 50 WHILE(J+K

  中,存在一个两重分支(执行循环体,或者跳过循环体) 。如果使用的是判定覆盖测试,将循环从 K= 0 执行到 K = 51 即可满足该准则,但从未考虑到 WHILE子句为假的情况。如果使用的是条件覆盖准则,就需要设计一个测试用例为J+K

  虽然条件覆盖准则乍看上去似乎满足判定覆盖准则,但并不总是如此。如果正在测试判断条件 IF (A&B),条件覆盖准则将要求编写两个测试用例:A为真,B为假;A 为假,B 为真。但是这并不能使 IF 语句中的 THEN 被执行到。对图2?1 所示例子所进行的条件覆盖测试涵盖了全部判断结果,但这仅仅是偶然情况。举例来说,两个可选的测试用例:

  1. A=2,B=0,X=3

  2. A=1,B=1,X=1

  涵盖了全部的条件结果,却仅涵盖了四个判断结果中的两个(这两个测试用例都涵盖到了路径 abe,因而不会执行第一个判断结果为真的路径,以及第二个判断结果为假的路径) 。

  2.1.4 判定/条件覆盖

  显然,解决上面左右为难局面的办法就是所谓的判定/条件覆盖准则。这种准则要求设计出充足的测试用例。将一个判断中的每个条件的所有可能的结果至少执行一次,将每个判断的每个条件的所有可能的结果至少执行一次,将每个判断的所有可能的结果至少执行一次,将每个入口点都至少调用一次。

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