我昨天在StackOverflow和谷歌上下了一天,接近了一些解决方案,但没有任何效果。我希望有人能告诉我这是否可能。
我们有一个多模块Maven项目。我刚刚了解到结构是这样的:
Web Service XYX
+- pom.xml
+- Web Module
+- pom.xml (parent pom is WebService 123)
+- API Module
+- pom.xml (parent pom is API ABC)
+- API Implementation
+- pom.xml (parent pom is API ABC)
我所做的是通过Jenkins从Jacoco到Sonar设置UT和IT代码覆盖率。 UT Coverage正确地发送给Sonar,用于UT组合。
IT覆盖率始终为0%。使用Maven Tomcat插件启动WAR后,我的IT将针对Web模块运行。它应该运行的代码存在于模块API实现中。尽管Sonar生成并分析了jacoco-it.exec
文件,但它始终显示我没有遇到任何代码行。有没有办法真正做到这一点?
顺便说一句 - 我知道可以这样做,因为这篇文章准确地指出了我需要的东西: http://www.sonarqube.org/measure-code-coverage-by-integration-tests-with-sonar/
但是,文章没有提到模块是否被引用到项目中的同一父模块。我假设它确实存在。
答案 0 :(得分:0)
在上下搜索互联网之后,最好的解决方案似乎是为实际将主pom称为父级的IT添加了另一个模块。使用Cargo使用Tomcat Maven模块从IT模块获取并运行WAR。代码覆盖现在包含所有类,而不仅仅是Web模块中的类。
答案 1 :(得分:0)
我怀疑这是因为使用了不同的父母。
在分析覆盖范围时,声纳会根据sonar.jacoco.itReportPath
属性中指定的coverage文件检查每个模块的代码。默认值为target/jacoco-it.exec
。因此,在分析WebModule
时,它会检查WebModule/target/jacoco-it.exec
中的覆盖率信息。
因此,我为我的项目所做的是使用根模块中的中央文件来代替IT覆盖数据。
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.4.201502262128</version>
<executions>
<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}
属性是执行的根,如果运行构建,WebServiceXYZ
就是sonar.jacoco.itReportPath
。如果您的多模块具有多个嵌套级别,这也适用。
现在,您需要指出声纳在分析IT覆盖范围时使用该文件。所以你必须将session.executionRootDirectory
设置为该文件。不幸的是,这不适用于/opt/buildroot/myProject/target/jacoco-it.exec
属性,您必须手动设置文件的绝对路径。我不建议在pom.xml中指定绝对路径,因为此路径特定于您的构建环境。因此,要么在Sonar中设置路径,要么在构建环境中设置System属性。我直接在声纳项目设置(Java&gt; Jacoco)中设置它,例如max-height
。
现在,声纳将检查该文件以进行每个模块的IT覆盖分析。