Как мне заставить Эмму или Кобертуру, с Maven, сообщать о покрытии исходного кода в других модулях?
У меня есть мультимодульная настройка Maven с кодом Java.
Мои модульные тесты в одном из модулей реализуют код в нескольких модулях. Естественно, модули имеют взаимозависимости, а код во всех соответствующих модулях компилируется по мере необходимости перед выполнением теста.
Итак: как я могу получить отчет о охвате всей базы кода?
Примечание. Я не спрашиваю, как объединить результаты покрытия для тестов в нескольких модулях. Я спрашиваю, как получить покрытие для тестов в одном модуле с помощью инструментального кода из нескольких модулей. Любой, кто интересуется первым, может ссылаться на эти другие questions и рекомендации Crowne для Maven Dashboard и Sonar.
Мне удалось получить полный отчет о покрытии с использованием чистого Ant. [EDIT:] Я измерил все банки из каталога разработки во время выполнения во временный каталог; добавили временную директорию в путь к классам; затем выполнил тесты из Ant с пакетным тестом.
Ant может быть запущен из Maven, но проблема здесь заключается в бесшовной интеграции (то есть, автоматически загружая все элементы classpath и sourcepath из Maven в Ant), поэтому я не использовал средства Maven для этой цели.
Есть также другие вопросы об интеграционных тестах. Тем не менее, по умолчанию каждый отчет по проекту по умолчанию сообщает только о покрытии кода в том же проекте, тогда как мои тесты выполняют код в нескольких проектах.
Эта статья на испанском языке может иметь значение. Вот еще статья, специфичная для шва.
Ответы
Ответ 1
Этот недавний пост в блоге Thomas Sundberg содержит метод, который частично решает проблему, используя ant для вызовов cobertura, вместо использования плагина maven cobertura.
Он опирается на следующий базовый подход со специализированными файлами pom.xml и build.xml:
Начните с типичного компилятора maven на родительском pom, который будет компилировать все классы в дочерних модулях.
mvn clean compile # maven-compile-plugin called for compiling
Затем примените все классы модулей:
ant instrument # cobertura called for instrumentation
Затем вызовите maven-surefire-plugin, вызываемый для тестирования с помощью инструментальных классов, с cobertura в качестве тестовой зависимости
mvn test
Затем используйте собственный вызов отчета, чтобы извлечь все результаты из разных модулей:
ant report # cobertura called for reporting
Ключевыми элементами файла ant build.xml являются инструменты для всех модулей отдельно, а затем для отчета по всем модулям после слияния результатов. Эта функция должна быть вызвана для каждого модуля в его примере:
<target name="instrumentAModule">
<property name="classes.dir" value="target/classes"/>
<cobertura-instrument todir="./${module}/${classes.dir}">
<fileset dir="./${module}/target/classes">
<include name="**/*.class"/>
</fileset>
</cobertura-instrument>
</target>
Затем после завершения тестирования фаза отчетности сначала объединяет все результаты из всех разных каталогов, которые объединяются в новый .ser файл (называемый sum.ser в его примере)
<target name="report" depends="merge">
<property name="src.dir" value="src/main/java/"/>
<cobertura-report datafile="sum.ser"
format="html"
destdir="./target/report">
<!-- Add all modules that should be included below -->
<!-- fileset dir="./MODULE_NAME_TO_REPLACE/${src.dir}"/ -->
<fileset dir="./product/${src.dir}"/>
</cobertura-report>
</target>
<target name="merge">
<cobertura-merge datafile="sum.ser">
<fileset dir=".">
<include name="**/cobertura.ser"/>
</fileset>
</cobertura-merge>
</target>
Возможно, можно интегрировать компоненты ant в maven с помощью antrun-плагина, но я недостаточно хорошо знаком с фазами/жизненными циклами, чтобы знать, куда поместить разные вызовы.
Это очень полезно для меня, поскольку я пишу абстрактные классы тестов в своих модулях api, а затем предоставляю им реализацию в моих модулях lib. До сих пор оба cobertura и emma не могли справиться с этим дизайном, поэтому мой охват кода обычно равен 0 или в одиночных цифрах.
Ответ 2
Никогда не пробовал, но это может быть способ сделать это:
- В каждом модуле, непосредственно перед этапом установки, пусть cobertura измеряет файлы jar и устанавливает инструментальные файлы jar (!) в локальный репозиторий Maven.
- В тестовом модуле Maven будет использовать зависимости артефакта из локального репозитория Maven для запуска тестов. Эти инструментальные классы теперь должны появляться в файле данных, например. cobertura.ser
- Запустите генерацию сообщения cobertura, как обычно, из тестового модуля вашего проекта, например.
mvn site
См. cobertura документацию о том, как вручную вызывать cobertura для управления внешними файлами JAR на месте:
... Вы также можете передать файлы jar, которые будут использоваться с помощью стандартных наборов файлов ant. Cobertura будет извлекать каждый класс из банки и использовать его. Если "todir" не был указан, оригинальная флага будет перезаписана с помощью инструментальной версии...
Плагины сборки pom.xml
могут выглядеть так: вам может понадобиться добавить профиль или использовать классификаторы, чтобы различать последний файл jar и файл с инструментальным банком, если вы не хотите перезаписывать их в своем локальном репо. Затем в модуле тестирования вам просто нужно определить зависимости для других модулей с помощью классификаторов.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>cobertura-inplace-instrumentation</id>
<phase>package</phase>
<configuration>
<tasks>
<taskdef classpathref="maven.plugin.classpath" resource="tasks.properties" />
<cobertura-instrument
datafile="${project.build.directory}/cobertura-nop.ser">
<fileset dir="${project.build.directory}">
<include name="${project.build.finalName}.${project.packaging}" />
</fileset>
</cobertura-instrument>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>net.sourceforge.cobertura</groupId>
<artifactId>cobertura</artifactId>
<version>1.9.4.1</version>
</dependency>
</dependencies>
</plugin>
Ответ 3
Как правило, отчеты относятся к их конкретному модулю, однако они могут быть агрегированы,
два подхода:
Я бы порекомендовал вам попробовать использовать сонар для создания агрегации отчетов.
Смотрите их публичный экземпляр nemo", чтобы увидеть впечатляющие возможности, которые предлагаются.
Ответ 4
Я сомневаюсь, что это было бы возможно, поскольку информация о покрытии получена cobertura/emma путем инструментария скомпилированных классов. Хотя это будет работать для классов в указанном проекте, вряд ли эти инструменты будут инструментальными библиотеками.
Взгляд на использование плагина maven cobertura также не указывает на такую возможность.
Ответ 5
Я нашел это довольно простым (хотя я сделал это некоторое время назад и может быть ржавым с деталями...
Мой основной проект содержит все модули. Я использую Cobertura для измерения своего охвата тестированием. Я использую Hudson как механизм непрерывной интеграции, и у вас есть плагин Cobertura для Hudson.
Он работает какое-то время.
Удачи!