Android - Jacoco 没有正确生成 xml 报告(已解决)
Android - Jacoco does not generate xml report properly(solved)
我们已将 JaCoCo 插件集成到我们的 Android 项目中,以通过 SonarQube 测量代码覆盖率。但是,无法测量。因为 SonarQube 期望覆盖率报告为 XML 格式。我们将自定义 jacocoTestReport 任务添加到 build.gradle(模块)。它生成一个 xml 文件,但不包含任何覆盖率信息。你遇到过这样的问题吗?如果遇到过,有什么解决办法吗?
build.gradle(根)
classpath "org.jacoco:org.jacoco.core:0.8.5"
build.gradle(模块)
apply plugin: 'jacoco'
...
task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) {
reports {
xml.enabled = true
html.enabled = true
}
def fileFilter = ['**/R.class',
'**/R$*.class',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*Test*.*',
'android/**/*.*']
def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: fileFilter)
def mainSrc = "${project.projectDir}/src/main/java"
getSourceDirectories().setFrom(files([mainSrc]))
getClassDirectories().setFrom(files([debugTree]))
getExecutionData().setFrom(fileTree(dir: "$buildDir", includes: [
"jacoco/testDebugUnitTest.exec",
"outputs/code-coverage/connected/*coverage.ec"
]))
输出:
你的 gradle 版本是什么? gradle 6.4+ 似乎有一些问题
https://github.com/gradle/gradle/issues/14132
经过一番谷歌搜索,我终于解决了这个问题。源和 class 目录的路径不正确。正确的路径应该是这样的:
def javaClasses = fileTree(dir: variant.javaCompileProvider.get().destinationDir,
excludes: fileFilter)
def kotlinClasses = fileTree(dir: "${buildDir}/tmp/kotlin-classes/${variantName}",
excludes: fileFilter)
classDirectories.setFrom(files([
javaClasses,
kotlinClasses
]))
def variantSourceSets = variant.sourceSets.java.srcDirs.collect { it.path }.flatten()
sourceDirectories.setFrom(project.files(variantSourceSets))
此致,
我们已将 JaCoCo 插件集成到我们的 Android 项目中,以通过 SonarQube 测量代码覆盖率。但是,无法测量。因为 SonarQube 期望覆盖率报告为 XML 格式。我们将自定义 jacocoTestReport 任务添加到 build.gradle(模块)。它生成一个 xml 文件,但不包含任何覆盖率信息。你遇到过这样的问题吗?如果遇到过,有什么解决办法吗?
build.gradle(根)
classpath "org.jacoco:org.jacoco.core:0.8.5"
build.gradle(模块)
apply plugin: 'jacoco'
...
task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) {
reports {
xml.enabled = true
html.enabled = true
}
def fileFilter = ['**/R.class',
'**/R$*.class',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*Test*.*',
'android/**/*.*']
def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: fileFilter)
def mainSrc = "${project.projectDir}/src/main/java"
getSourceDirectories().setFrom(files([mainSrc]))
getClassDirectories().setFrom(files([debugTree]))
getExecutionData().setFrom(fileTree(dir: "$buildDir", includes: [
"jacoco/testDebugUnitTest.exec",
"outputs/code-coverage/connected/*coverage.ec"
]))
输出:
你的 gradle 版本是什么? gradle 6.4+ 似乎有一些问题 https://github.com/gradle/gradle/issues/14132
经过一番谷歌搜索,我终于解决了这个问题。源和 class 目录的路径不正确。正确的路径应该是这样的:
def javaClasses = fileTree(dir: variant.javaCompileProvider.get().destinationDir,
excludes: fileFilter)
def kotlinClasses = fileTree(dir: "${buildDir}/tmp/kotlin-classes/${variantName}",
excludes: fileFilter)
classDirectories.setFrom(files([
javaClasses,
kotlinClasses
]))
def variantSourceSets = variant.sourceSets.java.srcDirs.collect { it.path }.flatten()
sourceDirectories.setFrom(project.files(variantSourceSets))
此致,