developer tip

병합 된 범위 보고서를 제공하도록 멀티 모듈 Maven + Sonar + JaCoCo를 구성하는 방법은 무엇입니까?

optionbox 2020. 8. 5. 08:10
반응형

병합 된 범위 보고서를 제공하도록 멀티 모듈 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>

destFileSonar가 보고서 파일을 찾을 위치에 보고서 파일을 배치하고 append덮어 쓰지 않고 파일에 추가합니다. 이는 모든 서브 모듈에 대한 모든 JaCoCo 보고서를 동일한 파일에 결합합니다.

Sonar는 각 하위 모듈에 대해 해당 파일을 살펴볼 것입니다. 그것이 위에서 지적한 것이므로 Sonar의 다중 모듈 파일에 대한 단위 테스트 결과를 결합하여 제공합니다.


자주하는 질문

그 때부터 머리 꼭대기에서 나는 질문에 자 코코에 열중했습니다.

시리아, 이라크에 위치한 내 응용 프로그램 서버 (jBoss, Glassfish ..). 통합 테스트를 실행할 때 다중 모듈 적용 범위를 확보 할 수 있습니까? Jenkins와 Sonar도 다른 서버에 있습니다.

예. 당신은 사용할 필요가 jacoco 에이전트를 해당 모드에서 실행 output=tcpserver, jacoco 개미 LIB. 기본적으로 두 jars. 이것은 당신에게 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 빌드를 구성하는 것입니다. 전략은 다음과 같습니다.

  1. ant 대상 jacocoReset호출 하여 이전에 수집 된 모든 데이터를 재설정하십시오.
  2. 테스트를 실행하십시오
  3. 개미 대상 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>

전체 exmple은 여기 에서 찾을 수 있습니다 .


다른 솔루션과 미묘하게 다른 솔루션을 게시하고 기존 답변의 도움을 받아 올바른 하루를 보냈습니다.

멀티 모듈 Maven 프로젝트의 경우 :

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

를 Where WAR프로젝트의 주요 웹 응용 프로그램입니다, LIB1과 2는 추가 모듈입니다 WAR에 따라 달라집니다 및 TEST통합 테스트가 사는 곳이다. TESTTomcat 플러그인이 아닌 내장 Tomcat 인스턴스를 가동 WAR시키고 프로젝트를 실행 하고 일련의 JUnit 테스트를 통해 테스트합니다. WARLIB프로젝트는 모두 자신의 단위 테스트가 있습니다.

이 모든 결과는 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, LIBTEST 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>

참고 : https://stackoverflow.com/questions/13031219/how-to-configure-multi-module-maven-sonar-jacoco-to-give-merged-coverage-rep

반응형