[英]How do I get a jacoco coverage report using Android gradle plugin 0.10.0 or higher?
我正在嘗試使用 Gradle Android 插件 0.10.2 獲取測試覆蓋率報告。 但是在運行一些測試后我仍然無法獲得覆蓋率報告。 (連接AndroidTest)。
我的主模塊的 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
后,我可以在build
文件夾中找到coverage-instrumented-classes
和code-coverage
文件夾。 但是我在reports
文件夾中找不到coverage
文件夾。 (只有我能看到androidTests
文件夾)
獲得 jacoco 覆蓋率報告有什么遺漏嗎?
經過數百次搜索獲得覆蓋報告的答案,我終於找到了我想要的確切答案。
從這篇博客文章中,我發現gradlew createDebugCoverageReport
創建了 jacoco 覆蓋率報告。
此外,從 gradle 插件源代碼來看,該插件默認使用 jacoco 0.6.2.201302030002。 (因此,如果您要使用默認版本,則不需要 jacoco 版本定義)
總之,使用 Android gradle 插件獲取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
由於您只能使用device with root permission
的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)
我為此創建了一個開源插件。
根構建.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 輸出。
必須添加答案而不是評論,因為我的聲譽低於 50...
我想補充的是:
Google 發布了新的構建工具,修復了令人討厭的“VerifyError”(鏈接)問題。
如果遇到“VerifyError”問題,請嘗試更改 gradle 中的設置以使用最新的構建工具。 例如,
android {
......
buildToolsVersion '21.1.1'
.....
}
由於 21.0.0 構建工具有問題,請使用大於 21.0.0 的版本。 我使用 21.1.1。
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
文件時,我們可以看到測試覆蓋率的可視化報告,可以在 Web 瀏覽器中查看。
它看起來如下圖所示。
如果要使用與默認版本不同的版本,請添加
jacoco {
version = '0.7.3.201502191951'
}
在您應用的build.gradle
的android
標簽內。
查找最新版本號的一種方法:在JCenter上搜索“org.jacoco:jacoco”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.