我想在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')
}
在我的项目中,配置如下:
//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
}