Подтвердить что ты не робот

Как мне заставить Эмму или Кобертуру, с Maven, сообщать о покрытии исходного кода в других модулях?

У меня есть мультимодульная настройка Maven с кодом Java.

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

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


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

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

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

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

Эта статья на испанском языке может иметь значение. Вот еще статья, специфичная для шва.


4b9b3361

Ответ 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.

Он работает какое-то время.

Удачи!