class 的执行数据不匹配 + Jacoco

Execution data for class does not match + Jacoco

我正在使用 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.

我已经阅读了这些答案,但 none 似乎帮助我解决了问题。

jacoco code coverage report generator showing error : "Classes in bundle 'Code Coverage Report' do no match with execution data"

我在 Eclipse 上编译了所有 classes,并使用 ANT 构建工具对这些 classes 执行代码覆盖。由于某些依赖关系,我确实使用了一些外部 jar,它们是在 jdk 1.8.0_101 上编译的,我正在使用 jdk 1.8.0_111(我尝试使用 jdk 1.8.0_101 解决此错误,但我遇到了同样的错误)

有人提到 class ID 在 Eclipse 与 Oracle JDK 编译中可能会发生变化。因此,我还通过在 Eclipse 上编译一些基本的 classes 来检查这种情况,并使用 jdk + ANT 来查找代码覆盖率。它在这种情况下有效。代码覆盖任务中没有编译发生。 .class 文件只需要检查覆盖率。

在测试代码覆盖率之前,错误中提到的所有 classes 都已在 eclipse 上编译。

我已经 尝试使用离线检测 工具作为正在使用的持久性框架的解决方法,但它仍然给我这些错误。 上述错误中提到的所有 classes 都存在于 Instrumented classes 文件夹中。 ${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.Will 基于jdk 1.8.0_101 和jdk 1.8.0_111 的编译器生成的字节码有什么不同吗?增量更新可以更改字节码吗?还是仅在主要版本更新期间差异显着?

2.Why 即使在实施离线检测后,我是否仍然收到此错误?我是否遗漏了代码中的任何声明?我试图使代码的格式与 jacoco 文档 here.

中提供的示例的格式相似
  1. 我还注意到,被检测的 classes 的数量 (614) 与添加到测试包中的 classes 的数量 (566) 不同,当两者都包含相同的内容时class路径。这会有什么后果吗?

Will there be any difference in the bytecode generated by compilers based on jdk 1.8.0_101 and jdk 1.8.0_111? Can incremental updates change bytecode? Or is the difference only significant during major version updates?

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

Why am I still getting this error even after offline instrumentation has been implemented? Am I missing out on any declaration in the code?

消息本身已经在您引用的 SO 问题中得到了完美的解释:jacoco code coverage report generator showing error : "Classes in bundle 'Code Coverage Report' do no match with execution data"

更精确的答案需要您提供一个 Minimal、CompleteVerifiable 示例 (https://whosebug.com/help/mcve),不幸的是,在我看来只是 build.xml 的摘录和一些评论并不是 CompleteVerifiable 的例子。并且不清楚 Eclipse 除了 JDK 之外还扮演了哪个角色。顺便说一下,Eclipse 拥有并使用自己的 Eclipse Java 编译器。

I've also noticed that the number of classes being instrumented(614) differs from the number of classes being added to the Test bundle (566) when both contain the same classpaths. Could that be of any consequence?

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

2.Why am I still getting this error even after offline instrumentation has been implemented? Am I missing out on any declaration in the code? I've tried to keep the format of the code as similar to that of the example provided in the jacoco documentation here.

我在测试 class 添加到 PrepareForTest annotation 的测试 class 时注意到了这一点。

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

}