经过数百次搜索以获得覆盖率报告的答案,我终于找到了我想要的确切答案。
从this blog post,我发现gradlew createDebugCoverageReport 创建了jacoco 覆盖率报告。
另外,从 gradle 插件source code,该插件默认使用 jacoco 0.6.2.201302030002。 (因此,如果您要使用默认版本,jacoco 版本定义不是必需的)
总之,使用 Android gradle 插件获取jacoco 覆盖率报告的基本步骤是:
- Android gradle 插件版本 0.10.0 或更高版本(通常在您项目的
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}生成。
带有 debug 构建类型的风味 krInternal 示例:
- 命令:
./gradlew createKrInternalDebugCoverageReport
- 报告生成于:
build/reports/coverage/krInternal/debug
提示:
由于您只能使用emulator 和device with root permission 获得覆盖率报告,因此在常规(非root)设备上运行命令后会出现以下错误:
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.
Travis-CI 构建脚本以获得代码覆盖率
将此块包含在 build.gradle 中,适用于所有模块(库、示例等)
android {
lintOptions {
abortOnError false
}
}
下面是.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)