【问题标题】:Code coverage in Java with EclEmma not scanning expecting exception methods使用 EclEmma 的 Java 代码覆盖率不扫描预期的异常方法
【发布时间】:2012-09-27 06:39:19
【问题描述】:

我正在尝试使用 Eclipse 和 EclEmma 在 java 中获取我的代码覆盖率。

我的测试使用的是 JUnit 4,有些测试看起来像这样:

    @Test(expected = IllegalArgumentException.class)
    public void createTime_withInvalidMinuteUnder0_throws(){
    //Arrange
    ...
    //Act
    Something triggering IllegalArgumentException Here       
}

EclEmma 说测试失败是因为抛出了 IllegalArgumentException。所以它会丢弃我的代码覆盖率指标,即使它应该抛出一些东西。是否可以选择让它看到 JUnit 预期的异常标记?

编辑:我发现如果你也将 throw 添加到测试的声明中,它会起作用!

【问题讨论】:

    标签: java eclipse unit-testing junit eclemma


    【解决方案1】:

    不,没有办法让 EclEmma 注意到 expected 子句。他们承认这一事实here

    为什么带有预期异常的 JUnit4 测试用例显示为未涵盖?

    具有预期异常的 JUnit4 测试用例显示为未涵盖,即使它们已执行。这样做的原因是底层的 JaCoCo 代码覆盖库仅在执行某些探针时才考虑执行代码。对于标有@Test{expected=...} 的成功测试用例,情况并非如此。

    就个人而言,我不会太担心。测试用例的覆盖率是 EclEmma 能告诉你的最不有趣的事情;我总是完全忽略这些指标并专注于我的生产代码的覆盖范围。

    【讨论】:

    • EclEmma 能告诉我哪些更有趣的事情?
    • 我指的是您的生产代码的代码覆盖率指标,而不是您的测试代码。还是我误解了你原来的问题?
    • 哦,我的错,我误解了你在回答中的陈述。
    • 您的测试确实必须被覆盖,只是异常情况不被 eclemma 覆盖。
    【解决方案2】:

    尚不能发表评论,但我想指出,关于已接受的答案,有充分的理由关注测试代码的覆盖率。

    使用 JUnit 很容易搞砸测试方法命名约定或忘记 @Test 注释,具体取决于您的 JUnit 版本。这样做,您很容易被愚弄,以为您的绿色实线表示您刚刚添加的漂亮测试通过了,而实际上它从未运行过。覆盖着色将非常突出地显示这一点。当然,正如这个线程所指出的,您的一些抛出异常的测试可能看起来好像没有运行。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,并提出了一个拉取请求来处理这个烦恼的最突出原因。我没有添加太多的探针,而是只处理方法调用的操作码。换句话说,由方法调用引发的异常导致的(以前)错误覆盖结果的问题得到了解决,但如果异常是由例如被零除、错误转换或数组索引引发的,则无法解决问题。

      https://github.com/jacoco/jacoco/pull/261

      随时对拉取请求发表评论或参与我在 JaCoCo 邮件列表中发起的讨论。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多