How to get code coverage reports from Google Firebase tests for Android Espresso

Based on this documentation - https://developer.android.com/studio/test/command-line.html#AMOptionsSyntax , you can get code coverage results from the Firebase lab. Some people at # test-lab at firebase-community.slack.com may make it work, but after several attempts, I still click on the wall.

I can get a combined jacaco and emma code coverage report by following this guide , so there is nothing wrong with my local setup, but it is problematic when trying to give arguments to gcloud cmd to request coverage numbers, and that says emma coverage.

Essentially when I run this command locally

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 

I expect a coverage report to be generated, but I get this in the tools.results file

 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 

And logcat says the following:

 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 

If necessary, I can provide additional information.

+11
android code-coverage firebase android-espresso jacoco
source share
1 answer

It turned out that all that was needed was to give the correct permission to write to the SD card.

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

in AndroidManifest.xml, as in this SO answer

Also, make sure testCoverageEnabled true is enabled in app / build.gradle for debugging

 debug { testCoverageEnabled true } 

from this middle position

+9
source share

All Articles