声明和决策覆盖范围之间的差异

时间:2013-01-25 10:00:44

标签: code-coverage metrics

据说

语句覆盖率可确保代码中的每个语句至少执行一次。
决策/分支覆盖据说测试决策的每个分支/输出都被测试,即两个假/真分支中的所有语句都将被执行。
但是不一样吗?在Statement覆盖中我需要执行所有语句,所以我想它只能通过运行所有可能的方式来完成。我知道我在这里错过了一些东西..

3 个答案:

答案 0 :(得分:11)

如果测试具有完整的分支覆盖率,那么我们可以说它也具有完整的语句覆盖率,但反之亦然。反之亦然。

100%分支覆盖率=> 100%声明覆盖率

100%的声明覆盖率并不意味着100%的分支覆盖率

原因是除了执行所有语句之外的分支覆盖,我们还应该验证测试是否执行所有分支,这可以被解释为覆盖控制流分支中的所有边缘

if(a){
   if(b){
     bool statement1 = true;
   }
}

a = true,b = true将给出100%的语句覆盖率,但不提供分支覆盖率

enter image description here

在分支覆盖范围内,我们需要覆盖所有边缘,这是我们在上图中显示为红线的声明范围中遗漏的

答案 1 :(得分:4)

您可能会发表如下声明:

if(a || b || (c && d && !e)) {
    test1 = true;
} else {
    test2 = false;
}

如果您的代码覆盖率表示test1和test2行都被命中,那么您有语句覆盖率,但要获得完整的分支覆盖率,您需要测试a何时为真,a为false但b为真,当a和b是假的,但c和d是真的,e是假的等等。

分支机构覆盖范围涵盖了分支机构选择的所有潜在组合,因此难以实现100%的覆盖率。

答案 2 :(得分:2)

好问题。我经常使用的解释是,没有else分支的if语句仍然具有不可见的“空” else语句:

  • 普通语句覆盖率只是坚持要求所有实际存在的语句均已真正执行。

  • 分支机构坚持认为即使执行不可见的else-branch分支。

类似的情况发生在没有默认情况的开关语句中,并且重复直到循环。分支覆盖要求执行默认情况,并且重复直到执行至少两次。

代码示例:

if (passwordEnteredOK()) {
    enterSystem();
} 
/* Invisible else part 
else {
  // do nothing
}
*/

通过声明覆盖范围,您只需检查是否使用正确的密码即可使用该系统。使用分支机构覆盖范围,您还可以测试使用错误的密码输入进入系统。