son*_*fRa 5 android code-coverage firebase firebase-test-lab
我们目前正在尝试使用 Google 的 Firebase 测试实验室在设备上测试我们的 android 应用程序。为了测试,我创建了一个小应用程序,除了测试之外什么都不做,到目前为止它运行良好,除了推荐的方法(直接取自文档页面)来实现代码覆盖率,似乎没有与协调器正常工作。
使用以下 gcloud 命令:
gcloud firebase test android run --results-bucket=<hidden> --use-orchestrator --type instrumentation --device model=Pixel2,version=29 --device model=Pixel2,version=28 --app app/build/outputs/apk/debug/app-debug.apk --test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk --environment-variables clearPackageData=true,coverage=true,coverageFilePath=/sdcard/ --directories-to-pull=/sdcard/
Run Code Online (Sandbox Code Playgroud)
测试成功运行,但对于每个单独的测试执行,覆盖执行数据的创建失败。logcat 条目如下所示:
04-08 09:50:37.874: E/CoverageListener(8114): Failed to generate Emma/JaCoCo coverage.
04-08 09:50:37.874: E/CoverageListener(8114): java.lang.reflect.InvocationTargetException
04-08 09:50:37.874: E/CoverageListener(8114): at java.lang.reflect.Method.invoke(Native Method)
04-08 09:50:37.874: E/CoverageListener(8114): at androidx.test.internal.runner.listener.CoverageListener.generateCoverageReport(CoverageListener.java:101)
04-08 09:50:37.874: E/CoverageListener(8114): at androidx.test.internal.runner.listener.CoverageListener.instrumentationRunFinished(CoverageListener.java:70)
04-08 09:50:37.874: E/CoverageListener(8114): at androidx.test.internal.runner.TestExecutor.reportRunEnded(TestExecutor.java:92)
04-08 09:50:37.874: E/CoverageListener(8114): at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:65)
04-08 09:50:37.874: E/CoverageListener(8114): at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:392)
04-08 09:50:37.874: E/CoverageListener(8114): at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2145)
04-08 09:50:37.874: E/CoverageListener(8114): Caused by: java.io.FileNotFoundException: /sdcard/com.example.citest.AnotherInstrumentedTest#testSdkVersion.ec (Permission denied)
04-08 09:50:37.874: E/CoverageListener(8114): at java.io.FileOutputStream.open0(Native Method)
04-08 09:50:37.874: E/CoverageListener(8114): at java.io.FileOutputStream.open(FileOutputStream.java:308)
04-08 09:50:37.874: E/CoverageListener(8114): at java.io.FileOutputStream.<init>(FileOutputStream.java:238)
04-08 09:50:37.874: E/CoverageListener(8114): at com.vladium.emma.rt.RT.dumpCoverageData(RT.java:50)
04-08 09:50:37.874: E/CoverageListener(8114): ... 7 more
Run Code Online (Sandbox Code Playgroud)
这向我表明该应用程序没有写入外部存储的权限,但添加后仍然无法正常工作
gcloud firebase test android run --results-bucket=<hidden> --use-orchestrator --type instrumentation --device model=Pixel2,version=29 --device model=Pixel2,version=28 --app app/build/outputs/apk/debug/app-debug.apk --test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk --environment-variables clearPackageData=true,coverage=true,coverageFilePath=/sdcard/ --directories-to-pull=/sdcard/
Run Code Online (Sandbox Code Playgroud)
应用程序的清单以及 androidTest 文件夹中的附加清单。
将命令更改为不再使用编排器,而是使用文档中指示的单个覆盖文件时:
gcloud firebase test android run --results-bucket=<hidden> --no-use-orchestrator --type instrumentation --device model=Pixel2,version=29 --device model=Pixel2,version=28 --app app/build/outputs/apk/debug/app-debug.apk --test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk --environment-variables coverage=true,coverageFile=/sdcard/coverage.ec --directories-to-pull=/sdcard/
Run Code Online (Sandbox Code Playgroud)
使用版本 28 的设备的覆盖文件已成功创建,但对于使用版本 29 的设备,它仍然失败
04-08 05:07:43.341: E/CoverageListener(9398): Failed to generate Emma/JaCoCo coverage.
04-08 05:07:43.341: E/CoverageListener(9398): java.lang.reflect.InvocationTargetException
04-08 05:07:43.341: E/CoverageListener(9398): at java.lang.reflect.Method.invoke(Native Method)
04-08 05:07:43.341: E/CoverageListener(9398): at androidx.test.internal.runner.listener.CoverageListener.generateCoverageReport(CoverageListener.java:101)
04-08 05:07:43.341: E/CoverageListener(9398): at androidx.test.internal.runner.listener.CoverageListener.instrumentationRunFinished(CoverageListener.java:70)
04-08 05:07:43.341: E/CoverageListener(9398): at androidx.test.internal.runner.TestExecutor.reportRunEnded(TestExecutor.java:92)
04-08 05:07:43.341: E/CoverageListener(9398): at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:65)
04-08 05:07:43.341: E/CoverageListener(9398): at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:392)
04-08 05:07:43.341: E/CoverageListener(9398): at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2189)
04-08 05:07:43.341: E/CoverageListener(9398): Caused by: java.io.FileNotFoundException: /sdcard/coverage.ec: open failed: EACCES (Permission denied)
04-08 05:07:43.341: E/CoverageListener(9398): at libcore.io.IoBridge.open(IoBridge.java:496)
04-08 05:07:43.341: E/CoverageListener(9398): at java.io.FileOutputStream.<init>(FileOutputStream.java:235)
04-08 05:07:43.341: E/CoverageListener(9398): at com.vladium.emma.rt.RT.dumpCoverageData(RT.java:50)
04-08 05:07:43.341: E/CoverageListener(9398): ... 7 more
04-08 05:07:43.341: E/CoverageListener(9398): Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
04-08 05:07:43.341: E/CoverageListener(9398): at libcore.io.Linux.open(Native Method)
04-08 05:07:43.341: E/CoverageListener(9398): at libcore.io.ForwardingOs.open(ForwardingOs.java:167)
04-08 05:07:43.341: E/CoverageListener(9398): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:252)
04-08 05:07:43.341: E/CoverageListener(9398): at libcore.io.ForwardingOs.open(ForwardingOs.java:167)
04-08 05:07:43.341: E/CoverageListener(9398): at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7255)
04-08 05:07:43.341: E/CoverageListener(9398): at libcore.io.IoBridge.open(IoBridge.java:482)
04-08 05:07:43.341: E/CoverageListener(9398): ... 9 more
Run Code Online (Sandbox Code Playgroud)
在所有情况下,只需通过在本地模拟器上运行 android 设备测试gradle cAT,即可生成有效的覆盖文件,并且仅在通过 Firebase 测试实验室运行测试时才会出现问题。
使用版本 28 的设备的覆盖文件已成功创建,但对于使用版本 29 的设备,仍然失败
所以,我遇到了同样的问题,正是这个评论让我找到了解决方案。
基本上在 Android 10+ 中,他们将应用程序与外部设备交互的方式更改为“范围内”方法。更多详细信息请参见:https ://developer.android.com/training/data-storage
据我所知,无论哪个库试图将coverage.ec写入SD卡,都没有按照这种“作用域”方法正确执行。
因此,将其添加到您的 AndroidManifest.xml 中:
<application
android:requestLegacyExternalStorage="true">
</application>
Run Code Online (Sandbox Code Playgroud)
它会告诉 Android 使用旧的非“范围”方法写入 SD 卡,然后我发现它可以正常工作。
我认为这只是暂时的,这可能不适用于 Android 11。但是某些库需要更新以更改其写入 /sdcard 的方式。
| 归档时间: |
|
| 查看次数: |
493 次 |
| 最近记录: |