Как настроить мультимодульный Maven + Sonar + JaCoCo для предоставления объединенного отчета о покрытии?

Я искал вверх и вниз по интернету для этого. Там много полу ответов, чтобы использовать свойства Maven, такие как ${sonar.jacoco.reportPath} или org.jacoco:jacoco-maven-plugin:prepare-agent, или установить maven-surefire-plugin argLine с помощью -javaagent.

Некоторые из них, ни один из этих ответов, ни самостоятельно, ни в сочетании, не производят то, что мне нужно: Отчет о покрытии, который показывает класс, который рассматривается, если он используется в тестах выше стека, таких как сущности, используемые DAO, хотя он не был полностью охвачен тестами в своем собственном модуле.

Есть ли какая-то определенная конфигурация, чтобы достичь этого, пожалуйста?

Ответ 1

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

Документация Sonar ссылается на проект GitHub с полезными примерами. Чтобы решить эту проблему, я применил логику интеграционных тестов к обычным модульным тестам (хотя надлежащие модульные тесты должны зависеть от подмодуля, это не всегда так).

В родительском pom.xml добавьте эти свойства:

<properties>
    <!-- Sonar -->
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
    <sonar.language>java</sonar.language>
</properties>

Это заставит Sonar собирать отчеты о модульном тестировании для всех подмодулей в одном месте (целевая папка в родительском проекте). Это также говорит Sonar, чтобы повторно использовать отчеты, запущенные вручную, вместо того, чтобы катиться самостоятельно Нам просто нужно запустить jacoco-maven-plugin для всех подмодулей, поместив его в родительский pom внутри build/plugins:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.0.201210061924</version>
    <configuration>
        <destFile>${sonar.jacoco.reportPath}</destFile>
        <append>true</append>
    </configuration>
    <executions>
        <execution>
            <id>agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
    </executions>
</plugin>

destFile помещает файл отчета в место, где Сонар будет его искать, и append добавляет его к файлу, а не перезаписывает его. Это объединит все отчеты JaCoCo для всех подмодулей в одном файле.

Сонар рассмотрит этот файл для каждого подмодуля, начиная с того, на что мы указали его выше, что даст нам объединенные результаты модульного тестирования для файлов с несколькими модулями в Сонаре.

Ответ 2

Справка

Вопросы с верхней части головы с того времени я сошел с ума от jacoco.

Мой сервер приложений (jBoss, Glassfish..), расположенный в Ираке, Сирия, что бы там ни было. Возможно ли получить многомодульное покрытие при выполнении интеграционных тестов? Дженкинс и Сонар также находятся на разных серверах.

Да. Вы должны использовать jacoco agent, который работает в режиме output=tcpserver, jacoco ant lib. В основном два jar s. Это даст вам 99% успеха.

Как работает jacoco-агент?

Вы добавляете строку

-javaagent:[your_path]/jacocoagent.jar=destfile=/jacoco.exec,output=tcpserver,address=*

на ваш сервер приложений JAVA_OPTS и перезагрузите его. В этой строке только [your_path] необходимо заменить на путь к jacocoagent.jar, сохранить (сохранить его!) На вашей виртуальной машине, где запущен сервер приложений. Начиная с этого момента вы запускаете сервер приложений, все приложения, которые будут развернуты, будут динамически контролироваться, и их активность (смысл использования кода) будет готова для вас в формате jacocos.exec по запросу tcl.

Может ли я reset агент jacoco начать сбор данных выполнения только с момента запуска теста?

Да, для этой цели вам нужны jacocoant.jar и ant build script, расположенные в рабочем пространстве jenkins.

Итак, в основном то, что мне нужно от http://www.eclemma.org/jacoco/, это jacocoant.jar, расположенный в моей рабочей области jenkins, и jacocoagent.jar, расположенный на моем сервере приложений VM?

Это правильно.

Я не хочу использовать ant, я слышал, что плагин jacoco maven тоже может делать все.

Неправильно, плагин jacoco maven может собирать данные unit test и некоторые данные интеграционных тестов (см. Arquillian Jacoco), но если у вас есть например, сохранять завершенные тесты как разделенные сборки в jenkins, и хотите показать многомодульное покрытие, я не вижу, как может помочь плагин maven.

Что именно производит агент jacoco?

Только данные покрытия в формате .exec. Затем сонар может прочитать его.

Нужно ли jacoco знать, где находятся мои классы java?

Нет, сонар делает, но не jacoco. Когда вы делаете mvn sonar:sonar, путь к классам вступает в игру.

Итак, как насчет ant script?

Он должен быть представлен в рабочем пространстве jenkins. Mine ant script, я назвал его jacoco.xml выглядит так:

<project name="Jacoco library to collect code coverage remotely" xmlns:jacoco="antlib:org.jacoco.ant">
    <property name="jacoco.port" value="6300"/>
    <property name="jacocoReportFile" location="${workspace}/it-jacoco.exec"/>

    <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
        <classpath path="${workspace}/tools/jacoco/jacocoant.jar"/>
    </taskdef>

    <target name="jacocoReport">
            <jacoco:dump address="${jacoco.host}" port="${jacoco.port}" dump="true" reset="true" destfile="${jacocoReportFile}" append="false"/>
    </target>

    <target name="jacocoReset">
            <jacoco:dump address="${jacoco.host}" port="${jacoco.port}" reset="true" destfile="${jacocoReportFile}" append="false"/>
        <delete file="${jacocoReportFile}"/>
    </target>
</project>

Два обязательных параметра, которые вы должны передать при вызове script -Dworkspace=$WORKSPACE используйте его, чтобы указать на рабочее пространство jenkins и -Djacoco.host=yourappserver.com хост без http://

Также обратите внимание, что я поместил свой jacocoant.jar в ${workspace}/tools/jacoco/jacocoant.jar

Что мне делать дальше?

Вы запустили свой сервер приложений с помощью jacocoagent.jar?

Вы помещали ant script и jacocoant.jar в рабочее пространство jenkins?

Если да, последний шаг - настроить сборку jenkins. Вот стратегия:

  • Вызвать ant target jacocoReset в reset все ранее собранные данные.
  • Запустите тесты
  • Вызов ant target jacocoReport для получения отчета

Если все правильно, вы увидите it-jacoco.exec в рабочей области сборки.

Посмотрите на скриншот, у меня также есть ant, установленный в моей рабочей области в директории $WORKSPACE/tools/ant, но вы можете использовать тот, который установлен в ваших jenkins.

enter image description here

Как переместить этот отчет в сонар?

Maven sonar:sonar выполнит задание (не забудьте его настроить), укажите его на главный pom.xml, чтобы он выполнялся через все модули. Используйте параметр sonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.exec, чтобы сообщить сонар, где находится ваш отчет об интеграции. Каждый раз, когда он будет анализировать новые классы модулей, он будет искать информацию о покрытии в it-jacoco.exec.

У меня уже есть jacoco.exec в моем `target` каталоге,` mvn sonar: sonar` игнорирует/удаляет его

По умолчанию mvn sonar:sonar выполняет clean и удаляет ваш целевой каталог, используйте sonar.dynamicAnalysis=reuseReports, чтобы избежать его.

Ответ 3

НОВЫЙ ПУТЬ С ВЕРСИИ 0.7.7

Начиная с версии 0.7.7 появился новый способ создания агрегированного отчета:

Вы создаете отдельный проект "отчет", который собирает все необходимые отчеты (любая цель в проекте агрегатора выполняется до его модулей, поэтому его нельзя использовать).

aggregator pom
  |- parent pom
  |- module a
  |- module b
  |- report module 

root pom выглядит следующим образом (не забудьте добавить новый модуль отчета в модули):

<build>
<plugins>
  <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.8</version>
    <executions>
      <execution>
        <id>prepare-agent</id>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

Помы из каждого дополнительного модуля вообще не нужно менять. Pom из модуля отчета выглядит следующим образом:

<!-- Add all sub modules as dependencies here -->
<dependencies>
  <dependency>
    <module a>
  </dependency>
  <dependency>
    <module b>
  </dependency>
 ...

  <build>
    <plugins>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.7.8</version>
        <executions>
          <execution>
            <id>report-aggregate</id>
            <phase>verify</phase>
            <goals>
              <goal>report-aggregate</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Здесь можно найти полную .

Ответ 4

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

Для многомодульного проекта Maven:

ROOT
|--WAR
|--LIB-1
|--LIB-2
|--TEST

Если проект WAR является основным веб-приложением, LIB 1 и 2 являются дополнительными модулями, от которых зависит WAR, а TEST - это место, где находятся интеграционные тесты. TEST раскручивает встроенный экземпляр Tomcat (не через плагин Tomcat) и запускает проект WAR и тестирует их с помощью набора тестов JUnit. Проекты WAR и LIB имеют свои собственные модульные тесты.

Результатом всего этого является разделение покрытия интеграции и модульных тестов, которое можно различить в SonarQube.

ROOT pom.xml

<!-- Sonar properties-->
<sonar.jacoco.itReportPath>${project.basedir}/../target/jacoco-it.exec</sonar.jacoco.itReportPath>
<sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
<sonar.language>java</sonar.language>
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>

<!-- build/plugins (not build/pluginManagement/plugins!) -->
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.6.201602180812</version>
    <executions>
        <execution>
            <id>agent-for-ut</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <append>true</append>
                <destFile>${sonar.jacoco.reportPath}</destFile>
            </configuration>
        </execution>
        <execution>
            <id>agent-for-it</id>
            <goals>
                <goal>prepare-agent-integration</goal>
            </goals>
            <configuration>
                <append>true</append>
                <destFile>${sonar.jacoco.itReportPath}</destFile>
            </configuration>
        </execution>
    </executions>
</plugin>

WAR, LIB и TEST pom.xml наследуют выполнение плагинов JaCoCo.

TEST pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
            <configuration>
                <skipTests>${skip.tests}</skipTests>
                <argLine>${argLine} -Duser.timezone=UTC -Xms256m -Xmx256m</argLine>
                <includes>
                    <includes>**/*Test*</includes>
                </includes>
            </configuration>
        </execution>
    </executions>
</plugin>

Я также обнаружил, что сообщение в блоге Петри Кайнулайненса "Создание отчетов о покрытии кода для модульных и интеграционных тестов с помощью плагина JaCoCo Maven" является ценным для стороны установки JaCoCo.

Ответ 5

Конфигурация, которую я использую в моем родительском уровне, где у меня есть отдельные этапы тестирования и интеграции.

Я настраиваю следующие свойства в родительском POM Свойства

    <maven.surefire.report.plugin>2.19.1</maven.surefire.report.plugin>
    <jacoco.plugin.version>0.7.6.201602180812</jacoco.plugin.version>
    <jacoco.check.lineRatio>0.52</jacoco.check.lineRatio>
    <jacoco.check.branchRatio>0.40</jacoco.check.branchRatio>
    <jacoco.check.complexityMax>15</jacoco.check.complexityMax>
    <jacoco.skip>false</jacoco.skip>
    <jacoco.excludePattern/>
    <jacoco.destfile>${project.basedir}/../target/coverage-reports/jacoco.exec</jacoco.destfile>

    <sonar.language>java</sonar.language>
    <sonar.exclusions>**/generated-sources/**/*</sonar.exclusions>
    <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
    <sonar.coverage.exclusions>${jacoco.excludePattern}</sonar.coverage.exclusions>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.jacoco.reportPath>${project.basedir}/../target/coverage-reports</sonar.jacoco.reportPath>

    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
    <skip.failsafe.tests>${skipTests}</skip.failsafe.tests>

Я размещаю определения плагина под управлением плагина.

Обратите внимание, что я определяю свойство для аргументов surefire (surefireArgLine) и failafe (failafeArgLine), чтобы позволить jacoco настраивать javaagent для запуска с каждым тестом.

В разделе pluginManagement

  <build>
     <pluginManagment>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <fork>true</fork>
                    <meminitial>1024m</meminitial>
                    <maxmem>1024m</maxmem>
                    <compilerArgument>-g</compilerArgument>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version>
                <configuration>
                    <forkCount>4</forkCount>
                    <reuseForks>false</reuseForks>
                    <argLine>-Xmx2048m ${surefireArgLine}</argLine>
                    <includes>
                        <include>**/*Test.java</include>
                    </includes>
                    <excludes>
                        <exclude>**/*IT.java</exclude>
                    </excludes>
                    <skip>${skip.surefire.tests}</skip>
                </configuration>
            </plugin>
            <plugin>
                <!-- For integration test separation -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.19.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>2.19.1</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <forkCount>4</forkCount>
                    <reuseForks>false</reuseForks>
                    <argLine>${failsafeArgLine}</argLine>
                    <includes>
                        <include>**/*IT.java</include>
                    </includes>
                    <skip>${skip.failsafe.tests}</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>integration-test</id>
                        <goals>
                            <goal>integration-test</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>verify</id>
                        <goals>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <!-- Code Coverage -->
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>${jacoco.plugin.version}</version>
                <configuration>
                    <haltOnFailure>true</haltOnFailure>
                    <excludes>
                        <exclude>**/*.mar</exclude>
                        <exclude>${jacoco.excludePattern}</exclude>
                    </excludes>
                    <rules>
                        <rule>
                            <element>BUNDLE</element>
                            <limits>
                                <limit>
                                    <counter>LINE</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>${jacoco.check.lineRatio}</minimum>
                                </limit>
                                <limit>
                                    <counter>BRANCH</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>${jacoco.check.branchRatio}</minimum>
                                </limit>
                            </limits>
                        </rule>
                        <rule>
                            <element>METHOD</element>
                            <limits>
                                <limit>
                                    <counter>COMPLEXITY</counter>
                                    <value>TOTALCOUNT</value>
                                    <maximum>${jacoco.check.complexityMax}</maximum>
                                </limit>
                            </limits>
                        </rule>
                    </rules>
                </configuration>
                <executions>
                    <execution>
                        <id>pre-unit-test</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <destFile>${jacoco.destfile}</destFile>
                            <append>true</append>
                            <propertyName>surefireArgLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>post-unit-test</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <configuration>
                            <dataFile>${jacoco.destfile}</dataFile>
                            <outputDirectory>${sonar.jacoco.reportPath}</outputDirectory>
                            <skip>${skip.surefire.tests}</skip>
                        </configuration>
                    </execution>
                    <execution>
                        <id>pre-integration-test</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>prepare-agent-integration</goal>
                        </goals>
                        <configuration>
                            <destFile>${jacoco.destfile}</destFile>
                            <append>true</append>
                            <propertyName>failsafeArgLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>post-integration-test</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>report-integration</goal>
                        </goals>
                        <configuration>
                            <dataFile>${jacoco.destfile}</dataFile>
                            <outputDirectory>${sonar.jacoco.reportPath}</outputDirectory>
                            <skip>${skip.failsafe.tests}</skip>
                        </configuration>
                    </execution>
                    <!-- Disabled until such time as code quality stops this tripping
                    <execution>
                        <id>default-check</id>
                        <goals>
                            <goal>check</goal>
                        </goals>
                        <configuration>
                            <dataFile>${jacoco.destfile}</dataFile>
                        </configuration>
                    </execution>
                    -->
                </executions>
            </plugin>
            ...

И в разделе сборки

 <build>
     <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
        </plugin>

        <plugin>
            <!-- for unit test execution -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>
        <plugin>
            <!-- For integration test separation -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
        </plugin>
        <plugin>
            <!-- For code coverage -->
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
        </plugin>
        ....

И в разделе отчета

    <reporting>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-report-plugin</artifactId>
            <version>${maven.surefire.report.plugin}</version>
            <configuration>
                <showSuccess>false</showSuccess>
                <alwaysGenerateFailsafeReport>true</alwaysGenerateFailsafeReport>
                <alwaysGenerateSurefireReport>true</alwaysGenerateSurefireReport>
                <aggregate>true</aggregate>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco.plugin.version}</version>
            <configuration>
                <excludes>
                    <exclude>**/*.mar</exclude>
                    <exclude>${jacoco.excludePattern}</exclude>
                </excludes>
            </configuration>
        </plugin>
     </plugins>
  </reporting>

Ответ 6

Есть способ сделать это. Магия - создать объединенный файл jacoco.exec. И с maven 3.3.1 есть простой способ получить это. Вот мой профайл:

<profile>
    <id>runSonar</id>
    <activation>
        <property>
            <name>runSonar</name>
            <value>true</value>
        </property>
    </activation>
    <properties>
        <sonar.language>java</sonar.language>
        <sonar.host.url>http://sonar.url</sonar.host.url>
        <sonar.login>tokenX</sonar.login>
        <sonar.jacoco.reportMissing.force.zero>true</sonar.jacoco.reportMissing.force.zero>
        <sonar.jacoco.reportPath>${jacoco.destFile}</sonar.jacoco.reportPath>
        <jacoco.destFile>${maven.multiModuleProjectDirectory}/target/jacoco_analysis/jacoco.exec</jacoco.destFile>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <append>true</append>
                            <destFile>${jacoco.destFile}</destFile>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.sonarsource.scanner.maven</groupId>
                    <artifactId>sonar-maven-plugin</artifactId>
                    <version>3.2</version>
                </plugin>
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <version>0.7.8</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</profile>

Если вы добавите этот профиль в родительский pom и вызовите mvn clean install sonar:sonar -DrunSonar, вы получите полный охват.

Магия здесь maven.multiModuleProjectDirectory. Эта папка всегда является папкой, в которой вы запустили сборку maven.

Ответ 7

    <sonar.language>java</sonar.language>
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <sonar.jacoco.reportPath>${user.dir}/target/jacoco.exec</sonar.jacoco.reportPath>
    <sonar.jacoco.itReportPath>${user.dir}/target/jacoco-it.exec</sonar.jacoco.itReportPath>
    <sonar.exclusions>
        file:**/target/generated-sources/**,
        file:**/target/generated-test-sources/**,
        file:**/target/test-classes/**,
        file:**/model/*.java,
        file:**/*Config.java,
        file:**/*App.java
    </sonar.exclusions>

            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.9</version>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <destFile>${sonar.jacoco.reportPath}</destFile>
                            <append>true</append>
                            <propertyName>surefire.argLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>default-prepare-agent-integration</id>
                        <goals>
                            <goal>prepare-agent-integration</goal>
                        </goals>
                        <configuration>
                            <destFile>${sonar.jacoco.itReportPath}</destFile>
                            <append>true</append>
                            <propertyName>failsafe.argLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>default-report</id>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>default-report-integration</id>
                        <goals>
                            <goal>report-integration</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>             

Ответ 8

Вы можете вызвать задачу ant с именем merge на maven, чтобы поместить все файлы покрытия (*. exec) вместе в том же файле.

Если вы запускаете модульные тесты, используйте фазу подготовить-пакет, если вы запустите интеграционный тест, используйте пост-интеграционный тест.

На этом сайте показан пример вызова задачи jacoco ant в проекте maven

Вы можете использовать этот объединенный файл на гидролокаторе.

Ответ 9

для модульного тестирования и тестирования интеграции вы можете использовать maven-surefire-plugin и maven-отказоустойчивый плагин с ограниченным включением/исключением. Я играл с CDI, когда я касался сонара/джакоко, поэтому я оказался в этом проекте:

https://github.com/FibreFoX/cdi-sessionscoped-login/

Может быть, это поможет вам немного. в моем pom.xml я использую "-javaagent" неявно, установив параметр argLine в разделе конфигурации указанных тестовых плагинов. Явное использование ANT в проектах MAVEN - это то, что я бы не попробовал, для меня он много смешивал два мира.

У меня только одномодовый проект maven, но, возможно, он поможет вам настроить вашу работу.

Примечание: возможно, не все maven-плагины - up2date, возможно, некоторые проблемы исправлены в более поздних версиях

Ответ 10

Этот пример очень хорошо работает для меня:

<plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.2</version>
            <executions>
                <execution>
                    <id>pre-unit-test</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                    <configuration>
                        <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
                        <propertyName>surefireArgLine</propertyName>
                    </configuration>
                </execution>
                <execution>
                    <id>pre-integration-test</id>
                    <goals>
                        <goal>prepare-agent-integration</goal>
                    </goals>
                    <configuration>
                        <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile>
                        <!--<excludes>
                            <exclude>com.asimio.demo.rest</exclude>
                            <exclude>com.asimio.demo.service</exclude>
                        </excludes>-->
                        <propertyName>testArgLine</propertyName>
                    </configuration>
                </execution>
                <execution>
                    <id>post-integration-test</id>
                    <phase>post-integration-test</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>
                        <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
                    </configuration>
                </execution>
                <execution>
                    <id>post-unit-test</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
                        <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
                    </configuration>
                </execution>
                <execution>
                    <id>merge-results</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>merge</goal>
                    </goals>
                    <configuration>
                        <fileSets>
                            <fileSet>
                                <directory>${project.build.directory}/coverage-reports</directory>
                                <includes>
                                    <include>*.exec</include>
                                </includes>
                            </fileSet>
                        </fileSets>
                        <destFile>${project.build.directory}/coverage-reports/aggregate.exec</destFile>
                    </configuration>
                </execution>
                <execution>
                    <id>post-merge-report</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <dataFile>${project.build.directory}/coverage-reports/aggregate.exec</dataFile>
                        <outputDirectory>${project.reporting.outputDirectory}/jacoco-aggregate</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <configuration>
                <argLine>${surefireArgLine}</argLine>
                <!--<skipTests>${skip.unit.tests}</skipTests>-->
                <includes>
                    <include>**/*Test.java</include>
                    <!--<include>**/*MT.java</include>
                    <include>**/*Test.java</include>-->
                </includes>
            <!--    <skipTests>${skipUTMTs}</skipTests>-->
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.12.4</version>
            <configuration>
                <!--<skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>-->
                <argLine>${testArgLine}</argLine>
                <includes>
                    <include>**/*IT.java</include>
                </includes>
                <!--<excludes>
                    <exclude>**/*UT*.java</exclude>
                </excludes>-->
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>