1

我正在使用 CircleCi 要求 Firebase 测试实验室为我运行仪器测试。测试都运行良好,据我所知,我已经正确设置了一切。但是,我真的很想获得我的代码覆盖率。

SD 卡从不包含代码覆盖率文件,并且在所有日志中我发现这个异常是我怀疑的问题:

    java.io.FileNotFoundException: /jacoco.exec (Read-only file system)
        at java.io.FileOutputStream.open0(Native Method)
        at java.io.FileOutputStream.open(FileOutputStream.java:287)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:223)
        at org.jacoco.agent.rt.internal_8ff85ea.output.FileOutput.openFile(FileOutput.java:67)
        at org.jacoco.agent.rt.internal_8ff85ea.output.FileOutput.startup(FileOutput.java:49)
        at org.jacoco.agent.rt.internal_8ff85ea.Agent.startup(Agent.java:122)
        at org.jacoco.agent.rt.internal_8ff85ea.Agent.getInstance(Agent.java:50)
        at org.jacoco.agent.rt.internal_8ff85ea.Offline.<clinit>(Offline.java:31)
        at org.jacoco.agent.rt.internal_8ff85ea.Offline.getProbes(Offline.java:51)
        at com.acme.android.MyApplication.$jacocoInit(Unknown Source:13)
        at com.acme.android.MyApplication.<clinit>(Unknown Source:0)
        at java.lang.Class.newInstance(Native Method)
        at android.app.Instrumentation.newApplication(Instrumentation.java:1101)
        at android.app.Instrumentation.newApplication(Instrumentation.java:1086)
        at android.app.LoadedApk.makeApplication(LoadedApk.java:942)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5765)
        at android.app.ActivityThread.-wrap1(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

这就是我所说的 Firebase 测试实验室:

    - run:
        name: Run instrumented test on Firebase Test Lab
        command: gcloud firebase test android run --type instrumentation --app debug-app.apk --test debug-test.apk --device model=Nexus5X,version=26,locale=en,orientation=portrait --environment-variables coverage=true,coverageFile="/sdcard/tempDir/coverage.ec" --directories-to-pull=/sdcard --timeout 20m --no-record-video

这就是我获取应该包含覆盖文件的工件的方式:

  - run:
      name: Download instrumented test results from Firebase Test Lab
      command: gsutil -m cp -r -U "`gsutil ls gs://test-lab-XXXXXX-YYYYY | tail -1`*" /root/workspace/firebase/ || true

我还确认覆盖文件没有作为工件存储在 Firebase 中。

我的 gradle 文件启用了代码覆盖率:

buildTypes {
    debug {
        matchingFallbacks = ["prod"]
        minifyEnabled false
        debuggable true
        versionNameSuffix '-DEBUG'
        testCoverageEnabled true
    }

jacoco 似乎默认为根文件夹,并且在尝试在那里写入覆盖文件时获得了 Android 文件系统拒绝的权限。任何帮助将不胜感激。

谢谢,

4

1 回答 1

3

我在这里找到了答案:https ://medium.com/mobile-testing/generating-code-coverage-from-espresso-tests-running-in-firebase-test-lab-e98edcea7bdf

问题是覆盖文件的路径。而不是/sdcard/tempDir/coverage.ec应该只是/sdcard/coverage.ec. 结果tempDir不存在,因此在尝试写入该文件夹时失败。

这是有效的环境变量选项:

--environment-variables coverage=true,coverageFile="/sdcard/coverage.ec

于 2018-04-10T23:17:06.947 回答