首页 文章

使用Gradle过滤JaCoCo覆盖率报告

提问于
浏览
73

问题:

我有一个jacoco的项目,我希望能够过滤某些类和/或包 .

相关文档:

我已阅读以下文档:

Official jacoco site: http://www.eclemma.org/jacoco/index.html

Official jacoco docs for gradle: https://gradle.org/docs/current/userguide/jacoco_plugin.html

Official jacoco Github issues, working on coverage: https://github.com/jacoco/jacoco/wiki/FilteringOptions https://github.com/jacoco/jacoco/issues/14

相关StackOverflow链接:

JaCoCo & Gradle - Filtering Options(没有答案)

Exclude packages from Jacoco report using Sonarrunner and Gradle(不使用sonar

JaCoCo - exclude JSP from report(似乎适用于maven,我正在使用gradle

Maven Jacoco Configuration - Exclude classes/packages from report not working(它似乎适用于maven,我正在使用gradle

JaCoCo gradle plugin exclude(无法让这个工作)

Gradle Jacoco - coverage reports includes classes excluded in configuration(似乎非常接近,它使用 doFirst ,对我不起作用)

我尝试过的例子:

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

buildscript {
    repositories {
        mavenCentral()
        jcenter()
    }
}

repositories {
    jcenter()
}

jacocoTestReport {
    reports {
        xml {
            enabled true // coveralls plugin depends on xml format report
        }

        html {
            enabled true
        }
    }

    test {
        jacoco {
            destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
            classDumpFile = file("$buildDir/jacoco/classpathdumps")
            excludes = ["projecteuler/**"] // <-- does not work
            // excludes = ["projecteuler"]
        }
    }
}

问题:

How can I exclude certain packages and classes when generating the jacoco coverage reports?

6 回答

  • 5

    感谢Yannick Welsch:

    在搜索Google,阅读Gradle文档并浏览旧的StackOverflow帖子后,我在官方gradle论坛上找到了这个答案!

    jacocoTestReport {
        afterEvaluate {
            classDirectories = files(classDirectories.files.collect {
                fileTree(dir: it, exclude: 'com/blah/**')
            })
        }
    }
    

    Source: https://issues.gradle.org/browse/GRADLE-2955

    我的build.gradle for Java / Groovy项目的解决方案:

    apply plugin: 'java'
    apply plugin: 'jacoco'
    
    jacocoTestReport {
        reports {
            xml {
                enabled true // coveralls plugin depends on xml format report
            }
    
            html {
                enabled true
            }
        }
    
        afterEvaluate {
            classDirectories = files(classDirectories.files.collect {
                fileTree(dir: it,
                        exclude: ['codeeval/**',
                                  'crackingthecode/part3knowledgebased/**',
                                  '**/Chapter7ObjectOrientedDesign**',
                                  '**/Chapter11Testing**',
                                  '**/Chapter12SystemDesignAndMemoryLimits**',
                                  'projecteuler/**'])
            })
        }
    }
    

    如您所见,我成功地向 exclude: 添加了更多内容,以便过滤一些软件包 .

    Source: https://github.com/jaredsburrows/CS-Interview-Questions/blob/master/build.gradle

    其他项目(如Android)的自定义任务:

    apply plugin: 'jacoco'
    
    task jacocoReport(type: JacocoReport) {
        reports {
            xml {
                enabled true // coveralls plugin depends on xml format report
            }
    
            html {
                enabled true
            }
        }
    
        afterEvaluate {
            classDirectories = files(classDirectories.files.collect {
                fileTree(dir: it,
                        exclude: ['codeeval/**',
                                  'crackingthecode/part3knowledgebased/**',
                                  '**/Chapter7ObjectOrientedDesign**',
                                  '**/Chapter11Testing**',
                                  '**/Chapter12SystemDesignAndMemoryLimits**',
                                  'projecteuler/**'])
            })
        }
    }
    

    Source: https://github.com/jaredsburrows/android-gradle-java-app-template/blob/master/gradle/quality.gradle#L59

  • 74

    对我来说,这很好用

    test {
      jacoco {
        excludes += ['codeeval/**',
                     'crackingthecode/part3knowledgebased/**',
                     '**/Chapter7ObjectOrientedDesign**',
                     '**/Chapter11Testing**',
                     '**/Chapter12SystemDesignAndMemoryLimits**',
                     'projecteuler/**']
      }
    }
    

    正如https://docs.gradle.org/current/userguide/jacoco_plugin.html#N16E62文件中所述并且最初要求所以答案是:

    所以如果你问我:这不是问题

    excludes = ["projecteuler/**"]
    

    要么

    excludes += ["projecteuler/**"]
    

    excludes = ["**/projecteuler/**"]
    

    排除包 *.projecteuler.*

    test {} 在项目级别,而不是嵌套在 jacocoTestReport

  • 9

    Here是ANT中此问题的解决方案 . 这可以通过在 jacocoTestReport 任务下添加以下内容来调整 . 尽管jacoco没有真正记录这一点,但它似乎是目前过滤测试结果的唯一方法 .

    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it, exclude: 'excluded/files/**')
        })
    }
    
  • 1

    这已经有一段时间了,但我刚碰到了这个 . 我正在努力解决所有需要的排除问题 . 我觉得这对我来说简单得多 . 如果您遵循Maven项目布局样式/ src / main / java和/ src / test / java,您只需将 buildDir/classes/main 放在 classDirectories 配置中,如下所示:

    afterEvaluate {
        jacocoTestReport {
            def coverageSourceDirs = ['src/main/java']
            reports {
                xml.enabled false
                csv.enabled false
                html.destination "${buildDir}/reports/jacocoHtml"
            }
            sourceDirectories = files(coverageSourceDirs)
            classDirectories = fileTree(
                    dir: "${project.buildDir}/classes/main",
                    excludes: [
                          //whatever here like JavaConfig etc. in /src/main/java
                         ]
            )
        }
    }
    
  • 4

    对于Gradle 5.0及更高版本, classDirectories = files(...) 给出了弃用警告 . 这是排除类的非弃用方式:

    jacocoTestReport {
        afterEvaluate {
            classDirectories.setFrom(files(classDirectories.files.collect {
                fileTree(dir: it, exclude: 'com/exclude/**')
            }))
        }
    }
    
  • 3

    以下代码也不包括覆盖范围验证中的类:

    jacocoTestCoverageVerification {
        afterEvaluate {
            classDirectories = files(classDirectories.files.collect {
                fileTree(dir: "${project.buildDir}/classes/main",
                        exclude: ['**/packagename/**'])
            })
        }
    }
    

相关问题