小结:从上面的例子中可知,语句覆盖确实很弱,很容易达到100%覆盖,且即使达到100%仍可能会存在严重、致命bug,如果我们只追求语句覆盖,说测试是软件质量的把关者未免失职,以此来度量质量也没有多太意义。
4.2.2 分支覆盖(BranchCoverage)
又称判定覆盖(DecisionCoverage),边覆盖(All-EdgesCoverage),基本路径覆盖(BasicPathCoverage),判定路径覆盖(Decision-Decision-Path)。它度量程序中每一个判定的分支是否都被测试到了。
分支覆盖比语句覆盖强,与条件覆盖有相似之处,容易混淆,案例的列举将与下面的条件覆盖一起,对比着讲解,以方便清楚地理解它们之间的异同点。
4.2.3 条件覆盖
条件覆盖,它度量判断中的每个子表达式结果true和false是否被测试到了。假如被测试代码如下:
设计判定覆盖案例时,我们只需要考虑判定语句(if(a<10 || b<10)的结果为true和false两种情况,即只考虑有一个条件满足的情况即可。因此,我们只要设计如下的案例就能达到判定覆盖率100%。
用例1:a=5,b=任意值,if()判定结果为ture, 覆盖分支一
用例2:a=20,b=20,if()判定结果为false,覆盖分支二
而条件覆盖,需每个表达式为true和false的情况都考虑到,上述程序块中,要达到100%的条件覆盖,其用例可设计如下:
用例1:a=5,b=5,(a<10),(b<10)都为true,覆盖分支一
用例2:a=15,b=15,(a<10)为false,(b<10)都为false,覆盖分支二
上面用例满足每个表达式为true 和false的情况,即达到了100%的条件覆盖。但我们对下面两个用例也很熟悉,对吧。
用例3:a=5,b=15,(a<10)为true,(b<10)为false,覆盖分支一
用例4:a=15,b=5,(a<10)为false,(b<10)为true,覆盖分支一
可见,即使达到100%的条件覆盖,并不是把各表达式的值进行了排列组合(那是条件组合覆盖做的事),仍存在一些分支未覆盖到,条件覆盖的覆盖度也是有限的。
4.2.4 路径覆盖
又称断言覆盖(PredicateCoverage),它度量了是否函数的每一个分支都被执行了。 这句话也非常好理解,就是所有可能的分支都执行一遍,有多个分支嵌套时,需要对多个分支进行排列组合,可想而知,测试路径随着分支的数量指数级别增加。
下面是一个路径覆盖的简单例子: