gradle - Jacoco Gradle 在整个项目级别(不是在模块级别)的最小代码覆盖率阈值

标签 gradle code-coverage jacoco

我们的项目使用的是 Gradle 3.5,jacoco 0.8.1

它有3个模块——模块-A、模块-B和模块-C,其代码覆盖率分别为50%、6%和42%,整个项目的代码覆盖率为38%。

现在我们想以整个项目当前的代码覆盖率作为阈值,也就是说如果整个项目的代码覆盖率低于 38%,构建就会失败。

我尝试了解决方案
Minimum code coverage threshold in Jacoco Gradle

jacocoTestCoverageVerification {
violationRules {
    rule {
        limit {
            minimum = 0.38
        }
    }
}

但是失败了,提示module-B违规,指令覆盖率是0.06,而expect是0.38,看来只适合模块级别,不适合整个项目级别。

我也尝试使用 element = 'GROUP',但似乎没有效果。
(https://www.eclemma.org/jacoco/trunk/doc/api/org/jacoco/core/analysis/ICoverageNode.ElementType.html)

任何人都知道如何为整个项目而不是模块级别设置最小代码覆盖率阈值?

谢谢,

最佳答案

我建议在你的多模块构建中有一个单独的项目(模块)来报告整个项目。您可能需要 JacocoMerge任务也。假设 a、b 和 c 是 java 项目。例如

例如:

def javaProjects = [':a', ':b', ':c']
javaProjects.each {
   project(it) {
      apply plugin: 'java' 
      apply plugin: 'jacoco' 
   } 
} 
project(':report') {
    FileCollection execData = files(javaProjects.collect { project(it).tasks.withType(Test).jacoco.destinationFile }) 
    FileCollection sourceDirs = files(javaProjects.collect { project(it).sourceSets.main.java.srcDirs }) 
    FileCollection classDirs = files(javaProjects.collect { project(it).sourceSets.main.java.output.classesDirs }) 
    def testTasks = javaProjects.collect { project(it).tasks.withType(Test)} 


   task jacocoMerge(type: JacocoMerge) {
      dependsOn testTasks
      executionData execData
      jacocoClasspath = classDirs
   } 
   task coverageVerification(type: JacocoCoverageVerification) {
      dependsOn jacocoMerge
      executionData jacocoMerge.destinationFile
      sourceDirectories srcDirs
      classDirectories classDirs
      violationRules.rule.limit.minimum = 0.38
   } 
   task jacocoReport(type: JacocoReport) {
      dependsOn jacocoMerge
      executionData jacocoMerge.destinationFile
      sourceDirectories srcDirs
      classDirectories classDirs
   }
} 

关于gradle - Jacoco Gradle 在整个项目级别(不是在模块级别)的最小代码覆盖率阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51372406/

相关文章:

java - 如何在现有项目中激活 GitLab Pages?

android - 我正在尝试将Firebase添加到我的flutter项目中,但我不断收到此错误找不到方法实现()

android - 多模块 Kotlin 项目无法解决 : org. jetbrains.kotlin :kotlin-stdlib-jre8:1. 2.71 错误

java - JaCoCo 动态排除覆盖率 0% 的包

java - 从 Sonar 代码覆盖范围中排除访问器

java - 多模块项目的 Sonar maven jacoco 代码覆盖率

android - 将 jacoco-agent.properties 打包到 APK 中以便读取?

java - Android 5.x ClassNotFoundException 在 6.0+ 上运行良好

Gradle 不使用 Maven 本地存储库来创建新的依赖项

java - Cobertura 拒绝承认代码已被覆盖