Как добавить правила минимального покрытия для многомодульного проекта в виде кумулятивного числа - PullRequest
0 голосов
/ 07 декабря 2018

Учитывая многомодульный проект, построенный с использованием Gradle 5.0 , я хочу применить все покрытие кода с использованием jacoco.Я могу установить контроль покрытия на уровне модуля.Но из-за характера зависимостей многие тесты написаны в модуле интеграции, который охватывает большую часть кода.Поэтому я хочу завершить сборку , только если общий охват кода не достигает определенного порогового значения.Ниже приведен мой build.gradle и сборка не завершается независимо от того, какое значение я установил для совокупного покрытия.

apply plugin: 'java'
apply plugin: 'jacoco'

subprojects {
    apply plugin: 'java'
    apply plugin: 'jacoco'

    tasks.withType(JacocoReport).all {
        reports {
            html.enabled true
        }
        check.dependsOn it
    }

    jacocoTestReport {
        executionData = fileTree("$buildDir/jacoco/test.exec")
        subprojects.each {
            sourceSets it.sourceSets.main
            dependsOn it.test
        }
    }

    jacocoTestCoverageVerification {
        executionData fileTree("$buildDir/jacoco/test.exec")

        violationRules {
            rule {
                limit {
                    counter = 'LINE'
                    minimum = 0.5 //individual module coverage level
                }
                failOnViolation true
            }
        }
    }
    tasks.build.dependsOn(jacocoTestReport)
    tasks.build.dependsOn(jacocoTestCoverageVerification)
    jacocoTestReport.mustRunAfter jacocoTestCoverageVerification
    check.dependsOn jacocoTestCoverageVerification  
}

//overall cumulative coverage report
task jacocoMergeTestReport(type: JacocoReport) {
    executionData fileTree(project.rootDir.absolutePath).include('*/build/jacoco/*.exec')
    subprojects.each {
        sourceSets it.sourceSets.main
        dependsOn it.test
    }
    reports {
        html {
            enabled true
            destination rootProject.file("$rootProject.buildDir/reports/jacoco/html")
        }
    }
}
//overall cumulative coverage tasks
jacocoTestCoverageVerification {
    def execFilesToInclude = subprojects.collect {
        it.name+"build/jacoco/*.exec"
    }
    executionData fileTree(project.rootDir.absolutePath).include(execFilesToInclude)

    violationRules {
        rule {
            element = 'CLASS'
            limit {
                counter = 'LINE'
                minimum = 0.8 //no matter which value I set, build does not fail
            }
            failOnViolation true
        }
    }
}
tasks.build.dependsOn jacocoMergeTestReport
tasks.build.dependsOn jacocoTestCoverageVerification
...