我正在使用jacoco:report标记生成jacoco报告。我收到如下错误:
[jacoco:report] Classes in bundle 'Code Coverage Report' do no match with execution data. For report generation the same class files must be used as at runtime.
[jacoco:report] Execution data for class xxxxx does not match.
[jacoco:report] Execution data for class yyyyy does not match.
蚂蚁报告目标如下所示:
<target name="report">
<jacoco:report>
<executiondata>
<file file="${jacocoexec.dir}/${jacocoexec.filename}"/>
</executiondata>
<!-- the class files and optional source files ... -->
<structure name="Code Coverage Report">
<classfiles>
<fileset file="./jar/abc.jar"/>
</classfiles>
<sourcefiles>
<fileset dir="./code/src"/>
</sourcefiles>
</structure>
<!-- to produce reports in different formats. -->
<html destdir="${jacoco.report.dir}"/>
</jacoco:report>
</target>
这样生成的abc.jar
是只使用./code/src
生成的,那为什么会出现这样的错误,你知道吗?
5条答案
按热度按时间zynd9foi1#
您收到了与classID相关的错误。JaCoCo docs-site. http://www.eclemma.org/jacoco/trunk/doc/classids.html中详细描述了这个概念。这是在同一JVM中支持多个版本的类(例如一个appserver)的关键步骤。
复制其中的一部分以提高可见度。
类id是64位整数值,例如十六进制表示法中的0x638e104737889183。它们的计算被认为是JaCoCo的实现细节。目前id是使用原始类文件的CRC64校验和创建的。
类ID只有在完全相同的类文件中才是相同的(一个字节接一个字节)。您可能会得到不同的类文件,原因有两个。首先,如果您使用不同的工具链,编译Java源文件将得到不同的类文件:
同样,后处理类文件(obfuscation、AspectJ等)通常也会改变类文件。如果您只是简单地使用相同的类文件进行运行时和分析,JaCoCo将工作得很好。因此创建这些类文件的工具链并不重要。
即使文件系统上的类文件是相同的,JaCoCo运行时代理看到的类也可能是不同的。这通常发生在JaCoCo代理或特殊类加载器预处理类文件之前配置了另一个Java代理的情况下。
同一页还介绍了可能的解决方案。
如果类在运行时在您的设置中被修改,有一些变通方法可以让JaCoCo工作:
现在使用
"gradlew test jacocoTestReport"
命令生成报告。x759pob22#
JaCoCo需要与执行时使用的报告生成完全相同的类文件。由于不同的编译器和/或修改类的其他工具,类可能会有所不同。
gjmwrych3#
我注意到,如果您要报告代码覆盖率的类在JUnit测试中使用PowerMockito时被Mockito抑制了静态初始化,就会发生这种情况。
测试时的错误如下所示:
amrnrhlw4#
各种答案与深刻的见解,但我仍然会分享什么为我工作后,2天的摆弄设置。
因此,根据代码设置指南,您需要在构建任务之后运行分析任务,而这正是我完全忽略的步骤。
下面是我之前的任务序列
这是重新定位后的情况
所以本质上我学到了一些东西,脱离了上下文,但最重要的是。
o2rvlv0m5#
添加离线检测后,覆盖率正常,但我开始收到class is already instrumented消息。在build.gradle中添加此消息会有所帮助。