Как заставить Эмму или Кобертуру вместе с Maven сообщать о покрытии исходного кода в других модулях? - PullRequest
12 голосов
/ 18 января 2011

У меня есть многомодульная установка Maven с кодом Java.

Мои модульные тесты в одном из модулей выполняют код в нескольких модулях. Естественно, модули имеют взаимозависимости, и код во всех соответствующих модулях компилируется по мере необходимости перед выполнением теста.

Итак: Как я могу получить отчет об охвате всей кодовой базы?


Примечание: я не спрашиваю, как объединить результаты покрытия для тестов в нескольких модулях. Я спрашиваю, как получить покрытие для тестов в одном модуле, используя инструментальный код из нескольких модулей. Любой, кто интересуется первым, может обратиться к этим прочим вопросам и рекомендациям Кроуна для Maven Dashboard и Sonar .

Мне удалось получить полный отчет о покрытии с использованием чистого Ant . [EDIT:] Я установил все jar-файлы из каталога среды разработки во временный каталог; добавили временный каталог к ​​пути к классам; затем запустил тесты из Ant с пакетным тестом .

Ant можно запускать из Maven, но проблема здесь заключается в бесшовной интеграции (то есть, автоматическая подача всех элементов classpath и sourcepath из Maven в Ant), поэтому я не использовал средства Maven для этой цели.

Есть также другие вопросы об интеграционных тестах. Однако по умолчанию в отчете каждого проекта по умолчанию сообщается только о покрытии кода в том же проекте, в то время как мои тесты выполняют код в нескольких проектах.

Эта статья на испанском может быть актуальной. Вот еще одна Статья о шве .


Ответы [ 5 ]

6 голосов
/ 29 февраля 2012

Это недавнее сообщение в блоге Томаса Сандберга содержит метод, который частично решает проблему с помощью муравья для вызовов 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, вызываемый для тестирования с использованием инструментированных классов, с 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 или одной цифре.

4 голосов
/ 20 января 2011

Никогда не пытался, но это может быть способ сделать это:

  • В каждом модуле, непосредственно перед фазой install , позвольте cobertura инструктировать файлы jar и установитьИнструментированные файлы JAR (!) в локальном репозитории Maven
  • В модуле tests Maven будет использовать зависимости артефактов из локального репозитория Maven для запуска тестов.Эти инструментальные классы должны теперь появиться в файле данных, например, cobertura.ser
  • Запустить генерацию отчета cobertura как обычно из модуля тестов вашего проекта, например, mvn site

См. cobertura документацию о том, как вручную вызывать cobertura для установки на место внешних файлов JAR:

... Вы также можете передать файлы jar для инструментирования с использованием стандартного муравьянаборы файлов.Cobertura будет извлекать каждый класс из банки и оборудовать его.Если 'todir' не был указан, то оригинальный jar будет перезаписан инструментированной версией ...

Плагины сборки pom.xml могут выглядеть так - выВозможно, вы захотите добавить профиль или использовать классификаторы, чтобы различать окончательный файл JAR и файл 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>
2 голосов
/ 19 января 2011

Как правило, отчеты относятся к определенному модулю, однако их можно агрегировать,
два подхода:

Я бы порекомендовал вам попробовать использовать сонар для агрегации отчетов за вас.

См. Их публичный экземпляр " nemo ", чтобы увидеть впечатляющие возможности, которые предлагаются.

0 голосов
/ 19 января 2011

Я нашел это довольно простым (хотя я это делал некоторое время назад, и может быть ржавым с деталями ...

Мой основной проект содержит все модули. Я использую Cobertura для измерения моего тестового покрытия. Я использую Hudson в качестве механизма непрерывной интеграции, и у меня есть плагин Cobertura для Hudson.

Некоторое время он работал с удовольствием.

Удачи!

0 голосов
/ 18 января 2011

Я сомневаюсь, что это возможно, поскольку информация о покрытии получается с помощью cobertura / emma с помощью инструментов скомпилированных классов. Хотя это будет работать для классов в указанном проекте, сомнительно, что эти инструменты будут инструментально зависимыми библиотеками.

Взгляд на использование maven cobertura также, похоже, не указывает на такую ​​возможность.

...