类的执行数据不匹配 jacoco



我正在使用 jacoco 使用 ant> ant 查找单位测试的代码覆盖范围,但报告未生成,我得到了此错误序列:

[jacoco:report] Loading execution data file C:JUnitapache-ant-1.10.1jacoco.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代码覆盖范围报告发电机显示错误:捆绑范围"代码覆盖报告"中的"类别"与执行数据无匹配;

jacoco:对于报告一代

我在Eclipse上编辑了所有类,并使用ANT构建工具在这些类上执行代码覆盖范围。由于某些依赖项,我确实使用了一些外部罐子,并且它们已在JDK 1.8.0_101上编译,并且我使用的是JDK 1.8.0_111(我尝试使用JDK 1.8.0_101解决此错误,但我遇到了相同的错误(

已经提到类ID可能会在Eclipse与Oracle JDK汇编中更改。因此,我还通过在Eclipse上编译一些基本类,并使用JDK ANT查找代码覆盖范围来检查此情况。它在这种情况下起作用。代码覆盖任务中没有进行汇编。.class文件只需要检查以获取覆盖范围即可。

在测试代码覆盖范围之前,错误中提到的所有类都已在Eclipse上编译。

>尝试使用离线仪器工具作为使用的持久性框架的解决方法,但仍然给我这些错误。上述错误中所述的所有类都存在于仪器类文件夹中。 $ {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文档中提供的示例相似。

  1. 我还注意到,仪器的类数量(614(与添加到测试捆绑包中的类数(566(不同。这可能是任何结果吗?

基于JDK 1.8.0_101和JDK 1.8.0_111生成的编译器生成的字节码会有任何差异吗?增量更新可以更改字节码吗?还是仅在主要版本更新期间仅有很大的差异?

是 - 通常,编译器的任何不同版本(无例外(都可以生成不同的字节。

即使实施了离线仪器,为什么我仍然会遇到此错误?我是否错过了代码中的任何声明?

您引用的问题已经完美地说明了该消息本身:Jacoco代码覆盖范围报告发电机显示错误:bundle'Code Coverage Report中的"类"类别"无匹配的执行数据"

更精确的答案需要最小的,完整可验证的示例(https://stackoverflow.com/help/mcve(,不幸的是在我看来,只有一些注释的 build.xml摘录不是完整可验证示例。除了JDK之外,不清楚Eclipse在这里扮演的角色。顺便说一句Eclipse拥有并使用其自己的Eclipse Java编译器。

我还注意到,当两者都包含相同的类路径时,仪器的类数(614(与添加到测试捆绑包中的类(566(的数量有所不同。可能有任何结果吗?

是的 - 结果是,仪器与生成报告的分析不同。这也与关于不匹配的消息相关。

2.为什么即使实施离线仪器后,我仍然会遇到此错误?我是否错过了代码中的任何声明?我试图将代码的格式保持与Jacoco文档中提供的示例相似。

添加了测试的课程以在测试课程中添加了forderfortest注释时,我注意到了这一点。

例如。在以下情况下,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);
  }
}

基本上,测试的字节码之间的任何差异与字节码jacoco拾取以计算覆盖范围,这将导致这一点。一些示例是缩小和混淆,使用不同的jvms 以及任何类型的 bytecode级别操作

以我为例,firebase正在进行一些字节码操纵。这里有一张票。

您需要降级到没有此问题的Firebase AGP版本。

最新更新