Как настроить мультимодульный 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>