我正在使用 Jacoco 来查找使用 ANT 的单元测试的代码覆盖率,但报告未生成,我收到此错误序列:
[jacoco:report] Loading execution data file C:\JUnit\apache-ant-1.10.1\jacoco.ex
ec
[jacoco:report] Writing bundle 'Test' with 566 classes
[jacoco:report] Classes in bundle 'Test' 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 com/!!/AccountDetails does not match.
[jacoco:report] Execution data for class com/!!/DataExtractorHelper does not match.
[jacoco:report] Execution data for class com/!!/WelcomeLetter does not match.
[jacoco:report] Execution data for class com/!!/WelcomeLetterABCD does not match.
我已经阅读了这些答案,但似乎没有人帮我解决问题。
jacoco: For report generation the same class files must be used as at runtime
我编译了Eclipse上的所有类,并使用ANT构建工具对这些类执行代码覆盖。由于一些依赖性,我确实使用了一些外部jar并且它们已经在jdk 1.8.0_101上编译而且我使用的是jdk 1.8.0_111(我尝试使用jdk 1.8.0_101解决了这个错误,但是我得到了同样的错误)
有人提到类ID可能会在Eclipse与Oracle JDK编译中发生变化。因此,我还通过编译Eclipse上的一些基本类来检查这种情况,并使用jdk + ANT来查找代码覆盖率。它适用于这种情况。代码覆盖任务中没有编译。只需要检查.class文件的覆盖范围。
在测试代码覆盖率之前,错误中提到的所有类都是在eclipse上编译的。
我尝试使用离线工具工具作为正在使用的持久性框架的变通方法,但它仍然给我这些错误。 错误中上面提到的所有类都出现在Instrumented类文件夹中。 $ {dest.dir}
这是我目前的build.xml。
<target name="instrument">
<delete dir="${dest.dir}"/>
<mkdir dir="${dest.dir}"/>
<jacoco:instrument destdir="${dest.dir}">
<fileset file="D:/NEON/HW/!!/module/!!/bin" includes="**/*.class"/>
<fileset file="D:/NEON/HW/!!/testprojects/!!/bin" includes="**/*.class"/>
</jacoco:instrument>
</target>
<target name="cov-test" depends="instrument">
<mkdir dir="${report.dir}"/>
<jacoco:coverage>
<junit fork="true" forkmode="once" showoutput="true" printsummary="on" enabletestlistenerevents="true">
<classpath>
<path refid="ALL.jars"/>
<path refid="classpath"/>
<pathelement location="C:/JUnit/jacoco-0.7.9/lib/jacocoagent.jar"/>
<pathelement location="C:/JUnit/JARS/!!/config/"/>
<pathelement path="C:/JUnit/apache-ant-1.10.1/InstrClasses"/>
</classpath>
<sysproperty key="jacoco-agent.destfile" file="jacoco.exec"/>
<test name="Fully qualified classname"/>
<formatter type="plain"/>
<formatter type="plain" usefile="false" />
<batchtest fork="yes" todir="${report.dir}">
<fileset dir="${src.dir}" includes="Fully qualified classname.java"/>
</batchtest>
</junit>
</jacoco:coverage>
</target>
<target name="cov-report" depends="cov-test">
<jacoco:report>
<executiondata>
<file file="jacoco.exec" />
</executiondata>
<structure name="Test">
<classfiles>
<fileset dir="D:/NEON/HW/!!/module/!!/bin"/>
<fileset dir="D:/NEON/HW/!!/testprojects/!!/bin"/>
</classfiles>
<sourcefiles>
<fileset dir="D:/NEON/HW/!!/module/!!/src"/>
<fileset dir="D:/NEON/HW/!!/testprojects/!!/src"/>
</sourcefiles>
</structure>
<csv destfile="${report.dir}/report.csv" />
</jacoco:report>
</target>
问题: 1.基于jdk 1.8.0_101和jdk 1.8.0_111的编译器生成的字节码是否有任何差异?增量更新可以更改字节码吗?或者在主要版本更新期间差异是否显着?
2.为什么即使在实施离线检测后我仍然会收到此错误?我错过了代码中的任何声明吗?我试图将代码格式保持为与jacoco文档here中提供的示例类似。
答案 0 :(得分:4)
基于jdk 1.8.0_101和jdk 1.8.0_111的编译器生成的字节码会有什么不同吗?增量更新可以更改字节码吗?或者在主要版本更新期间差异是否显着?
是的 - 通常,编译器的任何不同版本(无例外)都可以生成不同的字节码位。
为什么即使在实施离线检测后我仍然会收到此错误?我错过了代码中的任何声明吗?
在您提及的问题中,邮件本身已经完美地解释了:jacoco code coverage report generator showing error : "Classes in bundle 'Code Coverage Report' do no match with execution data"
更精确的答案需要您提供最小,完整和可验证示例(https://stackoverflow.com/help/mcve),不幸的是在我看来只是摘录了build.xml
部分评论不是完整和可验证示例。除了JDK之外,还不清楚Eclipse在这里扮演的角色。就像Eclipse拥有并使用自己的Eclipse Java编译器一样。
我还注意到,当两个类包含相同的类路径时,被检测的类的数量(614)与添加到测试包(566)的类的数量不同。这有什么后果吗?
是 - 结果是所检测的内容与分析报告生成的内容不同。这也与有关不匹配的消息有关。
答案 1 :(得分:0)
2。为什么即使实施了离线检测后,仍然出现此错误?我会错过代码中的任何声明吗?我试图使代码的格式与jacoco文档中提供的示例的格式相似。
当将被测类添加到测试类的PrepareForTest annotation中时,我注意到了这一点。
例如在以下情况下,Foo.java的覆盖范围为0,错误为Execution data for class Foo does not match.
。
@PrepareForTest({ Foo.class })
public class FooTest {
@Test
public void test1() {
Foo f = new Foo();
String result = f.doSomething();
assertEquals(expectedResult, result);
}
}