古いSOの質問の助けを借りて、すべてを機能させることができました。
EMMA を使用したカバレッジ設定の例を提供するこの投稿から始めました。ただし、カバレッジ データを取得したいすべてのプラグインで、EMMA への依存を強制する必要があるようです。
いくつかの Google フォレンジックは、OSGi クラスローダ階層をかなり適切にカバーするこの本の抜粋にたどり着きました。osgi.parentClassloader=app
テスト実行アプリケーションの config.ini に行を追加することで、コマンドラインでクラスパスを指定できます。そのクラスパスには以下を含める必要がありました:
- エクリプス
startup.jar
- アプリケーションで使用される Java SDK jar
- カバレッジ ツールの jar ファイル
もちろん、<java jar="foo.jar">
Ant タスクを介してテストを実行していました。Ant タスクは、提供されたクラスパス情報を黙って無視し、jar だけを使用します。Emma が動作するようになった後、Cobertura に切り替えました。最終的な Ant スクリプト (少し簡略化され、匿名化されています) は次のようになります。
<target name="generate.coverage" depends="buckminster.init">
<!-- Generate the classpath. -->
<path id="cobertura.classpath">
<fileset dir="${tasks.dir}/lib/cobertura">
<include name="cobertura.jar" />
<include name="**/*.jar" />
</fileset>
</path>
<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />
<!-- Get ready to run the unit tests app, and delete old coverage data. -->
<unzip src="${test-app.artifact}" dest="${output.dir}" overwrite="true" />
<delete file="${output.dir}/cobertura.ser" />
<!-- Instrument the jars in-place. Make sure to only capture what you want instrumented! -->
<cobertura-instrument datafile="${output.dir}/cobertura.ser">
<fileset dir="${output.dir}/test-app/plugins">
<include name="**/*our.company_*.jar" />
</fileset>
</cobertura-instrument>
<!-- Run the unit test application, by classname rather than by jar. -->
<java fork="true" classname="org.eclipse.equinox.launcher.Main" logerror="true" failonerror="true" maxmemory="1G">
<classpath>
<pathelement location="${output.dir}/test-app/startup.jar" />
<pathelement location="${tasks.dir}/lib/cobertura/cobertura.jar" />
<fileset dir="${tasks.dir}/lib/cobertura">
<include name="**/*.jar" />
</fileset>
<pathelement location="${java.class.path}" />
</classpath>
<sysproperty key="net.sourceforge.cobertura.datafile" file="${output.dir}/cobertura.ser" />
<arg value="-data" />
<arg value="${output.dir}/test-app/workspace" />
<arg value="--formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter:${log.dir}/test-results.xml" />
</java>
<!-- Generate the coverage reports. -->
<cobertura-report format="html" datafile="${output.dir}/cobertura.ser" destdir="${output.dir}/cobertura-report">
<fileset dir="${workspace.dir}/plugins">
<include name="**/*.java" />
</fileset>
</cobertura-report>
</target>
うまくいけば、これは私たちがいたのと同じ場所にいる誰かを助ける.