【问题标题】:Jacoco parameterize violation rule valueJacoco 参数化违规规则值
【发布时间】:2018-05-30 11:05:07
【问题描述】:

我的 build.gradle 文件中有以下内容。如果覆盖率低于某个值,我会尝试使构建失败。

project.task(type: JacocoCoverageVerification, "jacocoTestCoverageVerification", overwrite: true) {

    executionData(junitPlatformTestTask)
    sourceSets(sourceSets.main)
    sourceDirectories = files(sourceSets.main.allSource.srcDirs)
    classDirectories = files(sourceSets.main.output)
    onlyIf = {
        true
    }
    violationRules {
        rule {
            limit {
                counter = 'INSTRUCTION'
                value = 'COVEREDRATIO'
                minimum = 0.001
            }
        }
    }
}

如何在此处参数化“最小值”的值,以便在构建项目时通过 Jenkins 或 Team city 传递它。任何帮助将不胜感激。

【问题讨论】:

    标签: java gradle kotlin code-coverage jacoco


    【解决方案1】:

    在 Jenkins 中使用参数化构建,添加参数“minimumValue”。然后你可以在 build.gradle 中使用它:

    task jacocoJupTestReport(type: JacocoReport) {
        executionData(test)
        sourceSets(sourceSets.main)
        sourceDirectories = files(sourceSets.main.allSource.srcDirs)
        classDirectories = files(sourceSets.main.output)
    
        reports {
            xml.enabled true
            xml.destination file("${buildDir}/reports/jacoco/report.xml")
            html.enabled false
            csv.enabled false
        }
    
        jacocoTestCoverageVerification {
            violationRules {
                rule {
                    limit {
                        counter = 'INSTRUCTION'
                        value = 'COVEREDRATIO'
                        minimum = project.properties["minimumValue"]
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 问题是,我如何才能将“0.001”作为参数传递而不是硬编码。
    • 你可以通过使用 gradle 属性/环境变量/许多其他解决方案来做到这一点
    • 看答案,我添加了可能解决方案之一的示例
    • 如果您在捆绑级别统计评估中排除了包/类,这将无法正常工作。所以,如果我们指定element = CLASS,我们可能只对class级别的统计信息进行操作。
    【解决方案2】:

    您可以使用系统环境从Jenkins传递参数

    System.getEnv("<JENKINS_PARAM_NAME>") as String ?: "<default value>"

    将类型设为String 以安全地假设 Jenkins 中接受的参数类型。然后在gradle中转回具体的类型:

    例如:

    def coverageRatio = System.getEnv("COVERAGE_RATIO") as String ?: "1.0" //"default value is 100% coverage"
    def fileFilter = ['**/path/to/your/classes/you/like/to/exclude','**/some/class']
    
    
    
    violationRules {
        ...
        rule {
            element = 'BUNDLE'
            limit {
                counter = 'INSTRUCTION'
                value = 'COVEREDRATIO'
                minimum = coverageRatio.toBigDecimal()
            }
            excludes = fileFilter
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 2017-02-25
      • 2012-01-03
      • 2023-01-22
      • 2020-11-04
      相关资源
      最近更新 更多