六种覆盖标准发现错误的能力呈由弱到强的变化
- 语句覆盖:每条语句至少执行一次。
- 判定覆盖:每个判定的每个分支至少执行一次。 (包含语句覆盖,每个判断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;
}
}
语句覆盖
只需要遍历路径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,我们设计的测试用例仍然无法找出这个错误。
条件覆盖
第一个判断的所有条件的可能取值情况是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。但是,条件覆盖还是要比判定覆盖强一些,因为条件覆盖可能会使判断中各个条件的结果都取“真”或着取“假”,而判定覆盖却做不到这一点。