我正在尝试使用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.+'
}
项目构建gradle的buildscript部分是:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.10.+'
}
}
从终端运行gradlew connectedAndroidTest
后,我可以在coverage-instrumented-classes
文件夹中找到code-coverage
和build
文件夹。但我在coverage
文件夹中找不到reports
文件夹。 (只有我能看到androidTests
文件夹)
获取jacoco覆盖率报告是否有任何遗漏?
答案 0 :(得分:98)
在数百次寻找报道的答案中,我终于找到了我想要的答案。
从this blog post,我发现gradlew createDebugCoverageReport
创建了jacoco覆盖率报告。
此外,从gradle插件source code开始,该插件默认使用jacoco 0.6.2.201302030002。 (因此,如果您要使用默认版本,则不需要 jacoco版本定义)
总之,使用Android gradle插件获取jacoco
覆盖率报告的 ESSENTIAL 步骤为:
build.gradle
)testCoverageEnabled true
添加到您想要的构建类型(即debug
)$ gradlew createDebugCoverageReport
或gradlew connectedCheck
以获取jacoco
覆盖率报告。您可以在build/reports/coverage/{buildType}
找到您的承保范围报告。 (即build/reports/coverage/debug
用于调试版本)
(从@ odiggity&#39评论中添加多味案例)
如果您的项目使用多风味配置,请改用create{flavorName}CoverageReport
。覆盖率报告将在build/reports/coverage/{flavorName}/{buildType}
生成。
带 debug 构建类型的 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.
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)
答案 1 :(得分:7)
我为此创建了open source plugin。
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'
}
}
然后只需执行
./gradlew jacocoTestReportDebug // or jacocoTestReportRelease
它将运行JUnit测试,然后在调试构建类型的相应构建目录中以xml和html形式提供Jacoco输出。
答案 2 :(得分:6)
由于我的声誉低于50,所以必须添加答案而不是评论...
我想补充的是:
谷歌发布了新的构建工具,修复了令人讨厌的“VerifyError”(link)问题。如果遇到“VerifyError”问题,请尝试更改gradle中的设置以使用最新的构建工具。例如,
android {
......
buildToolsVersion '21.1.1'
.....
}
由于21.0.0构建工具存在问题,请使用大于21.0.0的版本。我用21.1.1。
答案 3 :(得分:3)
如果您想使用与默认版本不同的版本,请添加
jacoco {
version = '0.7.3.201502191951'
}
在您应用的android
内的build.gradle
标记内。
查找最新版本号的一种方法:搜索&#34; org.jacoco:jacoco&#34;在JCenter。
答案 4 :(得分:2)
Gradle已经内置了对生成测试覆盖率报告的支持,我们不需要创建任何其他配置或添加任何插件来生成测试覆盖率报告。基本上,我们唯一需要做的就是在testCoverageEnabled
文件中将true
参数设置为build.gradle
,如下所示:
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应用程序中的测试覆盖率报告的文章 http://blog.wittchen.biz.pl/test-coverage-report-for-android-application/