【问题标题】:How to get code coverage reports from google Firebase for Android Espresso tests如何从 google Firebase 获取代码覆盖率报告以进行 Android Espresso 测试
【发布时间】:2017-04-05 04:54:29
【问题描述】:

根据本文档 - https://developer.android.com/studio/test/command-line.html#AMOptionsSyntax,可以从 Firebase 实验室获取代码覆盖率结果。 firebase-community.slack.com 的#test-lab 中的一些人能够让它工作,但经过几次尝试后我仍然碰壁。

我可以通过关注this guide 获得 jacaco 和 emma 的组合代码覆盖率报告,因此我的本地设置没有任何问题,但在尝试向 gcloud cmd 行提供参数以询问覆盖率时出现问题,它会说话关于艾玛的报道。

基本上,当我在本地运行此命令时

gcloud beta test android run \
  --type instrumentation \
  --app app/build/outputs/apk/*-debug-unaligned.apk \
  --test app/build/outputs/apk/*-debug-androidTest-unaligned.apk \
  --device-ids Nexus6\
  --os-version-ids 22 \
  --locales en \
  --orientations portrait \
  --environment-variables coverage=true,coverageFile="/sdcard/coverage.ec" \
--directories-to-pull=/sdcard

我希望生成覆盖率报告,但我在instruments.results文件中得到了这个

INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=
com.godaddy.gdm.telephony.uitests.DialerTabTest:
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: test=dialerTabNumberFormattingTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=.
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: test=dialerTabNumberFormattingTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS_CODE: 0
INSTRUMENTATION_RESULT: stream=

Time: 6.022

OK (1 test)


Error: **Failed to generate emma coverage.**
INSTRUMENTATION_CODE: -1

而 logcat 是这样说的:

11-18 21:38:39.400: I/TestRunner(5246): run finished: 1 tests, 0 failed, 0 ignored
11-18 21:38:39.400: I/TestRunner(5246): [ 11-18 21:38:39.400  5246: 5263 E/         ]
11-18 21:38:39.400: I/TestRunner(5246): Failed to generate emma coverage.
11-18 21:38:39.400: I/TestRunner(5246): java.lang.reflect.InvocationTargetException
11-18 21:38:39.400: I/TestRunner(5246):   at java.lang.reflect.Method.invoke(Native Method)
11-18 21:38:39.400: I/TestRunner(5246):   at java.lang.reflect.Method.invoke(Method.java:372)
11-18 21:38:39.400: I/TestRunner(5246):   at android.support.test.internal.runner.listener.CoverageListener.generateCoverageReport(CoverageListener.java:80)
11-18 21:38:39.400: I/TestRunner(5246):   at android.support.test.internal.runner.listener.CoverageListener.instrumentationRunFinished(CoverageListener.java:68)
11-18 21:38:39.400: I/TestRunner(5246):   at android.support.test.internal.runner.TestExecutor.reportRunEnded(TestExecutor.java:94)
11-18 21:38:39.400: I/TestRunner(5246):   at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:69)
11-18 21:38:39.400: I/TestRunner(5246):   at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262)
11-18 21:38:39.400: I/TestRunner(5246):   at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1853)
11-18 21:38:39.400: I/TestRunner(5246): Caused by: java.io.FileNotFoundException: /sdcard/coverage.ec: open failed: EACCES (Permission denied)
11-18 21:38:39.400: I/TestRunner(5246):   at libcore.io.IoBridge.open(IoBridge.java:456)
11-18 21:38:39.400: I/TestRunner(5246):   at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
11-18 21:38:39.400: I/TestRunner(5246):   at com.vladium.emma.rt.RT.dumpCoverageData(RT.java:50)
11-18 21:38:39.400: I/TestRunner(5246):   ... 8 more
11-18 21:38:39.400: I/TestRunner(5246): Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
11-18 21:38:39.400: I/TestRunner(5246):   at libcore.io.Posix.open(Native Method)
11-18 21:38:39.400: I/TestRunner(5246):   at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
11-18 21:38:39.400: I/TestRunner(5246):   at libcore.io.IoBridge.open(IoBridge.java:442)
11-18 21:38:39.400: I/TestRunner(5246):   ... 10 more

如果需要,我可以提供更多信息。

【问题讨论】:

  • 如何在本地机器上获取代码覆盖率文件?
  • 它通常在 app/build/outputs//jacoco/coverage.ec 文件中。对于确切的一个尝试在您的项目文件夹中搜索coverage.ec
  • 是的,但是当您使用 firebase 运行它时,它不会出现在您的本地计算机上,对吧?我在问你如何把它从 firebase 放到你的本地机器上?
  • 哦,你需要 gsutil 命令。看看medium.com/mobile-testing/…

标签: android firebase code-coverage android-espresso jacoco


【解决方案1】:

如果有人在 Android 10 上遇到此问题,在 Firebase 测试实验室和以上答案不起作用,请尝试添加授权规则(以及 Manifest 和 testCoverageEnabled true 中的权限)。

@get:Rule
val runtimePermissionRule: GrantPermissionRule = GrantPermissionRule.grant(
    Manifest.permission.WRITE_EXTERNAL_STORAGE,     
    Manifest.permission.READ_EXTERNAL_STORAGE
)

【讨论】:

    【解决方案2】:

    事实证明,只需要启用在 SD 卡上写入的正确权限即可。

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    

    在 AndroidManifest.xml 中就像这个 SO answer

    另外,请确保在 app/build.gradle 中启用 testCoverageEnabled true 以进行调试

    debug {
                testCoverageEnabled true
    }
    

    来自这个媒体post

    【讨论】:

    • 如果您的应用因其他原因不需要此权限,请记住仅在调试构建类型中添加此权限
    • 如果您使用标志 --use-orchestrator 启用编排器,则应使用“coverageFilePath”而不是“coverageFile”来获取所有 .ec 文件。否则你会得到一个例外。检查AndroidTestOrchestrator 1.0.2-beta1 的发行说明而且我也没有成功获取除“/sdcard/coverage.ec”以外的文件路径
    猜你喜欢
    • 2016-12-07
    • 2019-09-02
    • 2017-04-24
    • 1970-01-01
    • 2012-01-07
    • 2017-03-23
    • 2014-09-09
    • 2017-02-11
    • 2018-10-09
    相关资源
    最近更新 更多