クラスの実行データが一致しません + Jacoco 質問する

クラスの実行データが一致しません + Jacoco 質問する

私は使用していますジャココユニットテストのコードカバレッジを見つけるにはしかし、レポートは生成されず、次のエラー シーケンスが表示されます。

[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 を使用しています (jdk 1.8.0_101 を使用してこのエラーを解決しようとしましたが、同じエラーが発生しました)

Eclipse と Oracle JDK のコンパイルではクラス ID が変わる可能性があると述べられています。そのため、Eclipse でいくつかの基本クラスをコンパイルし、jdk + ANT を使用してコード カバレッジを見つけることで、このケースも確認しました。このケースではうまくいきました。コード カバレッジ タスクではコンパイルは行われません。.class ファイルのカバレッジをチェックするだけで済みます。

エラーに記載されているすべてのクラスは、コード カバレッジをテストする前に Eclipse でコンパイルされています。

私はオフライン計測器を使用してみた使用されている永続性フレームワークの回避策としてツールを使用しましたが、それでもこれらのエラーが発生します。上記のエラーで言及されているすべてのクラスは、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.jdk 1.8.0_101 と jdk 1.8.0_111 に基づくコンパイラによって生成されるバイトコードに違いはありますか? 増分更新によってバイトコードが変更されることはありますか? それとも、違いはメジャー バージョンの更新時にのみ顕著になりますか?

2.オフラインインストルメンテーションを実装した後でも、なぜこのエラーが発生するのでしょうか? コード内の宣言が抜けているのでしょうか? コードの形式は、jacoco ドキュメントで提供されている例とできるだけ同じにするように努めました。ここ

  1. また、インストルメントされるクラスの数 (614) と、テスト バンドルに追加されるクラスの数 (566) は、両方に同じクラスパスが含まれている場合に異なることにも気付きました。これは何か影響があるのでしょうか?

ベストアンサー1

jdk 1.8.0_101 と jdk 1.8.0_111 に基づくコンパイラによって生成されるバイトコードに違いはありますか? 増分更新によってバイトコードが変更されることはありますか? それとも、違いはメジャー バージョンの更新時にのみ顕著になりますか?

はい。一般的に、コンパイラの異なるバージョン(例外なし)は、異なるバイトコードを生成する可能性があります。

オフライン インストルメンテーションを実装した後でも、なぜこのエラーが発生するのでしょうか? コード内の宣言が抜けているのでしょうか?

メッセージ自体は、あなたが参照している SO の質問ですでに完全に説明されています。jacoco コード カバレッジ レポート ジェネレーターがエラーを表示: 「バンドル 'コード カバレッジ レポート' 内のクラスが実行データと一致しません」

より正確な答えは最小限の、完了、 そして検証可能例 (https://stackoverflow.com/help/mcve)はあなたから提供されるべきであり、残念ながら私の意見では、build.xmlいくつかのコメントの抜粋だけでは不十分です完了そして検証可能例。また、JDK に加えて Eclipse がここでどのような役割を果たしているかは明確ではありません。ちなみに、Eclipse には独自の Eclipse Java コンパイラがあり、それを使用しています。

また、インストルメントされるクラスの数 (614) と、テスト バンドルに追加されるクラスの数 (566) は、両方に同じクラスパスが含まれている場合に異なることにも気付きました。これは何か影響があるのでしょうか?

はい。結果として、計測されたものは、レポート生成のために分析されたものと同じではありません。これは、不一致に関するメッセージとも相関しています。

おすすめ記事