繁体   English   中英

使用 gradle 从 jacoco 测试覆盖率中删除一些 java 文件

[英]Remove some java files from jacoco test coverage using gradle

我想在 Jacaco 测试覆盖率报告中排除一些源文件。对于其他生成的代码,我是这样做的:

classDirectories = fileTree(
            dir: "${project.buildDir}/intermediates/classes/debug/com",
            excludes: [
                    '**/R.class',
                    '**/R$*.class']
                    )  

但是为了在我尝试这样做时排除 Java 文件:

   dir: "${project.buildDir}/intermediates/classes/debug/com",
            excludes: [
                 'src//java/com/example/application/Constants.java'] 

也试过这样: '**/application/Constants.class'它不起作用。 我是否需要在此处包含路径: dir: "${project.buildDir}/intermediates/classes/debug/com"

我正在使用 Android studio 3.0(我认为这并不重要)。 我正在尝试的完整代码:

task jacocoTestReport(type: JacocoReport) {
        group = "Reporting"
        description = "Generate Jacoco coverage reports"
        reports {
            xml.enabled = true
            html.enabled = true
        }

 sourceDirectories = files(sourceSets)

 classDirectories = fileTree(
            dir: "${project.buildDir}/intermediates/classes/debug/com",
            excludes: [
                    'src//java/com/example/application/Constants.java',     //this is not working
                    '**/R.class',
                    '**/R$*.class',
                    '**/BuildConfig.*',
                    '**/Manifest*.*',
                    '**/*$ViewInjector*.*',
                    '**/*$ViewBinder*.*',
                    '**/*$Lambda$*.*', // Jacoco can not handle several "$" in class name.
                    '**/*Module.*', // Modules for Dagger.
                    '**/*Dagger*.*', // Dagger auto-generated code.
                    '**/*MembersInjector*.*', // Dagger auto-generated code.
                    '**/*_Provide*Factory*.*',
                    '**/*_Factory.*', //Dagger auto-generated code
                    '**/*$*$*.*', // Anonymous classes generated by kotlin
                    //add libraries
                    'android/**/*.*',
                    'com/**/*.*',
                    'uk/**/*.*',
                    'io/**/*.*',
                    //remove what we don't test
                    'androidTest/**/*.*',
                    'test/**/*.*',
                    '**/injector/**/*.*',
                    '**/model/**/*.*',
                    '**/mock/**/*.*',
                    '**/event/**/*.*',
                    '**/**_ViewBinding**',
                    '**/*EventType.*',
                    '**/**Mocked'
            ]

    )
    executionData = fileTree(dir: 'build/jacoco', include: '**/*.exec')

}

在我的项目中,配置如下:

//exclude the folders we do not want to check
jacocoTestReport {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it, exclude: [
                    '**/enum/**',
                    '**/util/**',
            ])
        })
    }
}

classDirectories类型任务的JacocoReport是关于class文件的,而不是java源文件。 我很确定你的目录

 classDirectories = fileTree( dir: "${project.buildDir}/intermediates/classes/debug/com",

包含class文件,不包含java文件。 此外,正如您所看到的,其他模式与class文件有关:

 '**/R.class', '**/R$*.class',

这就是为什么你被排除在外

 'src//java/com/example/application/Constants.java', //this is not working

不起作用。 因此将其更改为匹配给定目录中的现有class文件。

另请注意,您只需打印即可轻松调试fileTree(...)调用的结果:

tree.each {File file ->
    println file
}

对于 gradle 6+,您可以像下面这样配置它:

jacocoTestCoverageVerification {
    violationRules {
        rule {
            includes = ['com/myapp/*']
            excludes = [
                    'com/myapp/folderToExclude1/*',
                    'com/myapp/folderToExclude2/*',
            ]
           limit {
                minimum = 0.85
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM