Я некоторое время просматривал разные статьи и ответы на stackoverflow, но мне еще предстоит найти рабочее решение для моего случая. Определенно что-то не так с моим пониманием того, как jacoco, maven и sonar объединяются для создания отчетов, поэтому я собираюсь обратиться за помощью.
У меня есть многомодульный проект maven со следующей структурой (немного упрощенной):
root-folder/
├── module1/
│ ├── module1_1/
│ ├── module2_2/
├── module2/
│ ├── module2_1/
│ └── module2_2/
├── module3/
│ ├── module3_1/
│ ├── module3_1_1/
│ └── module3_2/
│ └── module3_3/
│ └── module3_4/
├── parent/
├── itest/
│ ├── itest_helper1/
│ └── itest_helper2/
│ └── actual_tests/
├── module4/
Позвольте мне немного расшириться. Родительский модуль — это просто pom со всеми зависимостями и их версиями. Этот pom используется как родитель для всех остальных модулей уровня 1 (непосредственно под root). Модуль 3
root-folder/
├── module1/
│ ├── module1_1/
│ ├── module2_2/
├── module2/
│ ├── module2_1/
│ └── module2_2/
├── module3/
│ ├── module3_1/
│ ├── module3_1_1/
│ └── module3_2/
│ └── module3_3/
│ └── module3_4/
├── parent/
├── itest/
│ ├── itest_helper1/
│ └── itest_helper2/
│ └── actual_tests/
├── module4/
1, например, имеет родительский модуль3_1/pom, который, в свою очередь, имеет родительский/pom. У меня также есть функциональный модуль, который я исключил, потому что он используется для предоставления модулей другим проектам, которые не будут использоваться в моем случае. Большинство модулей, но не все, имеют модульные тесты с использованием фреймворка junit. Интеграционные тесты находятся в отдельном модуле, в котором есть несколько вспомогательных подмодулей и подмодуль с реальными классами ITests. Мои тесты охватывают код всего проекта, поэтому они проверяют код всех других модулей.
Мой корневой pom также имеет в качестве родителя некоторую внутреннюю структуру, которая в основном представляет собой контейнер osgi, веб-службу и обрабатывает зависимости сторонних производителей.
У меня сонар версии 5.6, и мне не удалось создать отчеты для интеграционных тестов. Я также хочу, чтобы они были объединены, чтобы я мог развернуть и просмотреть тестовое покрытие для каждого модуля/класса. Я пробовал разные варианты и настройки, и в моей последней попытке в моей корневой папке /pom.xml было следующее.
<!-- properties section-->
<properties>
<jacoco.version>0.7.2.201409121644</jacoco.version>
<sonar.language>java</sonar.language>
<sonar.sourceEncoding>UTF-8</sonar.sourceEncoding>
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<jacoco.outputDir>${project.build.directory}</jacoco.outputDir>
<jacoco.out.ut.file>jacoco-ut.exec</jacoco.out.ut.file>
<sonar.jacoco.reportPath>${jacoco.outputDir}/${jacoco.out.ut.file}</sonar.jacoco.reportPath>
<jacoco.out.it.file>jacoco-it.exec</jacoco.out.it.file>
<sonar.jacoco.itReportPath>${jacoco.outputDir}/${jacoco.out.it.file}</sonar.jacoco.itReportPath>
</properties>
<!-- plugins section-->
<profiles>
<profile>
<id>coverage</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>${jacoco.agent.ut.arg}</argLine>
<!-- test failure ignore -->
<testFailureIgnore>true</testFailureIgnore>
<includes>
<include>**/*Test*</include>
</includes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<argLine>-Xmx1024m -XX:MaxPermSize=256m ${jacoco.agent.it.arg}
</argLine>
<!-- Let's put failsafe reports with surefire to have access to tests
failures/success reports in sonar -->
<reportsDirectory>${project.build.directory}/surefire-reports
</reportsDirectory>
<includes>
<include>**/*IT*</include>
</includes>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<executions>
<!-- Prepares a variable, jacoco.agent.ut.arg, that contains the info
to be passed to the JVM hosting the code being tested. -->
<execution>
<id>prepare-ut-agent</id>
<phase>process-test-classes</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${sonar.jacoco.reportPath}</destFile>
<propertyName>jacoco.agent.ut.arg</propertyName>
<append>true</append>
</configuration>
</execution>
<!-- Prepares a variable, jacoco.agent.it.arg, that contains the info
to be passed to the JVM hosting the code being tested. -->
<execution>
<id>prepare-it-agent</id>
<phase>pre-integration-test</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${sonar.jacoco.itReportPath}</destFile>
<propertyName>jacoco.agent.it.arg</propertyName>
<append>true</append>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<!-- Integraton tests -->
<profile>
<id>run-its</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<executions>
<execution>
<id>integration-test</id>
<phase>integration-test</phase>
<goals>
<goal>integration-test</goal>
</goals>
</execution>
<execution>
<id>verify</id>
<phase>verify</phase>
<goals>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Я запускаю свой проект с помощью mvn -Pcoverage, запускаю его чистую установку сонар: сонар. Мои модульные тесты, кажется, в порядке, с полным охватом и вероятностью успеха. Честно говоря, меня интересуют только интеграционные тесты, но юнит-тесты довольно просты в настройке, поэтому я их тоже добавил. Что касается моего отчета по интеграционным тестам, он фактически сообщает о покрытии моего модуля itest, который является единственным, о котором не следует сообщать. Я хочу, чтобы мои тесты сообщали о покрытии всего моего проекта.
Вот часть jacoco из сонара, работающего над моим модулем itest:
[WARNING] You are not using the latest JaCoCo binary format version, please consider upgrading to latest JaCoCo version.
[INFO] Analysing D:\Home\project\root\itest\testcase\target\jacoco-it.exec
[WARNING] You are not using the latest JaCoCo binary format version, please consider upgrading to latest JaCoCo version.
[INFO] Analysing D:\Home\project\root\itest\testcase\target\sonar\jacoco-overall.exec
[INFO] No information about coverage per test.
Кроме того, поскольку моя конфигурация плагина находится в самом корне pom, он пытается анализировать отчеты для всех моих модулей (включая те, у которых нет модульных тестов) и выдает ошибку в журнале запуска сонара, но я предполагаю, что это не ошибка. проблема. Любая помощь очень ценится, пожалуйста, запросите более подробную информацию, если они вам нужны. Спасибо.