我有一个项目,我需要在Sonar中报告集成测试(IT)的覆盖范围。我可以使用jacoco maven插件生成覆盖率报告,因此我知道jacoco代理已正确设置,但Sonar无法找到源文件以生成其报告。
项目结构是
- 生成
- 模块1
- 单词数
- IT模块
IT模块没有源它只测试Module1和Module2中的类。我试图使用sonar.sources配置源路径但是声纳仍然无法找到源 - 来自日志
[18:01:37.610] Class not found in SquidIndex: com/module1/Class1
我怀疑拥有一个空的集成测试模块有点不寻常(更多的是系统测试而不是IT),是否可以配置声纳来报告IT覆盖范围?
答案 0 :(得分:1)
我有一个单独的模块,只包含测试类来测试其他模块的集成。那没关系。
分析覆盖范围时,声纳会根据sonar.jacoco.itReportPath
属性中指定的coverage文件检查每个模块的代码。默认值为target/jacoco-it.exec
。因此,在分析Module1
时,会检查Module1/target/jacoco-it.exec
中的覆盖率信息。但是,当IT模块中捕获覆盖数据时,您必须将声纳指向构建和测试IT模块时生成的文件。
因此,我为我的项目所做的是使用单个覆盖数据进行每个模块的单元测试覆盖,并使用中央文件来获取IT覆盖数据。
<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>
${session.executionRootDirectory}
属性是执行的根,就像根模块一样。如果您的多模块具有多个嵌套级别,这也适用。
现在,您需要指出声纳在分析IT覆盖范围时使用该文件。所以你必须将sonar.jacoco.itReportPath
设置为该文件。不幸的是,这不适用于session.executionRootDirectory
属性,您必须手动设置文件的绝对路径。我不建议在pom.xml中指定绝对路径,因为此路径特定于您的构建环境。因此,要么在Sonar中设置路径,要么在构建环境中设置System属性。我直接在声纳项目设置(Java&gt; Jacoco)中设置它,例如/opt/buildroot/myProject/target/jacoco-it.exec
。
现在,声纳将检查该文件以进行每个模块的IT覆盖分析。