多模块maven项目中的声纳配置,使用tycho进行单元测试,jacoco进行覆盖

时间:2014-11-21 09:27:07

标签: maven sonarqube tycho jacoco

我们正在使用maven进行声纳分析,除了jacoco的代码覆盖率结果外,它运行良好。我们有一个使用tycho-surefire-plugin进行测试的eclipse项目。我没有覆盖argLines属性,因此涉及该行的解决方案可能不合适。

事实:

  • Maven结构结构:
        • 模块1
        • 模块......
        • module n
  • 测试结构:
    • client.admin(eclipse-plugin packaging)
    • client.admin.test.fragment(eclipse-test-plugin packaging)
  • 正确设置和标识的属性
    • sonar.junit.reportsPath
    • sonar.jacoco.reportPath,
    • sonar.jacoco.itReportPath
    • sonar.core.codeCoveragePlugin
    • sonar.language

主要问题是以下属性

  • sonar.test
  • sonar.sources
  • sonar.java.binaries

如client.admin.test.fragment中的Testing结构所示,测试包含在/ src文件夹中,源也位于/ src文件夹中的项目client.admin中。 当我们运行分析时,我们得到以下错误:

  

[警告]未收集覆盖范围信息。也许你忘了包括   将信息调试到编译的类中?

我认为这与属性sonar.java.binaries有关,它寻找片段项目(client.admin.project)的目标/类中的源,这些源实际上位于宿主项目(客户端)中。管理员)。在片段项目中,我们配置了sonar.tests和sonar.sources属性,以便它们调用相应项目的/ src文件夹。

在声纳Analysis Parameters页面中,只有sonar.sources是maven有效属性,sonar.tests和sonar.java.binaries显然不能在maven中配置。那怎么可以将二进制文件附加到项目中。我尝试从主机项目中复制文件夹目标/类,但我得到了相同的消息。 maven 中有解决方法吗?

编辑1

可以在父文件夹中找到为整个项目生成的一个jacoco.exec文件。这已完成配置 jacoco.destFile sonar.jacoco.reportPath 属性

主要广告中的Jacoco插件:

<!-- Jacoco Plugin -->
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <destFile>${sonar.jacoco.reportPath}</destFile>
                <append>true</append>
            </configuration>
        </execution>
        <execution>
            <id>default-report</id>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <dataFile>${sonar.jacoco.reportPath}</dataFile>
                <outputDirectory>${jacoco.reports.outputDirectory}</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

Maven插件版本:

  • 声纳:2.4
  • jacoco:0.7.1.201405082137

属性

<sonar.language>java</sonar.language>
<sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
<sonar.junit.reportsPath>${project.build.directory}/surefire-reports/</sonar.junit.reportsPath>
<sonar.jacoco.reportPath>${basedir}/../../../main/**.master/target/jacoco.exec</sonar.jacoco.reportPath>
<jacoco.reports.outputDirectory>${basedir}/../../../main/**.master/target/site/jacoco</jacoco.reports.outputDirectory>
<sonar.sources>src</sonar.sources>

在测试项目(eclipse-test-plugin)中,我们更改了添加属性 sonar.sources ,以便从我们正在测试的项目的src文件夹中查找源代码,例如在client.admin.test.fragment中,我们从client.admin中搜索 src

以下属性在代码中被注释,因为根据文档和调试输出,它们在maven中不受支持。

<!--<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>-->
<!--<sonar.tests></sonar.tests>-->
<!--<sonar.java.binaries></sonar.java.binaries>-->

1 个答案:

答案 0 :(得分:1)

首先,您必须告诉JaCoCo代理将所有覆盖数据报告到一个公共文件中。其次,您告诉Sonar JaCoCo插件从聚合文件中读取覆盖率数据。

为此,请设置属性&#34; jacoco.destFile &#34;和&#34; sonar.jacoco.reportPath &#34;在您的父pom.xml中使用相同的绝对路径,例如:

<properties>
    <jacoco.destFile>/home/jenkins/jobs/my.project/workspace/parent/target/jacoco.exec</jacoco.destFile>
    <sonar.jacoco.reportPath>/home/jenkins/jobs/my.project/workspace/parent/target/jacoco.exec</sonar.jacoco.reportPath>
</properties>

请注意,这些属性将继承到所有子poms,因此您无法使用$ {project.build.directory}之类的Maven表达式,因为这将评估每个pom的不同目录。

您可以创建一个小帮助器Mojo,它可以自动解析当前构建计算机上的绝对路径,然后将属性注入Maven模型。