首页 > 解决方案 > CorDapp JaCoCo 代码覆盖率

问题描述

我有一个基于 Corda 的项目,其中包含几个 CorDapp 子项目。我一直在为这个项目添加 JaCoCo 代码覆盖率。我希望在所有子项目 JaCoCo 报告的汇总报告中绘制一个代码覆盖率报告。

要将 JaCoCo 添加到具有多个 maven 子项目的 maven 项目中,我遵循了此博客条目https://lkrnac.net/blog/2016/10/aggregate-test-coverage-report/。在我们运行构建./gradlew clean test并获得报告后,我们的一位团队成员指出,当我们运行时,白名单不再正确创建./gradlew clean deployNodes

我已经回到这里找到的基本 Kotlin CorDapp 模板https://github.com/corda/cordapp-template-kotlin以排除我们的项目结构/gradle 是否有问题。如果没有添加 JaCoCo,我会看到所有我期望的白名单条目。添加 JaCoCo 代码后,我只看到 5 个默认的 Corda 白名单条目,而没有看到我添加的合约条目。

我正在使用 JaCoCo 版本0.8.1和工作服版本2.6.3。我所做的更改都在根目录的 build.gradle 文件中cordapp-template-kotlin

subprojects {
    repositories {
        mavenCentral()
    }
    apply plugin: 'jacoco'
    apply plugin: 'java'

    group = 'net.lkrnac.blog'
    version = '1.0-SNAPSHOT'

    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8

    dependencies {
        testCompile("junit:junit:4.12")
    }

    jacoco {
        toolVersion = jacoco_version
    }

    //command for generating subproject coverage reports
    jacocoTestReport {
        reports {
            xml.enabled false
            csv.enabled false
            html.destination file("${buildDir}/jacocoHtml")
        }
    }
}

def publishedProjects = subprojects.findAll()
task jacocoRootReport(type: JacocoReport, group: 'Coverage reports') {
    description = 'Generates an aggregate report from all subprojects'

    dependsOn(publishedProjects.test)

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

    doFirst {
        executionData = files(executionData.findAll { it.exists() })
    }

    reports {
        html.enabled = true // human readable
        xml.enabled = true // required by coveralls
    }
}

coveralls {
    sourceDirs = publishedProjects.sourceSets.main.allSource.srcDirs.flatten()
    jacocoReportPath = "${buildDir}/reports/jacoco/jacocoRootReport/jacocoRootReport.xml"
}

tasks.coveralls {
    dependsOn jacocoRootReport
}

我相信问题出在简单地添加一个以 JacocoReport 作为参数的任务。有什么想法可以继续进行代码覆盖以及正确构建白名单吗?

标签: gradlebuild.gradlejacococorda

解决方案


我设法找到了解决覆盖/白名单问题的方法。我开始剥离子项目规范中似乎不必要的代码,并发现删除除apply plugin:jacocojacocoTestReport命令之外的所有内容都会产生根 Jacoco 代码覆盖以及必要的白名单。我不需要更改上面的任何其他代码即可使白名单生效。

作为参考,子项目现在看起来像这样:

subprojects {
    apply plugin: 'jacoco'
    apply plugin: 'kotlin'

    jacoco {
        toolVersion = jacoco_version
    }

    //command for generating subproject coverage reports
    jacocoTestReport {
        reports {
            xml.enabled false
            csv.enabled false
            html.destination file("${buildDir}/jacocoHtml")
        }
    }
}

推荐阅读