So lets assume, I have the following setup:
rootModule
+Module1
+Module2
| +SubModule2-1
| +SubModule2-1-1
| +SubModule2-2
+ITModule
+ITModule1
The ITModule contains only integration tests, where ITModule1 is a special scenario, that requires a single module. Module2 consists of nested submodules. There are several examples out there to use a path like ../target/jacoco-it.exec but that's obviously not working if you more than one nesting level.
To know how to solve it, you must understand, how sonar is doing the analysis. When analysing the coverage information sonar checks the code of each module against the coverage file that is specified in the
sonar.jacoco.itReportPath
property which defaults to target/jacoco-it.exec
. So when analyzing Module1
it check for coverage info in Module1/target/jacoco-it.exec
.
But as the coverage data is captured in the ITModule, respectively ITModule1, I have to
point sonar to the file generated in the IT
module.So the best location to gather the coverage data is to the use rootModule, i.e. rootModule/target/jacoco-it.exec and append the results of all IT tests to that file.
I use the following plugin configuration that uses separate files for unit-test coverage (don't forget the append flag otherwise overall coverage will be incorrect) and the central file for IT covergage.
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.7.4.201502262128</version> <executions> <execution> <id>prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> <configuration> <destFile>target/jacoco.exec</destFile> <append>true</append> <propertyName>surefireArgLine</propertyName> </configuration> </execution> <execution> <id>prepare-it-agent</id> <phase>pre-integration-test</phase> <goals> <goal>prepare-agent</goal> </goals> <configuration> <destFile>${session.executionRootDirectory}/target/jacoco-it.exec</destFile> <append>true</append> <propertyName>failsafeArgLine</propertyName> </configuration> </execution> </executions> </plugin>The
${session.executionRootDirectory}
property is the root
of execution, when I build the entire project, it will point to the rootModule. So this is the best path to use, when you have
multi-module with more than one level of nesting.For the analysis, I need to point sonar to use that file when analyzing IT coverage. So I have to set the
sonar.jacoco.itReportPath
to that file. Unfortunately, this does not work with the session.executionRootDirectory
property and I have to set the absolute path to the file manually. I
do not recommend to specify the absolute path in the pom.xml as this
path is specific to the build environment. So either set the path in
Sonar or as System property of your build environment. I set it directly
in the Sonar Project Settings (Java > Jacoco), for example /opt/buildroot/myProject/target/jacoco-it.exec
.
Now sonar will check that file for the IT coverage analysis of each module.
No comments:
Post a Comment