android studio 中的 Jacoco 代码覆盖率
Jacoco Code Coverage in android studio
我正在尝试生成 Jacoco 代码覆盖率报告。
我已经使用 AndroidTestCase 进行测试 类。
我发现使用 testCoverageEnabled true 并使用默认 android -studio default jacoco,
./gradlew connectedCheck 或 createDebugCoverageReport
创建百分比 successfull/fail 个测试用例,但没有覆盖率报告。
然后我尝试了 jacoco {toolVersion "0.7.1.201405082137"} 和任务 jacocoTestReport(type:JacocoReport, dependsOn: "testDebug")。我试图通过各种任务更改 dependsOn 值。该报告显示 0(零)测试覆盖率,这是不可能的,因为所有 类 中至少有一半已经过测试。
在过去的几天里,我遵循了各种公认的堆栈溢出答案。结果是否定的。
我的 gradle 文件:
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
}
}
apply plugin: 'com.android.application'
apply plugin: 'jacoco'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "test.gradle.com.myapplicationtestgradle"
minSdkVersion 21
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(
'proguard-android.txt'), 'proguard-rules.pro'
}
debug {
testCoverageEnabled true
}
}
jacoco {
version "0.7.1.201405082137"
}
packagingOptions {
exclude 'LICENSE.txt'
}
}
jacoco {
toolVersion "0.7.1.201405082137"
}
task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
group = "Reporting"
description = "Generate Jacoco coverage reports"
// exclude auto-generated classes and tests
def fileFilter = ['**/R.class', '**/R$*.class',
'**/BuildConfig.*', '**/Manifest*.*',
'android/**/*.*']
def debugTree = fileTree(dir:
"${project.buildDir}/intermediates/classes/debug",
excludes: fileFilter)
def mainSrc = "${project.projectDir}/src/main/java"
sourceDirectories = files([mainSrc])
classDirectories = files([debugTree])
additionalSourceDirs = files([
"${buildDir}/generated/source/buildConfig/debug",
"${buildDir}/generated/source/r/debug"
])
executionData = fileTree(dir: project.projectDir, includes:
['**/*.exec', '**/*.ec'])
reports {
xml.enabled = true
xml.destination = "${buildDir}/jacocoTestReport.xml"
csv.enabled = false
html.enabled = true
html.destination = "${buildDir}/reports/jacoco"
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('junit:junit:4.11') {
exclude module: 'hamcrest-core'
}
}
今天我确实完全删除了android工作室,android sdk,gradle。然后重新安装一切。在那之后,我只是在应用程序中添加了 build.gradle.
debug {
testCoverageEnabled true
}
然后我运行./gradlew connectedChec。一切都运行良好。 Android 工作室默认的 Jacoco 对我来说工作正常。我认为也可以创建一个 jacocoTestReport 任务,然后创建代码 coverage.I 不知道为什么 gradle 和 android studio 以前没有工作。
我看到你已经让它工作了,但是,有一个更简单的方法来获取单元测试执行数据。我最近也在研究这个,我实际上写了一篇完整的文章earlier today。
在我的情况下,我不想创建额外的 Gradle 任务,因为我希望生成报告作为现有工作流程的一部分。我也不想显式添加 Jacoco 插件,因为 Google already dups Jacoco Ant 任务用于仪器测试的覆盖率报告。
除了设置属性 android.jacoco.version
和 buildTypes.debug.testCoverageEnabled
之外,我还向 testDebug
JVM 参数添加了以下内容以生成执行数据:
project.afterEvaluate {
def append = "append=true"
def destFile = "destfile=$buildDir/outputs/code-coverage/connected/coverage.ec"
testDebug.jvmArgs "-javaagent:$buildDir/intermediates/jacoco/jacocoagent.jar=$append,$destFile"
createDebugCoverageReport.dependsOn testDebug
}
这会将单元测试执行数据附加到 connectedAndroidTest
生成的覆盖率文件中,因此您的报告反映了仪器测试和单元测试,而不是单独的每个变体。
请注意 connectedAndroidTest
会覆盖覆盖率文件,创建报告时请考虑到这一点。如果任务 testDebug
没有任何变化,而你 运行 createDebugCoverageReport
,它只会反映你的 Instrumentation Test 覆盖率。因此,对您的单元测试进行更改。 Linux 命令 touch
在这里可能会有用,虽然我还没有尝试过。
Gradle 已经内置支持生成测试覆盖率报告,我们不需要创建任何额外的配置或添加任何插件来生成测试覆盖率报告。基本上,我们唯一需要做的就是在 build.gradle
文件中将 testCoverageEnabled
参数设置为 true
,如下所示:
android {
buildTypes {
debug {
testCoverageEnabled = true
}
}
}
接下来,我们可以从 CLI 执行以下 Gradle 任务:
./gradlew createDebugCoverageReport
在Windows上,我们可以这样执行:
gradlew.bat createDebugCoverageReport
任务将分析 /src/main/java/
目录中的项目代码和 /src/androidTest/java/
目录中的单元测试。
执行此任务后,我们可以在模块的以下目录中找到测试覆盖率报告:
/build/outputs/reports/coverage/debug/
当我们打开 index.html
文件时,我们可以看到来自测试覆盖率的可视化报告,可以在网络浏览器中查看。
如下图所示。
我在 Android 应用程序中写了一篇关于测试覆盖率报告的文章,并在前段时间发布在我的博客上。如果您对该主题感兴趣,可以在以下位置阅读:
- https://web.archive.org/web/20171210224809/http://blog.wittchen.biz.pl/test-coverage-report-for-android-application(旧博客,有用户评论)
- http://wittchen.io/test-coverage-in-android-applications/(新博客,无用户评论)
更新(Robolectric 测试的单元测试覆盖率)
如果您想从使用 Robolectric 编写的单元测试创建测试覆盖率报告,并使用 Jacoco[=59= 生成测试覆盖率报告], Travis CI and Codecov.io,请看我博客的新文章:
我研究了使用 Jacoco 获取合并代码覆盖率报告的正确方法,您可以在这里查看:https://gist.github.com/ultraon/54cca81ca159ed0a4a9ebf62e89c26ba
我将 AndroidStudio 2.2.2 与 Gradle 3.2 和 Android Gradle 插件 2.2.2
一起使用
我正在尝试生成 Jacoco 代码覆盖率报告。 我已经使用 AndroidTestCase 进行测试 类。
我发现使用 testCoverageEnabled true 并使用默认 android -studio default jacoco, ./gradlew connectedCheck 或 createDebugCoverageReport 创建百分比 successfull/fail 个测试用例,但没有覆盖率报告。
然后我尝试了 jacoco {toolVersion "0.7.1.201405082137"} 和任务 jacocoTestReport(type:JacocoReport, dependsOn: "testDebug")。我试图通过各种任务更改 dependsOn 值。该报告显示 0(零)测试覆盖率,这是不可能的,因为所有 类 中至少有一半已经过测试。
在过去的几天里,我遵循了各种公认的堆栈溢出答案。结果是否定的。
我的 gradle 文件:
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
}
}
apply plugin: 'com.android.application'
apply plugin: 'jacoco'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "test.gradle.com.myapplicationtestgradle"
minSdkVersion 21
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(
'proguard-android.txt'), 'proguard-rules.pro'
}
debug {
testCoverageEnabled true
}
}
jacoco {
version "0.7.1.201405082137"
}
packagingOptions {
exclude 'LICENSE.txt'
}
}
jacoco {
toolVersion "0.7.1.201405082137"
}
task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
group = "Reporting"
description = "Generate Jacoco coverage reports"
// exclude auto-generated classes and tests
def fileFilter = ['**/R.class', '**/R$*.class',
'**/BuildConfig.*', '**/Manifest*.*',
'android/**/*.*']
def debugTree = fileTree(dir:
"${project.buildDir}/intermediates/classes/debug",
excludes: fileFilter)
def mainSrc = "${project.projectDir}/src/main/java"
sourceDirectories = files([mainSrc])
classDirectories = files([debugTree])
additionalSourceDirs = files([
"${buildDir}/generated/source/buildConfig/debug",
"${buildDir}/generated/source/r/debug"
])
executionData = fileTree(dir: project.projectDir, includes:
['**/*.exec', '**/*.ec'])
reports {
xml.enabled = true
xml.destination = "${buildDir}/jacocoTestReport.xml"
csv.enabled = false
html.enabled = true
html.destination = "${buildDir}/reports/jacoco"
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('junit:junit:4.11') {
exclude module: 'hamcrest-core'
}
}
今天我确实完全删除了android工作室,android sdk,gradle。然后重新安装一切。在那之后,我只是在应用程序中添加了 build.gradle.
debug {
testCoverageEnabled true
}
然后我运行./gradlew connectedChec。一切都运行良好。 Android 工作室默认的 Jacoco 对我来说工作正常。我认为也可以创建一个 jacocoTestReport 任务,然后创建代码 coverage.I 不知道为什么 gradle 和 android studio 以前没有工作。
我看到你已经让它工作了,但是,有一个更简单的方法来获取单元测试执行数据。我最近也在研究这个,我实际上写了一篇完整的文章earlier today。
在我的情况下,我不想创建额外的 Gradle 任务,因为我希望生成报告作为现有工作流程的一部分。我也不想显式添加 Jacoco 插件,因为 Google already dups Jacoco Ant 任务用于仪器测试的覆盖率报告。
除了设置属性 android.jacoco.version
和 buildTypes.debug.testCoverageEnabled
之外,我还向 testDebug
JVM 参数添加了以下内容以生成执行数据:
project.afterEvaluate {
def append = "append=true"
def destFile = "destfile=$buildDir/outputs/code-coverage/connected/coverage.ec"
testDebug.jvmArgs "-javaagent:$buildDir/intermediates/jacoco/jacocoagent.jar=$append,$destFile"
createDebugCoverageReport.dependsOn testDebug
}
这会将单元测试执行数据附加到 connectedAndroidTest
生成的覆盖率文件中,因此您的报告反映了仪器测试和单元测试,而不是单独的每个变体。
请注意 connectedAndroidTest
会覆盖覆盖率文件,创建报告时请考虑到这一点。如果任务 testDebug
没有任何变化,而你 运行 createDebugCoverageReport
,它只会反映你的 Instrumentation Test 覆盖率。因此,对您的单元测试进行更改。 Linux 命令 touch
在这里可能会有用,虽然我还没有尝试过。
Gradle 已经内置支持生成测试覆盖率报告,我们不需要创建任何额外的配置或添加任何插件来生成测试覆盖率报告。基本上,我们唯一需要做的就是在 build.gradle
文件中将 testCoverageEnabled
参数设置为 true
,如下所示:
android {
buildTypes {
debug {
testCoverageEnabled = true
}
}
}
接下来,我们可以从 CLI 执行以下 Gradle 任务:
./gradlew createDebugCoverageReport
在Windows上,我们可以这样执行:
gradlew.bat createDebugCoverageReport
任务将分析 /src/main/java/
目录中的项目代码和 /src/androidTest/java/
目录中的单元测试。
执行此任务后,我们可以在模块的以下目录中找到测试覆盖率报告:
/build/outputs/reports/coverage/debug/
当我们打开 index.html
文件时,我们可以看到来自测试覆盖率的可视化报告,可以在网络浏览器中查看。
如下图所示。
我在 Android 应用程序中写了一篇关于测试覆盖率报告的文章,并在前段时间发布在我的博客上。如果您对该主题感兴趣,可以在以下位置阅读:
- https://web.archive.org/web/20171210224809/http://blog.wittchen.biz.pl/test-coverage-report-for-android-application(旧博客,有用户评论)
- http://wittchen.io/test-coverage-in-android-applications/(新博客,无用户评论)
更新(Robolectric 测试的单元测试覆盖率)
如果您想从使用 Robolectric 编写的单元测试创建测试覆盖率报告,并使用 Jacoco[=59= 生成测试覆盖率报告], Travis CI and Codecov.io,请看我博客的新文章:
我研究了使用 Jacoco 获取合并代码覆盖率报告的正确方法,您可以在这里查看:https://gist.github.com/ultraon/54cca81ca159ed0a4a9ebf62e89c26ba
我将 AndroidStudio 2.2.2 与 Gradle 3.2 和 Android Gradle 插件 2.2.2
一起使用