在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标。需要注意的是,覆盖率只能用来做参考,不能当做测试的法宝。
代码覆盖率 = 代码的覆盖程度,一种度量方式。
以下面的代码来分析
1、 if (A>0 && B==0)
2、 x = X / A;
3、 (A==2 || X>1)
4、 x = X+1;
从覆盖源程序语句的详细程度的不同,有以下一些覆盖标准。
1、语句覆盖:选择足够多的测试数据,使被测程序中每个语句至少执行一次。
测试用例:A=2,B=0,X=4,执行了所有语句,但不能保证程序无错,比如 A==2 || A>1 写成 A==2 || X<1.。
2、判定覆盖:又叫分支覆盖,不仅每个语句必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次,即每个判定的每个分支都至少执行一次。
测试用例:A=3,B=0,X=3;A=2,B=1,X=1
判定覆盖比语句覆盖强,但是对程序逻辑的覆盖程度仍然不高,比如上面的测试用例就只覆盖了程序全部路径的一半。
3、条件覆盖:不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种可能的结果。
上面的代码共两个判定表达式,每个表达式中有两个条件,在第一行代码处,有几种情况:A>1,A≤=1,B=0,B≠0;在第3行代码处,有几种情况:A=2,A≠2,X>1,X≤1。
测试用例:A=2,B=0,X=4(满足A>1,B=0,A=2,X>1的条件);A=1,B=1,X=1(满足A≤1,B≠0,X≤1的条件)
条件覆盖通常比判定覆盖强,因为它使判定表达式中每个条件都取到了两个不同的结果,判定覆盖却只关系整个判定表达式的值。
满足条件覆盖不一定满足判定覆盖,条件覆盖也不一定包含判定覆盖。如:A=2,B=0,X=1;A=1,B=1,X=2,满足条件覆盖,但不满足判定覆盖。
4、判定/条件覆盖:使判定表达式中的每个条件都取得各种可能的值,且每个判断表达式也取到各种可能值。
上面的代码共两个判定表达式,每个表达式中有两个条件,在第一行代码处,有几种情况:A>1,A≤1,B=0,B≠0;在第3行代码处,有几种情况:A=2,A≠2,X>1,X≤1。
测试用例:A=2,B=0,X=4(满足A>1,A=2,,B=0,X>1,不满足A=2 || X>1,满足A>1&&B==0);A=1,B=1,X=1(满足A=2。A≠2,B≠1,X≤1,满足A=2 || X>1,不满足A>1&&B==0)。与条件覆盖用例相同,说明判定/条件覆盖并一定不比条件覆盖更强。
5、条件组合覆盖:每个判定表达式中条件的各种可能组合都至少出现一次。
上面的例子有8种组合:1、A>1,B=0;2、A>1,B≠0;3、A≤1,B=0;4、A≤1,B≠;5、A=2,X>1;6、A=2,X≤1;7、A≠2,X>1;8、A≠2,X≤1。
测试用例:A=2,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。
条件组合覆盖是上面几种覆盖标准中最强的,满足条件组合覆盖的一定满足判定覆盖、条件覆盖、判定/条件覆盖。但是满足条件组合覆盖的不一定使程序中的每条路径都执行到。
6、路径覆盖:使程序的每条可能路径都至少执行一次。