SonarQube不接受外部生成的JaCoCo IT报告报告

时间:2014-08-01 06:28:16

标签: java maven functional-testing sonarqube jacoco

至少可以说,我尝试解决这个问题一直很费劲,而且我已经浏览了我在网上找到的每一份支持文件。我会正确的。我们正在运行黑盒测试......很多黑盒测试......从它们生成代码覆盖的唯一方法是将JaCoCo代理以旧式的方式传递给JVM。

我们没有使用故障安全来运行这些测试,而是使用内部套件。这是一个多模块maven项目,这意味着这个JaCoCo exec文件是在groupId / artifactId层次结构中生成的:

  • / COM / myCompany的/ artifact1 /...
  • / COM / myCompany的/ artifact2 /...

等等。

但是,项目中继线显然不符合这种结构。从像这样的exec文件手动生成HTML报告有点棘手(因为你只能将它提供给一个源目录,并且它希望在根目录中看到一个“com”文件夹)但是它非常合理,非常可能,已经完成了。

然而,当我们使用参数

触发声纳分析时
-Dsonar.itReportPath=/opt/jacoco/it-report.exec -Dsonar.dynamicAnalysis=reuseReports
Sonar JaCoCo插件令人失望:

[INFO] [21:34:28.406] Sensor JaCoCoItSensor...
[INFO] [21:34:28.406] Project coverage is set to 0% as no JaCoCo execution data has been dumped: /opt/jacoco/it-report.exec
[INFO] [21:34:28.444] No information about coverage per test.

现在这些理论很疯狂,但我想在此之前尝试另一个不幸事件,因为我们的构建过程有一百个移动部件,并且无缘无故地重新配置它会浪费很多很多工时。

这令人沮丧的原因是因为我发现在Sonar中处理IT覆盖的几乎所有解决方案似乎遵循相同的blasé公式:

  1. 将JaCoCo代理附加到JVM
  2. 定义指向报告的sonar.jacoco.itReportPath属性
  3. 按下按钮
  4. 享受IT覆盖
  5. 我们正在使用SonarQube 3.6.1,我们将尽快尝试升级到4.5。这是第一步。与此同时,任何人都知道这笔交易是什么,为什么Sonar不会重复使用这份报告?目录层次结构是否很重要?找到嵌套在文件树中的groupID文件夹并不难。这是一个可以通过升级到4.5来解决的问题吗?

    我这里几乎没气了,我很感激能得到的任何东西。

    编辑1:尝试从代理商分析中将第三方罐子列入黑名单。这将是一个痛苦。我不确定JaCoCo代理-include标志是否会自动排除该范围之外的任何内容,但是可能更容易将自己的功能构建到JaCoCo中,而不是通过挖掘那么多的第三方groupId并将它们全部列入黑名单(然后必须保持这一切。)

    我很好的感觉,当SonarQube看到第三方报道时,它会拒绝exec文件。

    编辑2:成功将JaCoCo分析列入黑名单的第三方课程。

    [INFO] [10:34:05.347] Sensor JaCoCoItSensor...
    [INFO] [10:34:05.352] Project coverage is set to 0% as no JaCoCo execution data has been dumped: /opt/jacoco/it-report.exec
    [INFO] [10:34:06.179] No information about coverage per test.
    

    不。

1 个答案:

答案 0 :(得分:1)

由于我使用maven surefire来执行jacoco,我无法提供很好的解释,但是当我

时,我确实设法使其适用于多模块项目
  1. 将jacoco junit听众添加到surefire和
  2. 确保将报告写入单个位置,并且每次运行都会附加 它。
  3. 我在想第二部分对你有用(即将结果附加到一个地方)

    如果您需要灵感,请在下面找到我使用的个人资料。

      <profile>
      <!-- ========================================================================= -->
      <!-- Use shared code coverage report in sonarQube -->
      <!-- This profile enables cross project coverage reports, -->
      <!-- ========================================================================= -->
      <id>sonar-jacoco-analysis</id>
      <properties>
        <!-- Sonar -->
        <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
        <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
        <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
        <sonar.language>java</sonar.language>
      </properties>
      <build>
        <plugins>
          <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.6.3.201306030806</version>
            <configuration>
              <destFile>${sonar.jacoco.reportPath}</destFile>
              <append>true</append>
            </configuration>
            <executions>
              <execution>
                <id>agent</id>
                <goals>
                  <goal>prepare-agent</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <!-- Minimal supported version is 2.4 -->
            <version>2.13</version>
            <configuration>
              <properties>
                <property>
                  <name>listener</name>
                  <value>org.sonar.java.jacoco.JUnitListener</value>
                </property>
              </properties>
            </configuration>
          </plugin>
        </plugins>
      </build>
      <dependencies>
        <dependency>
          <groupId>org.codehaus.sonar-plugins.java</groupId>
          <artifactId>sonar-jacoco-listeners</artifactId>
          <version>1.2</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    </profile>