[英]coverage per test with gradle using jacoco offline instrumentation - java.lang.IllegalStateException: JaCoCo agent not started
[英]Remove some java files from jacoco test coverage using gradle
我想在 Jacaco 测试覆盖率报告中排除一些源文件。对于其他生成的代码,我是这样做的:
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
}
对于 gradle 6+,您可以像下面这样配置它:
jacocoTestCoverageVerification {
violationRules {
rule {
includes = ['com/myapp/*']
excludes = [
'com/myapp/folderToExclude1/*',
'com/myapp/folderToExclude2/*',
]
limit {
minimum = 0.85
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.