如何为多模块项目创建汇总的 Jacoco 报告?

Posted

技术标签:

【中文标题】如何为多模块项目创建汇总的 Jacoco 报告?【英文标题】:How to create an aggregated Jacoco report for a multi-module project? 【发布时间】:2021-11-28 14:19:25 【问题描述】:

我几天来一直在寻找一种解决方案,用于合并多模块 android 项目的多个 Jacoco 报告,以便一次将它们发送到 Sonarcloud。我已经检查了大量 *** 帖子和其他内容,例如博客、Github 存储库、Gradle forum 等,但不幸的是,没有一个解决方案适合我。

如果有人在这里与我分享示例项目或代码片段,我将不胜感激。

Gradle version: 7.0.2
Kotlin version: 1.5.21
JDK: 11

下面的代码对我也不起作用

/**
 *  Root task that generates an aggregated Jacoco test coverage report for all sub-projects
 */
task jacocoFullReport(type: JacocoReport, group: 'Coverage reports') 
    group = 'Reporting'
    description = 'Generates an aggregate report from all subprojects'

    tasks.withType(Test) 
        ignoreFailures true
    

    def projects = subprojects

    //noinspection GrUnresolvedAccess
    dependsOn(projects.jacocoReport)

    final source = files(projects.jacocoReport.sourceDirectories)

    additionalSourceDirs.setFrom source
    sourceDirectories.setFrom source

    classDirectories.setFrom files(projects.jacocoReport.classDirectories)
    executionData.setFrom files(projects.jacocoReport.executionData)

    reports 
        html 
            enabled true
            destination file('build/reports/jacoco/html')
        
        csv 
            enabled true
            destination file('build/reports/jacoco/jacocoFullReport.csv')
        
    

    doFirst 
        //noinspection GroovyAssignabilityCheck
        executionData.setFrom files(executionData.findAll  it.exists() )
    

【问题讨论】:

org.sonarqube Gradle 插件遍历所有子项目并推送所有 JaCoCo XML 报告。为什么需要合并它们? @agabrys 是的,但我只想提供一个文件。但是你的意思是低于一个应该没问题,对吧? sonarqube properties property "sonar.coverage.jacoco.xmlReportPaths", fileTree(dir: "$projectDir", includes: ["**/reports/jacoco/*/jacocoTestReport.xml"]).files.join(", ") 删除sonar.coverage.jacoco.xmlReportPaths 属性。它的默认值完全符合您的需要。通常,只要您不需要更改默认行为,就不应设置任何 SonarScanner 属性。 默认情况下,JaCoCo Gradle 插件在build/reports/jacoco/<taskName>/jacocoTestReport.xml 文件中创建报告。 SonarScanner 默认配置sonar.coverage.jacoco.xmlReportPaths 来检查build/reports/jacoco/test/jacocoTestReport.xml。检查您的 build.gradle 是否不会强制在其他位置创建 Android JaCoCo 报告。如果是 - 然后将其删除并使用默认值。如果没有 - 您可以更改为使用标准位置。 谢谢,我强制我的任务在与其他 Kotlin 模块相同的位置为 Android 模块创建报告并删除了该属性。看起来它像以前一样工作。 【参考方案1】:

这里的工作示例如何创建聚合 jacoco 报告: https://github.com/SurpSG/jacoco-gradle-plugin-merge-coverage

task jacocoRootReport(type: JacocoReport, group: 'Coverage reports') 
    description = 'Generates an aggregate report from all subprojects'
    dependsOn(subprojects.test)

    additionalSourceDirs.from = files(subprojects.sourceSets.main.allSource.srcDirs)
    sourceDirectories.from = files(subprojects.sourceSets.main.allSource.srcDirs)
    classDirectories.from = files(subprojects.sourceSets.main.output)
    executionData.from = files(subprojects.jacocoTestReport.executionData)

    reports 
        html.enabled true
    

【讨论】:

感谢您的回答,但这对我不起作用。我收到以下错误:Could not get unknown property 'test' for project ':app' of type org.gradle.api.Project. 如果您收到此错误Could not get unknown property 'test',请确保将插件应用于子项目subprojects apply plugin: 'java' apply plugin: 'jacoco'

以上是关于如何为多模块项目创建汇总的 Jacoco 报告?的主要内容,如果未能解决你的问题,请参考以下文章

Sonarqube + Jacoco - 声纳不会从属性中读取报告路径

源和测试类在不同模块中时的 JaCoCo 配置

Maven Jacoco 配置 - 从报告中排除类/包不起作用

使用 Powermock 在 Sonarqube 中配置 jacoco 以进行集成和单元测试报告

MAVEN:多模块项目,如何为构建添加不同的环境

如何为项目/lib 中的本地 jar 创建 Ivy 依赖项?