Jacoco Gradle 中的最小代码覆盖率阈值

Posted

技术标签:

【中文标题】Jacoco Gradle 中的最小代码覆盖率阈值【英文标题】:Minimum code coverage threshold in Jacoco Gradle 【发布时间】:2016-06-03 02:56:45 【问题描述】:

如何设置Jacoco Gradle 中的最小代码覆盖率?

如果不满足,我希望构建失败。

【问题讨论】:

【参考方案1】:

Gradle Jacoco 插件默认会使用以下代码测试 Instruction 覆盖率:

jacocoTestCoverageVerification 
    violationRules 
        rule 
            limit 
                minimum = 0.85
            
        
    

我需要测试 LineBranch 覆盖率。为了向 Jacoco 提及这一点,我们将不得不使用 Counter。计数器可以有各种值,例如:INSTRUCTION、LINE、BRANCH、COMPLEXITY、METHOD 和 CLASS。指令是默认的。

为了验证线路和分支覆盖率,可以使用以下代码:

jacocoTestCoverageVerification 
    violationRules 
        rule 
            limit 
                counter = 'LINE'
                minimum = 0.87
            
            limit 
                counter = 'BRANCH'
                minimum = 0.80
            
        
    

一个规则可以包含多个限制。

参考:https://docs.gradle.org/current/javadoc/org/gradle/testing/jacoco/tasks/rules/JacocoViolationRulesContainer.html

【讨论】:

【参考方案2】:

android 应用程序中,此配置有效:

项目:build.gradle

buildscript 
    repositories 
        google()
        jcenter()
        maven  url 'https://plugins.gradle.org/m2/' 
    
    dependencies 
        classpath "com.android.tools.build:gradle:3.1.4"
        classpath "org.jacoco:org.jacoco.core:0.8.2"
    

应用程序:build.gradle

ext.jacoco_version = '0.8.2'
def configDir = "$project.rootDir/config"
def reportDir = "$project.buildDir/reports"
def mainSrc = "$project.projectDir/src/main/java"
def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*']
def debugTree = fileTree(dir: "$project.buildDir/intermediates/classes/debug", excludes: fileFilter)
//Jacoco jacocoTestReport
apply plugin: 'jacoco'
jacoco.toolVersion = jacoco_version
task jacocoTestReport(type: JacocoReport, dependsOn: 'testDebugUnitTest') 
    reports 
        xml.enabled = false
        html.enabled = true
    
    sourceDirectories = files([mainSrc])
    classDirectories = files([debugTree])
    executionData = fileTree(dir: project.buildDir, includes: [
            'jacoco/testDebugUnitTest.exec', 'outputs/code-coverage/connected/*coverage.ec'
    ])

task jacocoTestCoverageVerification(type: JacocoCoverageVerification, dependsOn: 'jacocoTestReport') 
    sourceDirectories = files([mainSrc])
    classDirectories = files([debugTree])
    executionData = files("$buildDir/jacoco/testDebugUnitTest.exec")
    violationRules 
        failOnViolation = true
        rule 
            limit 
                minimum = 0.7
            
        
    

我们可以在命令行中执行它:

./gradlew jacocoTestCoverageVerification

我使用了 gradle wrapper 4.4。

【讨论】:

您好,您的解释对我帮助很大。有没有办法单独测试一个特定的类有没有限制? 对,看这个问题***.com/questions/22505533/…【参考方案3】:

这是竞争示例

task wrapper(type: Wrapper) 
     gradleVersion = '4.8' 
 

plugins  
    id 'java' 
    id 'maven' 
    id "jacoco" 
 

jacoco 
    toolVersion = '0.8.1' 
 

jacocoTestCoverageVerification  
    violationRules  
        rule  
            limit  
                minimum = 0.5 
             
         
     
 


jacocoTestReport  
     reports  
        csv.enabled false 
        xml.enabled false 
        html  
            enabled true 
            destination file("$buildDir/reports/jacoco") 
         
     
   executionData(test) 
 

tasks.build.dependsOn(jacocoTestReport) 

test 
    jacoco 
        append = false 
        destinationFile = file("$buildDir/jacoco/jacocoTest.exec") 
        classDumpDir = file("$buildDir/jacoco/classpathdumps") 
     
 

【讨论】:

【参考方案4】:

该功能现已推出。您只需要应用 Gradle JaCoCo 插件并像这样定义覆盖率验证:

apply plugin: 'jacoco'

jacocoTestCoverageVerification 
    violationRules 
        rule 
            limit 
                minimum = 0.7
            
        
    


// to run coverage verification during the build (and fail when appropriate)
check.dependsOn jacocoTestCoverageVerification

最后一行非常重要,因为除非您明确运行 jacocoTestCoverageVerification 任务,否则您的构建不会失败。

有关您可以添加的检查类型的更多信息,请参见documentation of the plugin。

【讨论】:

在意识到你需要 check.dependsOn jacocoTestCoverageVerification 之前我已经失去了 1 小时:|

以上是关于Jacoco Gradle 中的最小代码覆盖率阈值的主要内容,如果未能解决你的问题,请参考以下文章

如何验证某些排除类和 jacoco 插件的最小覆盖率?

Jenkins中用jacoco统计gradle项目的代码覆盖率

使用Gradle的Sonarqube 8的Jacoco代码覆盖率。

在带有 Gradle 的 Android 项目中使用 JaCoCo

使用 Spring Boot 时使用 JaCoCo 代码覆盖率构建 Gradle 多项目失败

在没有 Maven 或 Gradle 的情况下运行 jacoco 报告