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

Jacoco代码覆盖报告生成器显示错误:“捆绑包‘代码覆盖报告’中的类与执行数据不匹配”

慕学海
2023-03-14

我正在使用Jacoco:报告标签生成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.

ant报告目标如下所示:

<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。那么为什么会出现这样的错误呢。知道吗?

共有3个答案

慎俊艾
2023-03-14

我注意到,如果您想要报告代码覆盖率的类在JUnit测试中使用PowerMockito的Mockitos抑制了其静态初始化,则会发生这种情况。例如,如果您的测试类看起来像:

@SuppressStaticInitializationFor(
        {"com.yourpkg.A",
        "com.yourpkg.B"})
public class Test {
     @Test
     public void Test() { }
}

测试时的错误如下:

Classes in bundle 'yourProject' do not match with execution data. 
For report generation the same class files must be used as at runtime. 
Execution data for class com/yourpkg/A does not match. 
Execution data for class com/yourpkg/B does not match.
充子航
2023-03-14

JaCoCo需要与执行时完全相同的类文件来生成报告。由于不同的编译器和/或修改类的其他工具,类可能会有所不同。

余靖
2023-03-14

您将得到与classID相关的错误。这是一个在JaCoCo docs-site上详细描述的概念。http://www.eclemma.org/jacoco/trunk/doc/classids.html.这是在同一个JVM中支持类的多个版本(例如appserver)的关键一步。

为了可见性,在这里复制了它的一部分。

什么是类id,它们是如何创建的?

类 ID 是 64 位整数值,例如,0x638e104737889183十六进制表示法。它们的计算被认为是 JaCoCo 的实现细节。当前,id 是使用原始类文件的 CRC64 校验和创建的。

什么会导致不同的类ID?

仅对于完全相同的类文件(逐个字节),类ID是相同的。您可能会获得不同的类文件有几个原因。如果您使用不同的工具链,首先编译Java源文件将导致不同的类文件:

>

  • 不同的编译器供应商(例如Eclipse与Oracle JDK)

    不同的编译器版本

    不同的编译器设置(例如html" target="_blank">调试与非调试)

    此外,后处理类文件(混淆,AspectJ等)通常会更改类文件。JaCoCo 将很好地工作,如果你只是使用相同的类文件运行时和分析。因此,创建这些类文件的工具链无关紧要。

    即使文件系统上的类文件相同,JaCoCo 运行时代理程序看到的类也可能不同。当在 JaCoCo 代理程序或特殊类装入器预处理类文件之前配置了另一个 Java 代理程序时,通常会发生这种情况。典型的候选人是:

      < li >模拟框架 < li >应用程序服务器 < li >持久性框架

    同一页涵盖了可能的解决方案。

    有什么变通办法来处理运行时修改的类?

    如果类在运行时在您的设置中被修改,有一些解决方法可以使JaCoCo以任何方式工作:

      < li >如果您使用另一个Java代理,请确保首先在命令行中指定JaCoCo代理。这样,JaCoCo代理应该可以看到原始的类文件。 < li >指定JaCoCo代理的classdumpdir选项,并在生成报告时使用转储的类。请注意,只有加载的类才会被转储,也就是说,根本没有执行的类不会在您的报告中显示为未覆盖。 < li >在运行测试之前,请使用脱机检测。这样,在任何运行时修改发生之前,JaCoCo就会对类进行检测。请注意,在这种情况下,报告必须使用原始类生成,而不是使用插装的类。

    编辑日期:2017年2月22日

    如何使用离线仪器:使用Daniel Atallah提供的以下任务。

    //Additional SourceSets can be added to the jacocoOfflineSourceSets as needed by 
    project.ext.jacocoOfflineSourceSets = [ 'main' ]
    task doJacocoOfflineInstrumentation(dependsOn: [ classes, project.configurations.jacocoAnt ]) {
        inputs.files classes.outputs.files
        File outputDir = new File(project.buildDir, 'instrumentedClasses')
        outputs.dir outputDir
        doFirst {
            project.delete(outputDir)
            ant.taskdef(
                resource: 'org/jacoco/ant/antlib.xml',
                classpath: project.configurations.jacocoAnt.asPath,
                uri: 'jacoco'
            )
            def instrumented = false
            jacocoOfflineSourceSets.each { sourceSetName ->
                if (file(sourceSets[sourceSetName].output.classesDir).exists()) {
                    def instrumentedClassedDir = "${outputDir}/${sourceSetName}"
                    ant.'jacoco:instrument'(destdir: instrumentedClassedDir) {
                        fileset(dir: sourceSets[sourceSetName].output.classesDir, includes: '**/*.class')
                    }
                    //Replace the classes dir in the test classpath with the instrumented one
                    sourceSets.test.runtimeClasspath -= files(sourceSets[sourceSetName].output.classesDir)
                    sourceSets.test.runtimeClasspath += files(instrumentedClassedDir)
                    instrumented = true
                }
            }
            if (instrumented) {
                //Disable class verification based on https://github.com/jayway/powermock/issues/375
                test.jvmArgs += '-noverify'
            }
        }
    }
    test.dependsOn doJacocoOfflineInstrumentation
    

    现在使用"gradlew test JacocoTestReport"命令生成报告。

  •  类似资料:
    • 我试图设置为我的项目的代码覆盖 我的项目基于 下面是我项目的 然后我运行并看到以下内容 然后我运行,我看到 问题 -配置中有什么不正确 -如何生成报告? 谢啦

    • Jacoco插件在jenkins报告中显示0%的覆盖率,但当我在本地系统中运行相同的命令时,Jacoco会正确生成报告。我正在使用以下命令: mvn-s xyz/settings.xml-f xyz/xyz/pom.xml清洁安装org.jacoco 所以当我在jenkins中运行这个命令时,它会生成错误的报告。我已经检查了它在工作区目录对应的项目在詹金斯。它显示每个项目的0%覆盖率。但是当我在本

    • 我正在尝试使用JaCoCo为代码覆盖添加报表生成。该项目使用Maven,所以我有Jacoco maven插件配置如下: surefire插件如下: 但是在跑步的最后 mvn清洁包 我犯了这样的错误: [错误]无法执行目标组织。jacoco:jacocomaven插件:0.7。5.201505241946:项目LMS的报告(report):JaCoCo测试报告生成中出现错误。创建报告时出错:无效的文

    • 当使用 生成覆盖率报告后,我的测试在代码覆盖率报告中显示为100%覆盖,如下所示 我尝试将测试移动到它自己的文件夹中,但仍然会得到相同的结果 实际的单元测试不应该出现在覆盖率报告中,并且扭曲了我的覆盖率。它应该只显示实际程序的覆盖范围。

    • 免责声明初学者问题! 为了回答这个问题,我的项目结构高度简化,如下所示: 在阅读了Jeff Knupp关于单元测试的博客文章并写了一系列测试之后,我想看看我的代码现在被测试覆盖了多少。所以我安装了coverage.py,以下内容让我困惑: $coverage运行main。py(显示脚本中的打印/日志) $覆盖报告main.py 姓名、Stmts、小姐、封面 主要的py,114,28,75% 问题是