【问题标题】:Why code coverage sometimes counts method name or closing bracket?为什么代码覆盖率有时会计算方法名称或右括号?
【发布时间】:2014-09-08 20:00:11
【问题描述】:

为什么这些行如方法定义(带有修饰符、方法名称、参数等的行)或右括号会有时计入行覆盖范围?

在这个特定的例子中,它是一个构造方法,但并不总是这样:

你能解释一下吗?

【问题讨论】:

  • 它是一个构造函数,因此它的显示方式可能略有不同。你确定它也发生在方法上吗?
  • 是的,我确定。构造函数总是这样,但其他方法有时也有这样的行。我认为,当您使用调试器并且它停止在似乎什么都不做的行上时,情况完全相同——比如右括号。我认为它以某种方式与字节码有关。
  • 这取决于实际使用的工具,不是吗?
  • 顺便说一下 - 凭直觉 - 它可能只是输出的颜色突出显示不同,实际分析可能是相同的。如果是这样,我不会感到惊讶。
  • 没有任何“规则”——无论工具做什么,工具就做什么。

标签: java unit-testing junit code-coverage


【解决方案1】:

这取决于您使用的覆盖工具,但我看到了一些与您的结果相匹配的工具。

据我所知,原因是抛出/提前返回与到达函数末尾。

请注意,只有右大括号突出显示的方法不会返回(任何内容),而是在函数末尾运行,因此触及右大括号(以及可能发生在那里的堆栈弹出)。构造函数也是如此,它不会显式返回函数内的任何位置。

在其他示例中,最后突出显示的行是执行离开函数的位置。

您可以通过设置一个提前返回的方法并在收集覆盖率时仅测试这种情况来非常轻松地测试这一点。用覆盖率测试另一个(返回结束)案例,并比较两者。希望第二个显示右括号突出显示。

例如:

public class EarlyReturn {
    public static void whatHappens(final Boolean path) {
        System.out.println("Entering method...");

        if (path == null) {
           throw new IllegalArgumentException("Must have a path.");
        } else if (path) {
            System.out.println("Exiting early...");
            return;
        }

        System.out.println("Exiting normally...");
    }
}

与:

@RunWith(JUnit4.class)
public class TestEarlyReturn {
    @Test
    public void testEarly() {
        EarlyReturn.whatHappens(true);
    }

    @Test
    public void testNormal() {
        EarlyReturn.whatHappens(false);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testThrow() {
        EarlyReturn.whatHappens(null);
    } 
}

您没有提到行/分支覆盖率指标,但在您的示例中,所有案例都应具有 100% 的覆盖率(我希望如此)。当然,这仍然取决于工具及其采样方式。我的示例不应具有 100% 的行覆盖率,除非您同时运行这两个测试。

【讨论】:

  • 第一个例子有 80% 的行覆盖率和 66% 的方法覆盖率。红线表示它尚未运行。除此之外,你是对的!谢谢!顺便提一句。我知道这取决于工具,但似乎它们中的大多数(我使用的)的行为方式相同。
  • @MichalChudy 啊,抱歉,没注意红线。 80/66 是预期的数字。只要在返回值的函数中没有将右大括号计算为可执行文件,事情就显得很尴尬。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2013-03-08
相关资源
最近更新 更多