具有不同父母的多模块Maven项目的IT代码覆盖范围

时间:2014-01-07 16:25:14

标签: maven code-coverage sonarqube multi-module

我昨天在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/

但是,文章没有提到模块是否被引用到项目中的同一父模块。我假设它确实存在。

2 个答案:

答案 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覆盖分析。