【问题标题】:Merging multiple jacoco agent reports to be used by SONAR?合并多个 jacoco 代理报告以供 SONAR 使用?
【发布时间】:2014-08-29 16:09:36
【问题描述】:

我正在跨多个虚拟机运行自定义并行系统测试,并使用 jacoco 代理对我们编译的应用程序执行运行时分析。这些代理中的每一个都将生成自己的 report.exec,并具有相应的覆盖率,我们想要一种方法来表示整个项目(在 SONAR 中)的整体“集成测试”覆盖率。

这项工作仍处于规划阶段,因此我正在尽最大努力制定路线图。我知道 ant/maven 构建使报告合并变得容易,但是由于我们的测试环境的性质,需要使用 jacoco agent 来生成运行时覆盖率。

我已经到处搜索了适用于这种情况的解决方案,但似乎几乎每个属于该 jacoco/sonar 类别的问题都有其独特的条件,几乎没有人对使用 jacoco 代理感兴趣.

代理将以 tcpserver 模式运行,主客户端负责编排转储和报告输出。如果此客户端配置为输出到单个文件,这些报告会自动附加/合并到一个文件中吗?是否存在任何用于合并多个覆盖率报告的 API 或独立项目,我可以将其集成到不依赖于 ant 或 maven 的客户端中?

或者,是否有一个 SONAR 配置来接受这种性质的多个报告并通过代码行合并它们的覆盖范围?在父 pom.xml 中定义每个单独的报告,或者只是给它一个包含整个集合的文件夹的路径并让 SONAR 对其进行排序?

我愿意接受这个问题没有简单的解决方案,但只要不编写我自己的合并功能就可以真正帮助这个项目起步。

E: 值得一提的是,我们不会生成任何实际的 HTML/XML/等。报告,只需执行我们将提供给 SONAR 的文件。

【问题讨论】:

    标签: code-coverage sonarqube jacoco


    【解决方案1】:

    如果您使用 Gradle,您必须首先使用 merge the Jacoco execution 数据,然后告诉 sonarqube 使用该数据,而不是每个子模块生成的单个 exec 文件。

    如下所示:

    def allTestCoverageFile = "$buildDir/jacoco/allTestCoverage.exec"
    
    sonarqube {
        properties {
            property "sonar.projectKey", "your.org:YourProject"
            property "sonar.projectName", "YourProject"
            property "sonar.jacoco.reportPaths", allTestCoverageFile
        }
    }
    
    task jacocoMergeTest(type: JacocoMerge) {
        destinationFile = file(allTestCoverageFile)
        executionData = project.fileTree(dir: '.', include:'**/build/jacoco/test.exec')
    }
    
    task jacocoMerge(dependsOn: ['jacocoMergeTest']) {
        // used to run the other merge tasks
    }
    
    subprojects {
        sonarqube {
            properties {
                property "sonar.jacoco.reportPath", allTestCoverageFile
            }
        }
    }
    

    简而言之:

    • 首先,我们为我们的测试报告 (allTestCoverageFile) 定义一个全局覆盖文件输出。
    • 然后我们需要告诉 Sonarqube 使用该文件(使用 sonar.jacoco.reportPaths)。但请注意,我们还必须在子项目关闭中执行此操作。这是极其重要的。不要错过。
    • 最后,我们创建了一个扩展自 JacocoMerge(Jacoco 插件的孵化类)的自定义任务,它将所有项目 (executionData) 中的所有测试覆盖率报告合并到我们的 allTestCoverageFile 中。

    【讨论】:

      【解决方案2】:

      警告:我没有这样做,但这个问题引起了我的兴趣。搜索“jacoco merge exec”会发现这些链接,它们看起来应该可以解决您的问题:

      我使用 jacoco 的经验(我们将它用于 ant 构建的单元测试覆盖)表明您希望一步执行测试,并在单独的步骤中加载到 SonarQube。所以我看不出你是否使用 ant、maven、jacoco 代理或其他什么重要的地方。我希望您的进程会创建 jacoco.exec 文件,然后您将在执行 SonarQube 分析之前合并它们。

      【讨论】:

      • 你说得对,这种情况确实适用。不幸的是,我们不使用 Ant,我认为这不足以成为让 IT 安装它的理由。
      【解决方案3】:

      由于这个问题已经获得了这么多的意见:

      ExecutionData 对象有一个合并方法。合并所有报告后,可以将结果对象传递给 ExecutionDataWriter 并正常输出。

      Coverage 是一种 OR 比较,因此合并同一软件的多个实例进行不同测试的覆盖范围将是全面的。

      就 SONAR 而言(取决于您的管道),您可以手动引入合并的报告,只要 SLOC/二进制文件是等距的,您就会得到一堆漂亮的红色和绿色条。

      【讨论】:

      • 您能详细说明一下吗?谢谢。
      猜你喜欢
      • 2012-10-13
      • 2018-11-21
      • 2022-06-14
      • 2017-10-19
      • 1970-01-01
      • 2014-11-21
      • 2016-08-05
      • 2015-10-02
      • 1970-01-01
      相关资源
      最近更新 更多