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

Shu*_*ham 8 java android unit-testing jacoco test-coverage

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

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

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

   dir: "${project.buildDir}/intermediates/classes/debug/com",
            excludes: [
                 'src//java/com/example/application/Constants.java'] 
Run Code Online (Sandbox Code Playgroud)

也尝试过这样:. '**/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')

}
Run Code Online (Sandbox Code Playgroud)

小智 5

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

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


God*_*din 4

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

 classDirectories = fileTree(
            dir: "${project.buildDir}/intermediates/classes/debug/com",
Run Code Online (Sandbox Code Playgroud)

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

                '**/R.class',
                '**/R$*.class',
Run Code Online (Sandbox Code Playgroud)

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

           'src//java/com/example/application/Constants.java',     //this is not working
Run Code Online (Sandbox Code Playgroud)

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

另请注意,您可以fileTree(...)通过简单地打印调用结果来轻松调试它:

tree.each {File file ->
    println file
}
Run Code Online (Sandbox Code Playgroud)