【问题标题】:Strange behavior of ECLEmma Code Coverage Tool in eclipseeclipse中ECLEmma代码覆盖工具的奇怪行为
【发布时间】:2015-05-02 02:06:10
【问题描述】:

代码覆盖工具ECLEmma有个奇怪的问题:

对于MyFirstLogger的类我写了测试类MyFirstLoggerTest

请注意,我在MyFirstLoggerTest 中写了一个Testmethod,我希望得到一个NullPointerException,只是为了通过setLogger 中的else if-case MyFirstLogger 其中logger为 null 并抛出 NullPointerexception

但是为什么这个分支还是黄色而不是绿色呢?这是一个错误吗?

【问题讨论】:

    标签: java eclipse junit code-coverage eclemma


    【解决方案1】:

    这种行为很常见:

    • testNullableGetLogger 被读取是因为 Emma(但和大多数其他代码覆盖工具)在完成时将一行标记为成功。由于它引发异常 (NullPointerException),因此该行(和方法!)无法完成,因此是红色的。

    • else if (logger == null) 是黄色的,因为 emma 在代码中添加了隐式 else 情况。在您的情况下,永远无法输入这种 else 情况,因为 if 情况涵盖了记录器上的所有状态。要获得绿色线,请将其替换为 else

    【讨论】:

    • 添加一个隐式的 else ... 在哪里?到第 16 行的“如果”?即便如此,第 16 行的 condition 仍然存在(您说您检查了字节码);为什么它没有被标记为已执行?
    • Yellow 表示部分执行。日食中的提示说“错过了 2 个分支中的 1 个”。如果没有输入 else 分支,或者 - 如此处 - 源代码中不存在,这是一个常见的失败。
    • 描述的修改不在类文件的字节码中。我没有检查运行时字节码,但它会发现每个没有elseif ... else if 都会得到一个合成的else,或者至少以这种方式报告缺少的else
    • 字节码中没有隐式添加“else”;每个“==”、“!=”等条件都会产生一个条件跳转字节码指令。发生的情况是条件是多余的,因为它总是评估为true if 达到。然而,代码覆盖工具不会检测到这种冗余,因为它需要复杂的数据流分析。
    • @IraBaxter 它没有被标记为已执行,因为覆盖工具(这里是 JaCoCo,但也有 JMockit Coverage)不执行数据流分析。据我所知,目前没有任何覆盖工具可以做到这一点,包括 Clover。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多