【问题标题】:Please confirm/comment on Branch Coverage issue I'm seeing with EclEmma Eclipse Plugin请确认/评论我在 EclEmma Eclipse 插件中看到的分支覆盖率问题
【发布时间】:2016-04-30 13:22:10
【问题描述】:

使用 EclEmma Eclipse 代码覆盖率插件运行此单元测试后,它返回 100% 的分支覆盖率,即覆盖 4 个分支中的 4 个,我预计此处仅覆盖 4 个分支中的 2 个,即 50% 覆盖率。 如果我证明是正确的,任何人都可以建议一个更好的分支覆盖工具。提前致谢。

@Test
public void testTT(){;
    assertTrue(bar(true, true)==3);
}

@Test
public void testFF(){;
    assertTrue(bar(false, false)==8);
}


int bar(boolean cond1, boolean cond2) {
      int answer = 1;
      if (cond1) {
          answer = answer * a();
      } else {
          answer = answer * b();
      }

      if (cond2) {
          answer = answer * c();
      } else {
          answer = answer * d();
      }
    return answer;
    }

private int a(){
    return 1;
}

private int b(){
    return 2;
}

private int c(){
    return 3;
}

private int d(){
    return 4;
}

【问题讨论】:

标签: java unit-testing eclipse-plugin code-coverage


【解决方案1】:

工具是正确的。代码中有 4 个分支,所有 4 个分支都被执行。

我相信您正在寻找的是整个代码中有多少独特路径的组合复杂性,并为此制定了衡量标准。在您的示例中,分支数恰好等于通过整个方法的路径数。

我可以用一个稍微长一点的例子来说明区别:

@Test
public void testTTT(){;
    assertTrue(bar(true, true, true)==3);
}

@Test
public void testFFF(){;
    assertTrue(bar(false, false, false)==8);
}


int bar(boolean cond1, boolean cond2, boolean cond3) {
      int answer = 1;
      if (cond1) {
          answer = answer * a();
      } else {
          answer = answer * b();
      }

      if (cond2) {
          answer = answer * c();
      } else {
          answer = answer * d();
      }

      if (cond3) {
          answer = answer * c();
      } else {
          answer = answer * d();
      }
      return answer;
}

在上面的例子中,有 6 个分支条件,全部只包含两个测试。但是整个函数有8条代码路径。

没有工具可以绘制出所有可能的代码路径(很确定这样做会解决NP-complete 问题。)当然,测试(非平凡的)程序的所有可能输入是不现实的。使用代码覆盖率是帮助确保您的程序经过良好测试的一种工具。

【讨论】:

    【解决方案2】:

    你需要区分分支覆盖和路径覆盖。您的函数bar 有四个分支,即两个 IF 语句中的每一个都有一个 THEN 和一个 ELSE 分支。而且,您的两个测试用例实际上涵盖了所有这四个分支。第一个测试涵盖两个 THEN 分支,第二个测试涵盖两个 ELSE 分支。这是所有分支的 100%。

    关于路径覆盖,您的代码示例有四个路径:a-c、a-d、b-c、b-d,其中只有 a-c 和 b-d 被覆盖。当您预计覆盖率只有 50% 时,您可能已经想到了路径。

    通常情况下,覆盖工具不会处理路径覆盖:路径的数量会迅速增加,并且在出现循环的情况下,工具必须将其视为无限(除非在特殊情况下,并且只有在覆盖工具会关心的情况下)进行必要的静态分析以发现这些情况)。

    如果您关心的是测试套件的质量,我建议您不要将注意力限制在代码覆盖率分析上,还要考虑设计/评估测试套件的其他可能性,例如需求覆盖率、等价分区边界案例分析、变异测试……

    【讨论】:

      猜你喜欢
      • 2018-12-02
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多