android - Gradle 任务 jacoco 报告生成空的 html 报告文件(未指定类文件)
问题描述
我想使用 Jacoco 为我的所有测试(androidTest + UnitTest)生成代码覆盖率报告。
因此,我实现了一个分步脚本 (jacoco.gradle) 来创建一个任务,该任务允许我生成一个合并两个代码覆盖率报告的报告。
我的问题是 html 生成的文件是空的(在app\build\jacocoReport\index.html
):
没有指定类文件。JaCoCo 0.8.3.201901230119
我执行“testIntegrationDebugUnitTest”任务:
androidTest代码覆盖率报告已在app/build/reports/coverage/integration/debug/index.html上创建,没关系。
在 app\build\outputs\code_coverage\integrationDebugAndroidTest\connected\Pixel_2_API_24(AVD) - 7.0-coverage.ec 上生成了一个“ec”文件
在 app/build/jacoco/testIntegrationDebugUnitTest.exec 上生成了一个“exec”文件
你知道我的问题来自哪里吗?这是我的代码:
jacoco.gradle:
apply plugin: 'jacoco'
jacoco {
toolVersion = "$jacocoVersion"
reportsDir = file("$buildDir/jacocoReport")
}
project.afterEvaluate {
android.applicationVariants.all { variant ->
def variantName = variant.name
def testTaskName = "test${variantName.capitalize()}UnitTest"
def androidTestCoverageTaskName = "create${variantName.capitalize()}CoverageReport"
tasks.create(name: "${testTaskName}Coverage", type: JacocoReport, dependsOn: ["$testTaskName", "$androidTestCoverageTaskName"]) {
group = "Reporting"
description = "Generate Jacoco coverage reports for the ${variantName.capitalize()} build."
reports {
xml.enabled = false
html.enabled = true
html.destination "$buildDir/jacocoReport"
}
def excludes = ['**/R*.class',
'**/*$InjectAdapter.class',
'**/*$ModuleAdapter.class',
'**/*$ViewInjector*.class'
]
def debugTree = fileTree(dir: "$project.buildDir/intermediates/javac/debug", excludes: excludes)
def mainSrc = "$project.projectDir/src/main/java"
sourceDirectories = files([mainSrc])
classDirectories = files([debugTree])
executionData = fileTree(dir: project.buildDir, includes: [
"jacoco/${testTaskName}.exec", "outputs/code_coverage/${variantName}AndroidTest/connected/**/*.ec"
])
}
}
}
毕业项目:
buildscript {
ext.kotlin_version = '1.3.21'
ext.jacocoVersion = '0.8.3'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'io.realm:realm-gradle-plugin:5.8.0'
classpath 'com.google.gms:google-services:4.2.0'
classpath 'io.fabric.tools:gradle:1.28.0'
classpath "org.jacoco:org.jacoco.core:$jacocoVersion"
}
}
task installGradle(type: Wrapper) {
group = "*********"
gradleVersion = '4.10.1'
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
应用程序等级:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'io.fabric'
apply from: '../scripts/jacoco.gradle'
android.applicationVariants.all { variant ->
if (variant.name == 'demoDebug' || variant.name == 'evalDebug' || variant.name == 'stagingDebug') {
project.tasks.getByName('process' + variant.name.capitalize() + 'GoogleServices').enabled = false
project.tasks.getByName('fabricGenerateResources' + variant.name.capitalize()).enabled = false
}
}
android {
compileSdkVersion 28
defaultConfig {
applicationId "***********"
minSdkVersion 23
targetSdkVersion 28
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildTypes {
debug {
testCoverageEnabled true
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'android.arch.lifecycle:extensions:1.1.1'
implementation 'com.google.firebase:firebase-core:16.0.8'
implementation 'com.crashlytics.sdk.android:crashlytics:2.9.9'
testImplementation 'junit:junit:4.12'
testImplementation 'org.mockito:mockito-core:2.25.1'
testImplementation 'android.arch.core:core-testing:1.1.1'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
androidTestImplementation 'org.mockito:mockito-android:2.25.1'
androidTestImplementation 'android.arch.core:core-testing:1.1.1'
}
解决方案
这是一个常见的问题,您需要将debugTree
属性更改为:
//java compiled classes
def javaTree = fileTree(dir: "$project.buildDir/intermediates/javac/debug/classes", excludes: fileFilter)
//kotlin compiled classes
def kotlinTree = fileTree(dir: "$project.buildDir/tmp/kotlin-classes/debug", excludes: fileFilter)
//...etc...
classDirectories.from = files([javaTree, kotlinTree])
debug
可以是任何变体,$variantName
如果你知道你在做什么,你可以使用它来代替它
推荐阅读
- python - 限制对函数的调用次数以防止垃圾邮件
- python - 如何确认 LSTM 网络的收敛性?
- java - 如何取消AlarmManager中设置的所有警报?
- xpages - Domino 10 Java XPage 在一段时间后因 PANIC 导致服务器崩溃:信号量无效或未分配
- swift - 可以换吗|| with && - Apple 的 SwiftUI 教程
- gnome - 通过选项卡名称获取 gnome-terminal 窗口的 window_ID(可能不是活动选项卡)
- python - 如何将用户输入与随机生成的数字进行比较?
- typescript - 有没有办法使用TestCafe实现组合键(Ctrl + +)?
- c++ - 防止内存泄漏和 C++ 中的简单/惯用编程
- excel - 一对多关系