【问题标题】:Can fully covered code have an EclEmma coverage rating of less than 100%?完全覆盖的代码能否具有低于 100% 的 EclEmma 覆盖率?
【发布时间】:2012-06-08 15:27:19
【问题描述】:

我刚刚编写了一些简单的示例代码,以确保我正确安装了 EclEmma。我没有得到 100% 的覆盖率,我不明白为什么。突出显示意味着它与类名有关。这是我的代码,带有相应的 JUnit 测试,EclEmma 突出显示它的方式:

覆盖结果显示Arithmetic 中的三个指令没有被命中,尽管这两种实际方法似乎都被完全覆盖了:

我已经阅读了the EclEmma documentation about basic block coverage,但我仍然感到困惑。我不确定错过了哪些基本块。起初,我认为 EclEmma 可能只是忽略了类的字节码,但 ArithmeticTest 似乎处理得很好。

我有两个密切相关的问题:

  1. 这是否表明我安装/配置 EclEmma 的方式存在问题?
  2. 完全覆盖的代码具有高但不是完全 100% 的 EMMA 覆盖率是否正常/可接受,如果是,它是如何工作的?

【问题讨论】:

    标签: java eclipse code-coverage emma eclemma


    【解决方案1】:

    您的代码暗示了一个默认构造函数,Emma 无法正确标记该构造函数,因为它没有文本块。

    由于它没有在文本块中正确标记,Emma 无法将覆盖日志与文本文件关联,并且看起来某些代码没有被覆盖;因为,您运行了一些字节码,但无法注册行日志记录。稍后,当报告元素读取行日志时,他们找不到默认构造函数的行号,它在唯一有意义的地方突出显示错误,即类声明行。

    默认构造函数的样子

    public Arithmetic() {
      super();
    }
    

    super 是隐含的第一条指令,它将构造Object。虽然您可能会忽略它的存在,但编译器会为您添加它。这就是你得到“3 行”而不是 1 行的地方。

    【讨论】:

    • 实际上,它确实有一个“文本块”,它只是空的。在字节码中,默认构造函数在那里,在 EclEmma 标记为红色的那一行。为了覆盖它并让它以绿色显示,测试只需要调用构造函数:new Arithmetic()。当然,这里正确的做法是在类中声明一个private默认构造函数。
    【解决方案2】:

    我认为您要么需要测试 Arithmetic 的实例化,要么声明其构造函数 private 以禁止实例化

    【讨论】:

    • 啊,测试构造函数就可以了。 EclEmma 对私有构造函数并不满意,但我想我记得在某处看到过解决方法。
    【解决方案3】:

    IIRC,你需要实例化一个类的实例来使用语言提供的构造函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 2018-10-14
      相关资源
      最近更新 更多