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

问题描述 投票:8回答:2

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

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')

}
java android unit-testing jacoco test-coverage
2个回答
4
投票

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

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

2
投票

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
}
© www.soinside.com 2019 - 2024. All rights reserved.