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

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

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

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

1 Ответ

2 голосов
/ 19 марта 2009

удалось заставить все работать, с помощью старого вопроса 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>

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

...