Как сделать так, чтобы Cobertura / Emma хорошо играли с приложением Eclipse?

StackOverflow https://stackoverflow.com/questions/655979

Вопрос

Моя компания занимается модернизацией нашей системы сборки для использования Buckminster (что прошло хорошо). Естественно, менеджерам бы понравилось, если бы мы могли автоматически генерировать некоторые из метрик, которые они используют для кода, пока мы на нем - одна из этих метрик - покрытие для модульных тестов.

Предыдущая сборка, основанная на PDE, привела к созданию отдельного приложения без заголовка, которое анализирует все плагины в контексте, просматривает внутри них тестовые классы, отбрасывает все тестовые примеры в больший набор и затем запускает его программно, через JUnitResultFormatter.startTestSuite(). В процессе он добавляет несколько собственных тестов для определенных метаданных (маркировка авторских прав и т. Д.) И тесты на зависимость от пакета.

Похоже, я должен иметь возможность просто экспортировать продукт для тестового приложения, оснастить его инструментом по своему выбору, а затем запустить его; однако, похоже, что оба инструмента охвата хотят знать весь путь к классу, с которым они имеют дело. Можно ли сделать так, чтобы любой из этих инструментов работал хорошо, не перебирая всю мою рабочую область сборки для jar и зависимостей?

Это было полезно?

Решение

С помощью старого вопроса SO удалось заставить все работать.

Мы начали с этой записи , который предоставил нам пример настройки покрытия с использованием EMMA. Однако оказалось, что нам нужно будет принудительно установить зависимость от EMMA для каждого плагина, для которого мы хотим получить данные покрытия.

Некоторые криминалисты Google предоставили нам этот отрывок из книги , что достаточно адекватно охватывает иерархию загрузчика классов OSGi. Добавив строку osgi.parentClassloader=app в config.ini тестируемого приложения, мы можем указать путь к классу в командной строке. Этот путь к классу должен был включать:

  • Eclipse's 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>

Надеюсь, это поможет кому-то, кто находится в том же месте, где мы были.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top