Объединение сонарных метрик в мультимодульном проекте Maven
Я унаследовал нечетный мульти-модульный проект Maven. Стандартные бизнес-классы и модульные тесты находятся в модуле под названием "код", и у нас есть хорошие простые рабочие сонарные метрики для этого модуля. Второй модуль содержит различные тесты стиля интеграции, которые запускаются на развернутом сервере Glassfish, которые выполняются как модульные тесты в модуле Integ-Test.
pom.xml // root level,
code // business code and unit tests :-)
moduleA
moduleB
integ-test // ;-(
moduleA
moduleB
Я знаю, что самый простой вариант - это перенести классы "Integ-Test" в модуль "Code" и реорганизовать их как реальные интеграционные тесты, но на данный момент это не вариант.
Я нашел способ записать уровень покрытия кода для модуля "Integ-tests", используя цель jacoco: dump, чтобы загрузить jacococ.exec в модули Integ-Test.
Моя структура Maven Pom теперь выглядит так
pom.xml // defined jacoco verify -> report goal
code // business code and unit test
moduleA
target/jacoco.exec - unit test coverage
pom.xml
pom.xml - defines standard jacoco prepare-agent goal
integ-test //
moduleA
target/jacoco.exec - really integration test coverage
pom.xml
pom.xml- defines jacoco dump and merge
Мой текущий подход состоит в том, чтобы объединить все файлы jacococ.exec в модуле "integra-test" и использовать значение "destFile", чтобы сохранить эти данные в модуле "code" в виде файла jacoco-it.exec. Затем стандартная цель sonar: sonar должна взять этот файл и использовать его в качестве покрытия интеграционного теста.
pom.xml
integ-test
moduleA
target/jacoco.exec - really integration test coverage modA
moduleB
target/jacoco.exec - really integration test coverage modB
code
moduleA
moduleB
target/jacoco-it.exec - This should be the merged content of the two files above
pom.xml
Мой корневой уровень pom.xml определяет эту конфигурацию jacoco-maven-plugin
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<configuration>
<append>true</append>
<includes>
<include>com/a/b/c/**</include>
</includes>
</configuration>
<executions>
<execution>
<id>jacoco-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-dump</id>
<phase>pre-integration-test</phase>
<goals>
<goal>dump</goal>
</goals>
</execution>
<execution>
<id>jacoco-merge</id>
<phase>post-integration-test</phase>
<goals>
<goal>merge</goal>
</goals>
<configuration>
<fileSets>
<fileSet implementation="org.apache.maven.shared.model.fileset.FileSet">
<directory>${project.basedir}/integ-test</directory>
<includes>
<include>*.exec</include>
</includes>
</fileSet>
</fileSets>
<destFile>${sonar.jacoco.itReportPath}</destFile>
</configuration>
</execution>
<execution>
<id>jacoco-site</id>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<sonar.jacoco.itReportPath>${project.basedir}/../target/jacoco-it.exec</sonar.jacoco.itReportPath>
Я связал цель jacoco: merge с этапом maven post -gration-test, чтобы убедиться, что слияние происходит после запуска тестов, но файл 'jacoco-it.exec' всегда создается в папке 'Integ-Test',
Какие-либо предложения?
1 ответ
Как насчет указания на destFile в целевой директории главного pom? Просто определите
<configuration>
<append>true</append>
<destFile>${project.basedir}/../target/jacoco-it.exec</destFile>
<propertyName>jacoco.integrationtest.arguments</propertyName>
</configuration>
в подпроектах. Все данные покрытия будут добавлены в файл jacoco-it.exec. Этот файл забирается sonarqube, и вы увидите покрытие как покрытие IT. Вы также можете использовать jacoco.exec в качестве имени файла.