六种覆盖标准发现错误的能力呈由弱到强的变化

  • 语句覆盖:每条语句至少执行一次。 
  • 判定覆盖:每个判定的每个分支至少执行一次。 (包含语句覆盖,每个判断T、F各一次)
  • 条件覆盖:每个判定的每个条件应取到各种可能的值。 (包含语句覆盖,每个条件T、F各一次)
  • 判定/条件覆盖:同时满足判定覆盖和条件覆盖。 
  • 条件组合覆盖:每个判定中各条件的每一种组合至少出现一次。 
  • 路径覆盖:使程序中每一条可能的路径至少执行一次。
'假设有一个待测试的小程序,其Java源代码如下。使用以上白盒测试方法,完成对小程序的测试用例设计。'
public void foo (int a, int b, int x) {
    if(a>1 && b ==0) {
        x = x/a;
    }

    if (a==2 || x>1) {
        x = x+1;
    }
}

语句覆盖

怎么检查测试覆盖率java 判定覆盖测试用例_怎么检查测试覆盖率java

只需要遍历路径ace,便将程序中的所有语句便都执行了一次。生成的用例及其遍历路径如下:

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

缺点:语句覆盖是“最弱的覆盖”,它难以发现程序中的错误。

①程序中存在一条x的值未发生改变的路径abd没有测试。

②它无法发现判定的错误,比如第一个判定条件也许应该是“或”,而不是“与”。

③无法发现条件的错误,比如第二个判断中的条件X>1,也许事实上应该是X>0。

 

判定覆盖

只需要涵盖路径ace和abd,或涵盖路径acd和abe,就可以使得两个判定为“真”和为“假”的分支都执行一次。如果选择后一种情况,生成的用例及其遍历的路径如下:

A=3,B=0,X=3 acd
A=2,B=1,X=1 abe

我们仅有50%的可能性遍历到X值未发生改变的路径,即,只有我们选择涵盖路径ace和abd的情况,而不是涵盖路径acd和abe时。对应的测试用例如下:

A=2,B=0,X=2 ace
A=3,B=1,X=1 abd

缺点:这两组测试用例都存在同一个问题:当判定由多个条件组合构成时,它未必能发现每个条件的错误。如果第二个判定把条件X>1错误的写成了X<1,我们设计的测试用例仍然无法找出这个错误。

 

条件覆盖

怎么检查测试覆盖率java 判定覆盖测试用例_怎么检查测试覆盖率java_02

第一个判断的所有条件的可能取值情况是A>1或A≤1,B=0或B≠0。第二个判断的所有条件可能的取值情况为A=2或A≠2,X>1或X≤1。生成的用例及其遍历的路径如下所示:

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

缺点条件覆盖并不一定总能覆盖全部分支。测试用例虽然满足了条件覆盖准则,但是只涵盖了程序的路径abe。但是,条件覆盖还是要比判定覆盖强一些,因为条件覆盖可能会使判断中各个条件的结果都取“真”或着取“假”,而判定覆盖却做不到这一点。