当前位置: 首页 > 知识库问答 >
问题:

类的执行数据与Jacoco不匹配

徐弘图
2023-03-14

我正在使用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代码覆盖报告生成器显示错误:“捆绑包‘代码覆盖报告’中的类与执行数据不匹配”

jacoco:对于报告生成,必须使用与运行时相同的类文件

我在Eclipse上编译了所有类,并使用ANT构建工具对这些类执行代码覆盖。由于一些依赖关系,我确实使用了一些外部JAR,它们已经在jdk 1.8.0_101上编译,并且我正在使用jdk 1.8.0 _111(我尝试通过使用JDK1.8.1_101来解决这个错误,但是我得到了相同的错误)

有人提到在Eclipse与Oracle JDK编译中类ID可能会发生变化。因此,我还通过在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>

问题:基于jdk 1.8的编译器生成的字节码1.Will有什么区别。0_101和jdk 1.8。0_111?增量更新可以改变字节码吗?还是只有在主要版本更新期间差异才显著?

2.为什么即使已实施离线检测,我仍会收到此错误?我是否遗漏了代码中的任何声明?我试图保持代码的格式与这里的jacoco文档中提供的示例的格式相似。

共有2个答案

华宪
2023-03-14

2.为什么即使已实施离线检测,我仍会收到此错误?我是否遗漏了代码中的任何声明?我试图保持代码的格式与这里的jacoco文档中提供的示例的格式相似。

当被测类被添加到其测试类中的 PrepareForTest 注释时,我注意到了这一点。

例如,在以下情况下,Foo.java将具有0覆盖率,错误执行类Foo的执行数据不匹配

@PrepareForTest({ Foo.class })
public class FooTest {

  @Test
  public void test1() {
    Foo f = new Foo();
    String result = f.doSomething();
    assertEquals(expectedResult, result);
  }

}
漆雕和昶
2023-03-14

基于jdk 1.8.0_101和jdk 1.8.0_111的编译器生成的字节码会有区别吗?增量更新能改变字节码吗?还是只有在主要版本更新时差异才显著?

是的——一般来说,任何不同版本的编译器(没有例外)都可以生成不同的字节码。

为什么即使实现了离线检测,我仍然会收到这个错误?我是否错过了代码中的任何声明

消息本身在你提到的SO问题中已经得到了完美的解释:jacoco代码覆盖报告生成器显示错误:“bundle 'Code Coverage Report '中的类与执行数据不匹配”

更精确的答案需要最小、完整和可验证的示例(https://stackoverflow.com/help/mcve)由您提供,不幸的是,我认为这只是构建的摘录。带有一些注释的xml是不完整和可验证的示例。不清楚Eclipse在这里除了JDK之外还扮演着什么角色。顺便说一下,Eclipse拥有并使用自己的Eclipse Java编译器。

我还注意到,当两者包含相同的类路径时,被检测的类的数量(614)不同于被添加到测试包的类的数量(566)。那会有什么后果吗?

是的——结果是检测的内容与为生成报告而分析的内容不同。这也与有关不匹配的消息相关。

 类似资料:
  • 问题内容: 我们有一个Maven多模块项目,其中包含一个父级(HelloWorld)和不同的子级(HelloWorldServices和HelloWorldPresentation),并使用Jenkins进行构建。 运行成功的测试后的错误是 前面的线说 这是我定义父pom JaCoCo插件的方式: 我没有明确提到过surefire。我还尝试了到处都可以找到的将argLine放入配置中的结果,但是所

  • 我正在用JUnit5测试一个应用程序,并使用Jacoco进行报道。测试执行正常,并有测试报告。 但是,如果服务包含方法,则Jacoco report会有以下日志,并用@Transactional注释 所有@Service class方法都会发生此错误,并用@Transactional注释,普通类coverage is calculated ok。 下面是一个样本测试: 很好。覆盖率为非零: 0%覆

  • 我正在使用Jacoco:报告标签生成Jacoco报告。我收到了以下错误: ant报告目标如下所示: 是使用<code>生成的/仅代码/src。那么为什么会出现这样的错误呢。知道吗?

  • 我们有一个Maven多模块项目,由父级(HelloWorld)和不同的子级(HelloWorldServices和HelloWorldPresentation)组成,并使用Jenkins进行构建。 运行成功测试后的错误是

  • 我得到了 我错过了什么?

  • 我正在使用一个大的应用程序来测试。为了运行测试,我将可测试的war文件(test.war)添加到现有的应用程序中。ear并远程部署在WildFly 10服务器上。 我的需求的下一部分是在测试运行后获得代码覆盖率报告。为此,我使用了Jacoco,并使用Jacoco Maven插件运行它。 应用程序。ear得到部署,即使测试运行正常,但在生成报告时,Jacoco失败,出现异常“IllegalState