我使用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
这就是我抓取应该包含coverage文件的工件的方法:
- 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默认为根文件夹,并且在尝试在那里编写coverage文件时,Android文件系统正在获得权限被拒绝。任何帮助将不胜感激。
谢谢,
答案 0 :(得分:1)
问题是覆盖文件的路径。而不是/sdcard/tempDir/coverage.ec
,它应该只是/sdcard/coverage.ec
。结果tempDir
不存在,因此在尝试写入该文件夹时失败。
这是有效的环境变量选项:
--environment-variables coverage=true,coverageFile="/sdcard/coverage.ec