Tae*_*Kim 38 android unit-testing gradle jacoco android-gradle-plugin
我正在尝试使用Gradle Android插件0.10.2获取测试覆盖率报告.但是在运行一些测试后我仍然无法获得覆盖率报告.(connectedAndroidTest).
我的主模块的build.gradle是:
apply plugin: 'android'
android {
compileSdkVersion 19
buildToolsVersion "19.0.3"
defaultConfig {
minSdkVersion 8
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
debug {
testCoverageEnabled true
}
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:19.+'
}
Run Code Online (Sandbox Code Playgroud)
而project的build gradle的buildscript部分是:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.10.+'
}
}
Run Code Online (Sandbox Code Playgroud)
一旦我gradlew connectedAndroidTest从终端运行,我可以在文件夹中找到coverage-instrumented-classes和code-coverage文件build夹.但我coverage在reports文件夹中找不到文件夹.(只有我能看到的是androidTests文件夹)
获取jacoco覆盖率报告有什么遗漏吗?
Tae*_*Kim 100
通过数百次搜索获得报道的答案,我终于找到了我想要的确切答案.
从这篇博文中,我发现gradlew createDebugCoverageReport创建了jacoco覆盖率报告.
此外,从gradle插件源代码,该插件默认使用jacoco 0.6.2.201302030002.(因此,如果您要使用默认版本,则不需要jacoco版本定义)
总之,使用Android gradle插件获取覆盖率报告的ESSENTIAL步骤jacoco如下:
build.gradle)testCoverageEnabled true到您想要的构建类型(即debug)$ gradlew createDebugCoverageReport或gradlew connectedCheck获取jacoco覆盖率报告.您可以在此处找到您的承保范围报告build/reports/coverage/{buildType}.(即build/reports/coverage/debug用于调试版本)
(从@ odiggity的评论中添加多味案例)
如果您的项目使用多风味配置,请create{flavorName}CoverageReport改用.覆盖率报告将在以下位置生成build/reports/coverage/{flavorName}/{buildType}.
使用调试版本类型调整krInternal的示例:
./gradlew createKrInternalDebugCoverageReport build/reports/coverage/krInternal/debug由于您只能使用emulator和获取覆盖率报告,因此device with root permission在常规(非根)设备上运行命令后会出现以下错误:
05:48:33 E/Device: Error during Sync: Permission denied
java.io.IOException: com.android.ddmlib.SyncException: Permission denied
at com.android.builder.testing.ConnectedDevice.pullFile(ConnectedDevice.java:114)
at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:158)
at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:42)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:695)
Caused by: com.android.ddmlib.SyncException: Permission denied
at com.android.ddmlib.SyncService.doPullFile(SyncService.java:511)
at com.android.ddmlib.SyncService.pullFile(SyncService.java:320)
at com.android.ddmlib.Device.pullFile(Device.java:849)
at com.android.builder.testing.ConnectedDevice.pullFile(ConnectedDevice.java:107)
... 10 more
:myDirections:connectedAndroidTest FAILED
FAILURE: Build failed with an exception.
Run Code Online (Sandbox Code Playgroud)
Travis-CI构建脚本以获得代码覆盖率
在build.gradle中包含此块,用于所有模块(库,样本等)
android {
lintOptions {
abortOnError false
}
}
Run Code Online (Sandbox Code Playgroud)
以下是.travis-ci.yml文件
language: android
jdk: oraclejdk8
sudo: required
android:
components:
# Uncomment the lines below if you want to
# use the latest revision of Android SDK Tools
- tools
- platform-tools
# The BuildTools version used by your project
- build-tools-28.0.3
# The SDK version used to compile your project
- android-28
- android-22
- add-on
# Additional components
- extra-google-google_play_services
- extra-android-support
- extra-google-m2repository
- extra-android-m2repository
# Specify at least one system image,
# if you need to run emulator(s) during your tests
- sys-img-armeabi-v7a-android-22
licenses:
- 'android-sdk-preview-license-52d11cd2'
- 'android-sdk-license-.+'
- 'google-gdk-license-.+'
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
cache:
directories:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
- $HOME/.android/build-cache
before_install:
- yes | sdkmanager "build-tools;28.0.3"
before_script:
- echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a -c 100M
- emulator -avd test -no-audio -no-window &
- android-wait-for-emulator
- sleep 180
- adb devices
- adb shell input keyevent 82 &
script:
- ./gradlew build connectedCheck
after_success:
- bash <(curl -s https://codecov.io/bash)
Run Code Online (Sandbox Code Playgroud)
我为此创建了一个开源插件.
Root build.gradle
apply plugin: "com.vanniktech.android.junit.jacoco"
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.3.0'
}
}
Run Code Online (Sandbox Code Playgroud)
然后简单地执行
./gradlew jacocoTestReportDebug // or jacocoTestReportRelease
Run Code Online (Sandbox Code Playgroud)
它将运行JUnit测试,然后在调试构建类型的相应构建目录中以xml和html形式提供Jacoco输出.
因为我的声誉低于50,所以必须添加答案而不是评论...
我想补充的是:
谷歌发布了新的构建工具来修复令人讨厌的"VerifyError"(链接)问题.
如果遇到"VerifyError"问题,请尝试在gradle中更改设置以使用最新的构建工具.例如,
android {
......
buildToolsVersion '21.1.1'
.....
}
Run Code Online (Sandbox Code Playgroud)
由于21.0.0构建工具存在问题,请使用大于21.0.0的版本.我用21.1.1.
Gradle 已经内置支持生成测试覆盖率报告,我们不需要创建任何额外的配置或添加任何插件来生成测试覆盖率报告。基本上,我们唯一需要做的就是在文件中设置testCoverageEnabled参数,如下所示:truebuild.gradle
android {
buildTypes {
debug {
testCoverageEnabled = true
}
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,我们可以从 CLI 执行以下 Gradle 任务:
./gradlew createDebugCoverageReport
Run Code Online (Sandbox Code Playgroud)
在 Windows 上,我们可以这样执行:
gradlew.bat createDebugCoverageReport
Run Code Online (Sandbox Code Playgroud)
任务将分析/src/main/java/目录中我们项目的代码和放置在/src/androidTest/java/目录中的单元测试。执行此任务后,我们可以在模块的以下目录中找到测试覆盖率报告:
/build/outputs/reports/coverage/debug/
Run Code Online (Sandbox Code Playgroud)
当我们打开index.html文件时,我们可以看到测试覆盖率的可视化报告,可以在 Web 浏览器中查看。
它看起来如下图所示。
| 归档时间: |
|
| 查看次数: |
41583 次 |
| 最近记录: |