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

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


person D.Razvan    schedule 15.07.2016    source источник
comment
Добавление в качестве комментария. Я предполагаю, что причина, по которой мое покрытие itest охватывает только модуль itest, заключается в том, что, возможно, они рассматриваются как модульные тесты? Не уверен, как это вступает в игру.   -  person D.Razvan    schedule 15.07.2016
comment
У вас есть какое-нибудь разрешение на это? Серфинг по стеку уже целую вечность...   -  person 4the3eam    schedule 05.02.2019
comment
@ 4the3eam Достаточно взрослый, чтобы точно не помнить, как я заставил его работать. Я действительно считаю, что начал со следующего профиля (объявлю его как ответ) и скомпилировал с -Dsonar.jacoco.itReportPath и -Dsonar.jacoco.reportPath, указывающими на ‹rootDir›/target с использованием абсолютного пути.   -  person D.Razvan    schedule 06.02.2019


Ответы (1)


Используйте следующий профиль в качестве отправной точки и запустите mvn sonar:sonar с параметрами -Dsonar.jacoco.itReportPath и -Dsonar.jacoco.reportPath, указывающими на путь отчетов.

     <profile>
        <id>coverage</id>
        <properties>
            <jacoco.includes>com.trmsys.*</jacoco.includes>
            <jacoco.agent.jar>${project.build.directory}/org.jacoco.agent-${jacoco-maven-plugin.version}-runtime.jar
            </jacoco.agent.jar>
            <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
            <sonar.jacoco.reportPath>${session.executionRootDirectory}/target/jacoco.exec</sonar.jacoco.reportPath>
            <sonar.jacoco.itReportPath>${session.executionRootDirectory}/target/jacoco-it.exec</sonar.jacoco.itReportPath>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>prepare-agent</id>
                            <goals>
                                <goal>prepare-agent</goal>
                            </goals>
                            <configuration>
                                <destFile>${sonar.jacoco.reportPath}</destFile>
                                <propertyName>jacoco.agent.arg</propertyName>
                                <includes>
                                    <include>${jacoco.includes}</include>
                                </includes>
                                <append>true</append>
                            </configuration>
                        </execution>
                        <execution>
                            <id>prepare-agent-integration</id>
                            <goals>
                                <goal>prepare-agent-integration</goal>
                            </goals>
                            <phase>initialize</phase>
                            <configuration>
                                <destFile>${sonar.jacoco.itReportPath}</destFile>
                                <propertyName>jacoco.agent.it.arg</propertyName>
                                <includes>
                                    <include>${jacoco.includes}</include>
                                </includes>
                                <append>true</append>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
            <pluginManagement>
                <plugins>
                    <!-- links jacoco agent to surefire for unit tests -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <configuration>
                            <argLine>${jacoco.agent.arg}</argLine>
                        </configuration>
                    </plugin>
                    <!-- links jacoco agent to failsafe for integration tests -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-failsafe-plugin</artifactId>
                        <configuration>
                            <argLine>${jacoco.agent.it.arg}</argLine>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </profile>
person D.Razvan    schedule 06.02.2019