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 添加到测试的声明中,它会起作用!

4

3 回答 3

21

不,没有办法让 EclEmma 注意到该expected条款。他们在这里承认这一事实。

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

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

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

于 2012-10-06T07:39:47.127 回答
5

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

It's just way to easy with JUnit to screw up the test method naming convention or forget the @Test annotation, depending on your JUnit version. Do that, and you could easily be fooled into thinking that your solid green bar means that the nice test you just added passed, when in fact it never ran. Coverage coloring will show this very prominently. Except of course, as this thread points out, some of your tests that throw exceptions might look like they didn't run when they did.

于 2015-01-30T13:50:21.450 回答
0

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

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

随意评论拉取请求或参与我在 JaCoCo 邮件列表上开始的讨论。

于 2015-01-06T14:13:29.537 回答