【发布时间】:2013-02-21 17:49:38
【问题描述】:
This sonar page基本上列出了不同代码覆盖率分析工具采用的各种方法:
这三种方法是什么,哪一种效率最高,为什么?如果效率问题的答案是“取决于”,请解释为什么?
【问题讨论】:
标签: java code-coverage cobertura jacoco clover
This sonar page基本上列出了不同代码覆盖率分析工具采用的各种方法:
这三种方法是什么,哪一种效率最高,为什么?如果效率问题的答案是“取决于”,请解释为什么?
【问题讨论】:
标签: java code-coverage cobertura jacoco clover
源代码检测包括在编译源代码之前向源代码添加指令。这些指令用于跟踪代码的哪些部分已被执行。
离线字节码检测包括添加那些相同的指令,但在编译之后,直接添加到字节码中。
动态字节码检测包括在字节码中添加相同的指令,但在运行时,当 JVM 加载字节码时动态添加。
This page 有方法之间的比较。它可能有偏见,因为它是 Clover 文档的一部分。
根据你对“高效”的定义,选择你最喜欢的那个。我不认为你会得到巨大的差异。他们都在做这项工作,无论使用什么方法,大局都是一样的。
【讨论】:
通常对覆盖率的影响是相同的。
源代码检测可以提供出色的报告结果,因为字节码检测无法区分源代码行中的任何结构,因为代码块粒度仅根据源代码行记录。
假设我在一行中有两个嵌套的 if 语句(或等效地,if (a && b) ... *)。源代码检测器可以看到这些,并在源代码行中为 if 中的多个分支提供覆盖信息;它可以根据行和列报告块。字节码检测器只能看到围绕条件的一行。如果条件 a 执行但为假,它是否会将行报告为“已覆盖”?
您可能会争辩说这是一种罕见的情况(而且很可能是),因此不是很有用。当您获得虚假报道并随后出现现场故障时,您可能会改变对实用程序的看法。
源代码检测器还可以实现更快的测试执行,因为它具有帮助优化检测代码的编译器。特别是,由二进制检测器插入循环内的探针可能会由 JIT 编译器在循环内编译。一个好的 Java 编译器会看到检测产生循环不变的结果,并将检测从循环中取出。 (可以说,JIT 编译器也可以这样做;问题是他们是否真的这样做)。
【讨论】:
if (a && b)”中) 显示为覆盖率报告中的内容。