我正在尝试定义位置,jacoco 将为在真实设备上运行的仪器测试创建覆盖文件。
从--debug
gradle 任务的运行中,我看到了这个日志:
[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'
我尝试了 3 种方法来定义位置:
在清单文件中使用<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 覆盖率。
我完全迷失在这里。有任何想法吗?
背景为什么我需要将它存储在另一个地方:adb shell run-as
在某些设备和 Android 版本上存在命令错误,因此我的测试设备场中有设备返回 0% 覆盖率,因为无法提取文件。所以我需要将文件存储在公开可用的位置。