удалось заставить все работать, с помощью старого вопроса SO.
Мы начали с этого поста , который предоставил нам пример настройки покрытия с использованием EMMA. Однако оказалось, что нам нужно будет принудительно установить зависимость от EMMA для каждого плагина, для которого мы хотим получить данные покрытия.
Некоторые аналитики Google заставили нас отрывок из этой книги , который довольно адекватно охватывает иерархию загрузчиков классов OSGi. Добавив строку osgi.parentClassloader=app
в config.ini тестируемого приложения, мы можем указать путь к классу в командной строке. Этот classpath должен был включать:
- Затмение
startup.jar
- JAR-файлы Java SDK, используемые приложением
- Баночки для инструмента покрытия
Конечно, мы запускали тесты с помощью задачи <java jar="foo.jar">
Ant, которая автоматически игнорирует любую предоставленную вами информацию о пути к классам и использует только jar. После того, как Эмма работала, мы переключились на 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>
Надеюсь, это поможет кому-то, кто находится в том же месте, где мы были.