5
votes

Has any one tried configuring JaCoCo to dump the coverage of unit and integration tests in 2 different files, for SONAR to use them, using ANT build?

1

1 Answers

0
votes

Here is a working solution, generating the report for both unit tests and integration tests. This solution is using the append strategy.

Please note that in order to work properly on the apply strategy, the phases should be executed sequentially (if the mvn test and mvn verify -DskipUnitTests will be executed in parallel there is possible to not work fine).

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>${jacoco.version}</version>

    <configuration>
        <skip>${skipTests}</skip>

        <!-- This line is very important, because allows to append the results to the `jacoco_aggregation.exec` report. -->
        <append>true</append>

        <!-- DestFile is the file defined, where the `prepare-agent` will pe publishing the result of analysis,
             for the defined `phase`. In our case is executed initially and to the `pre-integration-test` phase. -->
        <destFile>${project.build.directory}/coverage-reports/jacoco_aggregation.exec</destFile>

        <!-- DataFile is the path from where the `report` goal will be reading the report
             in order to create the `outputDirectory` .xml file. -->
        <dataFile>${project.build.directory}/coverage-reports/jacoco_aggregation.exec</dataFile>

        <!-- To the goal `report`, will be reading the report from `dataFile` path and will be publishing the result,
             to the `outputDirectory` path as an .xml file.
             In our case, the report is generated for two times:
                 - first time after the `test` phase
                 - second time after the `post-integration-test` phase -->
        <outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory>
    </configuration>

    <executions>
        <!-- Prepares the property pointing to the JaCoCo runtime agent which
             is passed as VM argument when Maven the Surefire plugin is executed. -->
        <execution>
            <id>pre-unit-test</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <!-- Sets the name of the property containing the settings for JaCoCo runtime agent. -->
                <propertyName>surefireArgLine</propertyName>
            </configuration>
        </execution>
        
        <!-- Ensures that the code coverage report `jacoco.xml` is generated once the unit tests were executed.
             Executes the `report` goal after the `post-integration-test` phase. -->
        <execution>
            <id>post-unit-test</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>

        <!-- Prepares the property pointing to the JaCoCo runtime agent which
             is passed as VM argument when Maven the Failsafe plugin is executed. -->
        <execution>
            <id>pre-integration-test</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <!-- Sets the name of the property containing the settings for JaCoCo runtime agent. -->
                <propertyName>failsafeArgLine</propertyName>
            </configuration>
        </execution>
        
        <!-- Ensures that the code coverage report `jacoco.xml` is generated once the integration tests were executed.
             Executes the `report` goal after the `post-integration-test` phase. -->
        <execution>
            <id>post-integration-test</id>
            <phase>post-integration-test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <!-- Sets the VM argument line used when unit tests are run. -->
        <argLine>${surefireArgLine}</argLine>
    </configuration>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <configuration>
        <!-- Sets the VM argument line used when integration tests are run. -->
        <argLine>${failsafeArgLine}</argLine>
    </configuration>
</plugin>

Once the reports are generated, you can execute the sonar commant to apply the reports.

mvn sonar:sonar -Dsonar.coverage.jacoco.xmlReportPaths="target/site/jacoco/jacoco.xml"