병합 된 범위 보고서를 제공하도록 멀티 모듈 Maven + Sonar + JaCoCo를 구성하는 방법은 무엇입니까?
인터넷을 위아래로 검색했습니다. 메이븐과 같은 속성과는 거기 절반 답변 많이있다 ${sonar.jacoco.reportPath}
, 또는 org.jacoco:jacoco-maven-plugin:prepare-agent
또는 설정 maven-surefire-plugin
argLine
와 함께 -javaagent
.
이 답변들 중 어느 것도 독자적으로 또는 조합하여 내가 뒤 따르는 것을 생산하지 않는 방법 : 커버리지 보고서는 클래스가 사용되는 엔터티와 같이 스택의 상위 테스트에 사용되는 경우 커버 된 것으로 표시합니다. 자체 모듈의 테스트로 완전히 다루지 않았더라도 DAO에 의해.
이것을 달성하기 위해 어딘가에 명확한 구성이 있습니까?
나는 당신과 같은 상황에 있었고, 인터넷 전체에 흩어져있는 반 답변은 많은 성가신 것으로 보였기 때문에 상당히 성가시다. 그러나 아무도 그것을 해결하는 방법을 완전히 설명하기 위해 아무도 귀찮게 할 수 없었다.
소나 문서는 참조 예와 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에게 자체 롤링 대신 수동으로 실행 된 보고서를 재사용하라고 지시합니다. 빌드 / 플러그인 내부의 상위 pom에 배치하여 모든 하위 모듈에 대해 jacoco-maven-plugin을 실행해야합니다.
<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
Sonar가 보고서 파일을 찾을 위치에 보고서 파일을 배치하고 append
덮어 쓰지 않고 파일에 추가합니다. 이는 모든 서브 모듈에 대한 모든 JaCoCo 보고서를 동일한 파일에 결합합니다.
Sonar는 각 하위 모듈에 대해 해당 파일을 살펴볼 것입니다. 그것이 위에서 지적한 것이므로 Sonar의 다중 모듈 파일에 대한 단위 테스트 결과를 결합하여 제공합니다.
자주하는 질문
그 때부터 머리 꼭대기에서 나는 질문에 자 코코에 열중했습니다.
시리아, 이라크에 위치한 내 응용 프로그램 서버 (jBoss, Glassfish ..). 통합 테스트를 실행할 때 다중 모듈 적용 범위를 확보 할 수 있습니까? Jenkins와 Sonar도 다른 서버에 있습니다.
예. 당신은 사용할 필요가 jacoco 에이전트를 해당 모드에서 실행 output=tcpserver
, jacoco 개미 LIB. 기본적으로 두 jar
s. 이것은 당신에게 99 %의 성공을 줄 것입니다.
jacoco 에이전트는 어떻게 작동합니까?
당신은 문자열을 추가
-javaagent:[your_path]/jacocoagent.jar=destfile=/jacoco.exec,output=tcpserver,address=*
애플리케이션 서버 JAVA_OPTS에 연결 한 후 다시 시작하십시오. 이 문자열 [your_path]
에서 jacocoagent.jar의 경로로 바꿔야 만 앱 서버가 실행되는 VM에 저장 (저장!)됩니다. 앱 서버를 시작한 이후로 배포 된 모든 애플리케이션이 동적으로 모니터링되고 tcl 요청으로 jacocos .exec 형식으로 활동할 수 있도록 해당 활동 (코드 사용을 의미)이 준비됩니다.
테스트 시작 시간 이후에만 실행 데이터 수집을 시작하도록 jacoco 에이전트를 재설정 할 수 있습니까?
예, 이러한 목적을 위해서는 jakinsant 작업 공간에 jacocoant.jar 및 ant 빌드 스크립트가 필요합니다.
따라서 기본적으로 http://www.eclemma.org/jacoco/에서 필요한 것은 jenkins 작업 영역에있는 jacocoant.jar이고 내 앱 서버 VM에있는 jacocoagent.jar입니까?
맞습니다.
나는 개미를 사용하고 싶지 않다. 나는 jacoco maven 플러그인이 모든 일을 할 수 있다고 들었다.
Jacoco maven 플러그인은 단위 테스트 데이터와 일부 통합 테스트 데이터를 수집 할 수 있지만 ( Arquillian Jacoco 참조 ) 예를 들어 jenkins의 별도 빌드로 안심 테스트를 유지하고 멀티 모듈 범위를 보여주고 싶다면 maven 플러그인이 어떻게 도움이되는지 보지 못했습니다.
자 코코 에이전트는 정확히 무엇을 생산합니까?
.exec
형식의 커버리지 데이터 만 . 그러면 Sonar가 읽을 수 있습니다.
jacoco는 Java 클래스의 위치를 알아야합니까?
아뇨, 소나는하지만 자 코코는 아닙니다. 당신이 mvn sonar:sonar
수업에 경로를 할 때 재생됩니다.
개미 스크립트는 어떻습니까?
젠킨스 작업 공간에 제시해야합니다. 내 개미 스크립트, 나는 그것을 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>
이 스크립트를 호출 할 때 전달해야하는 두 개의 필수 매개 변수는이를 -Dworkspace=$WORKSPACE
사용 -Djacoco.host=yourappserver.com
하지 않고 jenkins 작업 공간 및 호스트 를 가리 킵니다.http://
또한 jacocoant.jar
$ {workspace} /tools/jacoco/jacocoant.jar에 넣었습니다.
다음에 어떻게해야합니까?
jacocoagent.jar로 앱 서버를 시작 했습니까?
젠킨스 작업 공간에 개미 스크립트와 jacocoant.jar를 넣었습니까?
그렇다면 마지막 단계는 jenkins 빌드를 구성하는 것입니다. 전략은 다음과 같습니다.
- ant 대상
jacocoReset
을 호출 하여 이전에 수집 된 모든 데이터를 재설정하십시오. - 테스트를 실행하십시오
- 개미 대상
jacocoReport
을 호출 하여 보고서 가져 오기
모든 것이 맞으면 it-jacoco.exec
빌드 작업 공간에 표시됩니다.
스크린 샷을보십시오, 나는 또한 dir의 ant
작업 공간에 설치 $WORKSPACE/tools/ant
했지만 jenkins에 설치된 것을 사용할 수 있습니다.
이 보고서를 소나로 푸시하는 방법은 무엇입니까?
Maven sonar:sonar
은 작업을 수행하고 (구성하는 것을 잊지 마십시오) 모든 모듈을 통해 실행되도록 기본 pom.xml을 가리 킵니다. sonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.exec
통합 테스트 보고서의 위치를 소나에게 알려주려면 매개 변수를 사용하십시오 . 새 모듈 클래스를 분석 할 때마다의 범위에 대한 정보를 찾습니다 it-jacoco.exec
.
내`target` 디렉토리에 jacoco.exec가 이미 있습니다.`mvn sonar : sonar`는 무시 / 제거합니다.
기본으로 mvn sonar:sonar
수행 clean
하고 대상 디렉토리를 삭제, 사용 sonar.dynamicAnalysis=reuseReports
을 방지하기 위해.
새로운 방식으로 버전 0.7.7
버전 0.7.7부터 집계 된 보고서를 작성하는 새로운 방법이 있습니다.
필요한 모든 보고서를 수집하는 별도의 '보고서'프로젝트를 작성하십시오 (Aggregator 프로젝트의 모든 목표 는 모듈 전에 실행 되므로 사용할 수 없음).
aggregator pom
|- parent pom
|- module a
|- module b
|- report module
루트 치어 같은 외모 (모듈에서 새 보고서 모듈을 추가하는 것을 잊지 마세요)
<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>
다른 솔루션과 미묘하게 다른 솔루션을 게시하고 기존 답변의 도움을 받아 올바른 하루를 보냈습니다.
멀티 모듈 Maven 프로젝트의 경우 :
ROOT
|--WAR
|--LIB-1
|--LIB-2
|--TEST
를 Where 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>
또한 Petri Kainulainens 블로그 게시물 'JaCoCo Maven 플러그인을 사용한 단위 및 통합 테스트를위한 코드 범위 보고서 작성' 이 JaCoCo 설정 측면에서 유용하다는 것을 알았습니다.
별도의 단위 및 통합 테스트 단계가있는 부모 수준 팟에서 사용하는 구성입니다.
부모 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>
플러그인 정의 아래에 플러그인 정의를 배치합니다.
jacoco가 각 테스트에서 실행되도록 javaagent를 구성 할 수 있도록 surefire (surefireArgLine) 및 failsafe (failsafeArgLine) 인수에 대한 특성을 정의합니다.
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>
이를 달성 할 수있는 방법이 있습니다. 마술은 결합 된 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>
이 프로파일을 부모 폼폼에 추가하고 전화 mvn clean install sonar:sonar -DrunSonar
하면 전체 서비스를받을 수 있습니다.
여기서 마술은 maven.multiModuleProjectDirectory
입니다. 이 폴더는 항상 maven 빌드를 시작한 폴더입니다.
<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>
maven에서 merge 라는 개미 작업을 호출 하여 모든 적용 파일 (* .exec)을 동일한 파일에 함께 넣을 수 있습니다.
단위 테스트를 실행하는 경우 단계 준비 패키지를 사용하고 통합 테스트를 실행하는 경우 post-integration-test를 사용하십시오 .
이 사이트 에는 maven 프로젝트에서 jacoco ant task 호출 방법에 대한 예가 있습니다.
이 병합 된 파일을 소나에서 사용할 수 있습니다.
단위 테스트 및 통합 테스트를 위해 포함 / 제외가 제한된 maven-surefire-plugin 및 maven-failsafe-plugin을 사용할 수 있습니다. 소나 / 자 코코와 연락을하면서 CDI를 가지고 놀고 있었 으므로이 프로젝트에서 끝났습니다.
https://github.com/FibreFoX/cdi-sessionscoped-login/
어쩌면 조금 도움이 될 것입니다. 내 pom.xml에서 지정된 테스트 플러그인의 구성 섹션에서 argLine 옵션을 설정하여 "-javaagent"를 암시 적으로 사용합니다. MAVEN 프로젝트에서 ANT를 명시 적으로 사용하는 것은 두 가지 세계를 많이 혼합하여 시도하지 않는 것입니다.
단일 모듈 maven 프로젝트 만 있지만 작동하도록 조정하는 데 도움이 될 수 있습니다.
참고 : 아마도 모든 maven 플러그인이 최신 버전이 아닐 수도 있습니다. 아마도 일부 문제는 이후 버전에서 수정되었습니다.
이 샘플은 저에게 매우 효과적입니다.
<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>
'developer tip' 카테고리의 다른 글
nullable bool로 변환 하시겠습니까? (0) | 2020.08.06 |
---|---|
Git 무시 디렉토리와 directory / *의 차이점은 무엇입니까? (0) | 2020.08.05 |
Dijkstra의 알고리즘이 음의 가중치 모서리에서 작동하지 않는 이유는 무엇입니까? (0) | 2020.08.05 |
서버가 프로토콜 위반을 커밋했습니다. (0) | 2020.08.05 |
int와 floor로 캐스트 (0) | 2020.08.05 |