Eclemma说4个分支中有1个未被覆盖,但它是哪个分支?

时间:2013-03-19 06:43:43

标签: java eclipse code-coverage eclemma

有没有一种简单的方法来判断我错过哪个分支?即我有一些像这样的代码:

if (x || y) {
    // do stuff
}

在重点介绍中,Eclipse中有一个黄点表示:

  

4个分支中的1个错过了

但我想知道哪个分支缺失。

7 个答案:

答案 0 :(得分:17)

xy可以是什么?

  • true || true true (由于JVM优化而未涵盖:如果第一个条件为true,则由于短路评估而不会评估第二个条件)< / LI>
  • false || true true
  • true || false true
  • false || false false

答案 1 :(得分:9)

Eclemma的父母open issue的github repo上的jacoco表明这样的功能实际上有点难以包含。

然而,即使没有Eclemma功能,如果目标只是找出在特定情况下错过的分支,您可以检测代码以跟踪。最简单的例子是旧式的印刷语句:

if (x || y) {
    System.out.println("BRANCH: " + x + ", " + y);
    // Do stuff
}

然后查看输出并查看实际命中的分支(例如java ... | grep "BRANCH:" | sort | uniq)。 (我知道,这并不十分令人满意。)

答案 2 :(得分:5)

答案是true|| true未涵盖。

这是因为一旦JVM发现第一个条件为真,那么它将不会运行第二个条件(它已经过优化),这意味着代码的一部分永远不会运行。

正如Maroun所说,4个分支中的3个将允许条件通过。如果您仍然担心代码覆盖率,则可以将条件重构为&&而不是||

(x || y)(!(!x && !y))相同,这样您就可以测试所有条件,因为现在只有三个分支。

条件的原始形式经常出现在保护声明中:

if (obj == null || obj.hasError())
{
    throw new RuntimeException();
}

这绝不允许您检查obj是否为null并且有错误,因为它会抛出空指针异常。

如果代码覆盖率很重要,那么只需使用此表单:

if (!(obj != null && !obj.hasError()))
{
    throw new RuntimeException();
}

答案 3 :(得分:4)

有一个非常简单的方法 - 只需将每个逻辑谓词放在单独的行中,如下所示:

if (x 
    || y) {
    System.out.println("BRANCH: " + x + ", " + y);
    // Do stuff
}

现在当你运行analisys时,标记应直接指向错过的分支。在您完成后,您可以正确的方式重新格式化代码。

HTH

答案 4 :(得分:0)

if块中的嵌套语句或扩展xy谓词的语句中可能存在隐式分支。

阅读本文: http://emma.sourceforge.net/faq.html#q.fractional.examples

答案 5 :(得分:0)

以下表达式的结果是什么?

  • true || true true
  • true || false true
  • false || true true
  • false || false false

如果在第一种和第二种情况下,当您将第一个参数设置为 TRUE 时,则无需检查第二个参数。

  • true && true true
  • true && false false
  • false && true false
  • false && false false

或者如果您看到使用 AND 运算符的情况,则如果第一个参数为 FALSE ,则无需检查第二个参数。

因此,您将永远无法检查4个分支中的1个分支。

答案 6 :(得分:0)

要获得全面介绍,避免编译器的隐式选择,您必须将if语句重写为两个as

if (x) {
    // do stuff
} else if (y) {
    // do the same stuff
}

这将获得完整的报道,但将被正确标记为冗余代码。看到问题后,我宁愿使用黄线,也不愿将此凌乱的结构添加到代码中。