使用gradle从jacoco测试覆盖范围中删除一些java文件
我想在Jacaco测试覆盖率报告中排除一些源文件。对于其他生成的代码,我已这样做:使用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']
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
}
}
}
}