[英]Jacoco Coverage Report issues
我正在嘗試定義位置,jacoco將為真實設備上運行的儀器測試創建覆蓋文件。
從gradle任務的--debug
運行我看到這個日志:
[DEBUG] [org.gradle.api.Task] DeviceConnector 'Nexus 5X - 6.0.1': installing /home/martin/workspace/lib/my-lib/build/outputs/apk/my-lib-debug-androidTest-unaligned.apk
[INFO] [org.gradle.api.Task] Starting 1 tests on Nexus 5X - 6.0.1
[INFO] [org.gradle.api.Task] de.my.lib.utils.UtilsTest testMyTest[Nexus 5X - 6.0.1] [32mSUCCESS [0m
[DEBUG] [org.gradle.api.Task] DeviceConnector 'Nexus 5X - 6.0.1': fetching coverage data from /data/data/de.my.lib.test/coverage.ec
[DEBUG] [org.gradle.api.Task] DeviceConnector 'Nexus 5X - 6.0.1': uninstalling de.my.lib.test 13:46:14.538
[DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':my-lib:connectedDebugAndroidTest'
我嘗試了三種方法來定義位置:
使用清單文件中的<instrumentation>
標記沒有任何改變。
<?xml version="1.0" encoding="utf-8"?>
<manifest
package="de.my.lib.test"
xmlns:android="http://schemas.android.com/apk/res/android">
<instrumentation
android:name="android.support.test.runner.AndroidJUnitRunner"
xmlns:tools="http://schemas.android.com/tools"
android:targetPackage="de.my.lib.test"
tools:replace="android:targetPackage">
<meta-data
android:name="coverage"
android:value="true" />
<meta-data
android:name="coverageFile"
android:value="/sdcard/coverage.ec" />
</instrumentation>
</manifest>
我用gradle嘗試了它,但輸出是相同的:
defaultConfig {
// unimportant stuff
testApplicationId "de.my.lib.test"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
testInstrumentationRunnerArgument('coverageFile', '/sdcard/coverage.ec')
}
最后我用adb
命令試了一下:
adb shell am instrument -w -e coverage true -e coverageFile /sdcard/coverage.ec de.my.lib.test/android.support.test.runner.AndroidJUnitRunner
但在那里我得到2個錯誤:
de.my.lib.utils.UtilsTest :. 找不到類:org.jacoco.agent.rt.internal_773e439.CoverageTransformer。 時間:0,072
好的(1個測試)
錯誤:無法生成emma覆蓋率。
我完全迷失在這里。 有任何想法嗎?
背景為什么我需要它將它存儲在另一個地方:某些設備和Android版本上存在adb shell run-as
命令的錯誤,因此我的測試設備場中的設備返回0%覆蓋率因為文件不能被拉。 所以我需要將文件存儲在公共場所。
但是,尚未生成覆蓋率報告。 要啟用此選項,我們需要向調試版本變量添加屬性。 使用Android插件DSL,我們可以通過
testCoverageEnabled
屬性啟用覆蓋:
android {
...
buildTypes {
debug {
testCoverageEnabled true
}
...
}
}
要在使用2.2版本的Android Gradle插件時啟用本地測試的覆蓋率報告,您需要在應用的
build.gradle
啟用它:
android {
//...
testOptions {
unitTests.all {
jacoco {
includeNoLocationClasses = true
}
}
}
}
通過Jacoco執行的儀器產生包含必要的數據來創建報告(HTML,XML等)執行的文件。 這里的問題是Espresso生成
.ec
文件,而單元測試執行生成.exec
文件......我們有不同的格式!由於我們無法配置Espresso的覆蓋任務,我們必須確保首先執行它。 接下來,我們需要運行單元測試,然后使用兩個文件(
ec
和exec
)創建coverage數據。要啟用此功能,我們需要再次編輯我們的任務,並將
coverage.ec
文件添加為executionData
屬性中的參數:
apply plugin: 'jacoco'
task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'createDebugCoverageReport']) {
reports {
xml.enabled = true
html.enabled = true
}
def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*']
def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: fileFilter)
def mainSrc = "${project.projectDir}/src/main/java"
sourceDirectories = files([mainSrc])
classDirectories = files([debugTree])
executionData = fileTree(dir: "$buildDir", includes: [
"jacoco/testDebugUnitTest.exec",
"outputs/code-coverage/connected/*coverage.ec"
])
}
由於Android Gradle插件2.2。+現在為每次執行生成一個覆蓋文件,使用文件名中的設備/模擬器,現在我們需要將每個文件傳遞給執行數據,因為文件名現在是動態的。 另外,我添加了
createDebugCoverageReport
任務作為我們自定義任務的依賴項,因此我們不需要手動運行它:)最后,當我們執行這兩項任務時,首先運行Espresso測試,我們將獲得統一的覆蓋率報告!
gradle clean jacocoTestReport
有關詳細說明,請參見此處
因此,命令adb shell am instrument
不會生成報告,為此您必須使用gradle解決方案來處理它。 如果你真的想要自己測試它,那么你就要使用自定義跑步者 。
參考文獻:
2) 使用“adb shell am instrument”時如何檢索測試結果
3) https://github.com/jsankey/android-junit-report
更新到命令行方法請按照下列步驟操作。
運行已檢測的應用程序
一旦我們有了EmmaInstrumentation
類(在ref鏈接中),我們需要進行一些調整才能獲得正在運行的應用程序的覆蓋率報告。
首先,我們需要將新的Activity添加到清單中。 其次,如果我們決定生成覆蓋率報告,我們應該允許我們的應用程序寫入SD卡。 為此,您應該授予android.permission.WRITE_EXTERNAL_STORAGE權限。 然后,是時候構建和安裝檢測的apk:
$ ant clean
$ ant instrument
$ ant installi
一切都准備好啟動儀表化的應用程序
$ adb shell am instrument -e coverage true \
-w com.example.i2at.tc/\
com.example.instrumentation.EmmaInstrumentation
這是源代碼。
缺少的CoverageTransformer類提示缺少對JaCoCo代理運行時的依賴關系。 一種簡單的解決方案可能是,為它提供它所需要的(在設備上可用):
testImplementation "org.jacoco:org.jacoco.agent:0.8.3"
如果你得到一個FileNotFoundException
,當ClassNotFoundException
被修復時,請確保有權寫入SD卡,這似乎是另一個可能的陷阱:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
正如我剛才看到的,還有一個org.jacoco.report包,可以選擇添加:
testImplementation "org.jacoco:org.jacoco.report:0.8.3"
包org.jacoco.agent
在每種情況下都是包含CoverageTransformer
類的包。
對我們來說這是一個AOSP應用程序。 我們正在生成帶有禁用Jack編譯器的測試和模塊apks,這導致了這個進一步的問題。 因為對我們來說,Jack編譯器需要生成coverage.em
。 但錯誤並不十分重要。 所以沒有任何進一步的線索。
所以解決方法是運行jack編譯器服務器並獲取使用它生成的apks。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.