Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用gradle从jacoco测试覆盖范围中删除一些java文件_Java_Android_Unit Testing_Jacoco_Test Coverage - Fatal编程技术网

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

使用gradle从jacoco测试覆盖范围中删除一些java文件,java,android,unit-testing,jacoco,test-coverage,Java,Android,Unit Testing,Jacoco,Test Coverage,我想在Jacaco测试覆盖率报告中排除一些源文件。对于其他生成的代码,我已这样做: classDirectories = fileTree( dir: "${project.buildDir}/intermediates/classes/debug/com", excludes: [ '**/R.class', '**/R$*.class']

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

classDirectories = fileTree(
            dir: "${project.buildDir}/intermediates/classes/debug/com",
            excludes: [
                    '**/R.class',
                    '**/R$*.class']
                    )  
//exclude the folders we do not want to check
jacocoTestReport {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it, exclude: [
                    '**/enum/**',
                    '**/util/**',
            ])
        })
    }
}
但是当我尝试这样做时,为了排除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“

我使用的是AndroidStudio 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')

}

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

包含
class
文件,不包含
java
文件。您还可以看到,其他模式是关于
class
文件的:

这就是你被排除在外的原因

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

还请注意,只需打印
fileTree(…)
调用的结果,即可轻松调试该调用的结果:

tree.each {File file ->
    println file
}

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

classDirectories = fileTree(
            dir: "${project.buildDir}/intermediates/classes/debug/com",
            excludes: [
                    '**/R.class',
                    '**/R$*.class']
                    )  
//exclude the folders we do not want to check
jacocoTestReport {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it, exclude: [
                    '**/enum/**',
                    '**/util/**',
            ])
        })
    }
}

对于gradle 6+,您可以按照以下方式进行配置:

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

感谢您的回答,我甚至尝试过像这样使用类文件:'**/application/Constant.class'。**指的是什么。根据我的理解,它指的是包装内的任何东西。这似乎对我不起作用。@Shubham我已经解释了如何调试
文件树的结果,所以请调试它。如果您没有充分说明您的问题,我将不再多说什么可以帮助您,尤其是类似的配置对其他人很好。@Godin如何在源代码集上执行此操作,因为有人可能会将生成的代码插件添加到源代码集?您好,您尝试像这样使用类文件:
'**/application/Constant.class'
,但源文件名为
Constants.java
。你也试过没有这个打字错误吗?e、 g.
“**/Constants.class”
?是的,我也尝试过,没有输入错误。我们可以添加多个类目录吗?我做不到@Shubham off因为您可以,只需将包路径添加到列表中,如代码中的
'**/enum/**'
。如果您能给出一个示例,那就太好了。从中间目录和源目录中排除类和java文件。
jacocoTestCoverageVerification {
    violationRules {
        rule {
            includes = ['com/myapp/*']
            excludes = [
                    'com/myapp/folderToExclude1/*',
                    'com/myapp/folderToExclude2/*',
            ]
           limit {
                minimum = 0.85
            }
        }
    }
}