1

Maven 2 から Maven 3 に切り替えた後、cobertura によって報告されたテスト カバレッジが 0% であることがわかりました。どのバージョンの cobertura と Surefire を使用するかについての質問を述べました: cobertura と Surefire プラグインのどのバージョンが maven3 の下で連携しますか?

ただし、問題をより深く調査したところ、どの構成フラグメントが機能していないかがわかりました。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${surefire.plugin.version}</version>
            <configuration>
                <forkMode>never</forkMode>
                <redirectTestOutputToFile>true</redirectTestOutputToFile>
                <argLine>-Xmx512m -XX:MaxPermSize=256m</argLine>
            </configuration>
        </plugin>

forkMode を からneverに変更するとonce、テスト カバレッジが生成され始めました。つまり、問題はプラグインのバージョン非互換性自体ではなく、maven 3 の下で cobertura による Surefire のさまざまなフォーク モードによるサポートの問題でした。

それで、私の質問は、それはバグですか、それとも cobertura プラグインがそのような方法で設計されているため、一部では動作しませんかforkMode=never?

4

1 に答える 1

1

Cobertura は、JVM の終了時にカバレッジ結果を出力するように設計されています。

<forkMode>never</forkMode>テストを実行するために JVM をフォークするのではなく、現在の JVM を再利用するよう Maven に指示します。

この場合、Maven の実行が完了するまでカバレッジ結果が出力されないことがあります。

Maven 2 では、100% 確実ではありませんが、cobertura プラグインによって使用されるフォークされたライフサイクル (邪悪な) がどのように機能したかによって、フォークされたライフサイクルの JVM フォークが発生したか、クラスローダーのアンロードが効果的に同じ結果をもたらしたと思います。

したがって、私の意見では、たまたまカバレッジが機能したのは Maven 2 のバグでした<forkMode>never</forkMode>

注: <forkMode>never</forkMode>他の問題の中でも特に、システム プロパティがクラスローダーごとにスコープされていないため、非常に危険であると考えられています。<forkMode>once</forkMode>が一般的に最適なオプションです (メモリを乱用するテストがない限り - JUnit の一部のバージョンでは、実行の最後にレポートが作成されるまで、すべてのテスト クラス インスタンスがメモリ内に保持されます。そのため、各テスト クラスが重いオブジェクトを保持している場合、GC は使用できなくなります。テストの実行が終了するまでそれらがライブであるため、それらをクリアします。そのような場合、perclass/always forkMode が必要になります)

于 2012-08-14T12:18:18.117 に答える