Android Instrumented Tests on Firebase Test Lab with Travis CI

If Travis CI is your Continuous Integration service, running Instrumented Tests right on the Travis CI build is a bad idea. You can only use ARM emulator on Travis CI, which is very slow. You might fail your tests because of Activity not launched within 45 seconds.
Not even mention you have to setup emulator environment on Travis CI build which takes extra 10 minutes.

Travis Build Matrix

If you had Unit Test already, use Travis CI build matrix feature is the best practice to separate unit tests and instrumented test.

env:  
    global:
        - ANDROID_TARGET=android-26
        # Firebase
        - CLOUD_PROJECT_ID=your_project_name

    matrix:
        - TEST_METHOD=UNIT
        - TEST_METHOD=INSTRUMENTED

I have a rake task for testing

def test  
    method = ENV["TEST_METHOD"]
    if method == "UNIT"
        puts "Unit Testing .."
        sh "./gradlew jacocoTestReport"
    elsif method == "INSTRUMENTED"
        puts "UI Testing"

        # Build
        sh "./gradlew assembleGlobalDebug assembleGlobalDebugAndroidTest -PdisablePreDex"

        # Send to firebase
        sh " bash -x send_instrumented_test_to_firebase.sh"
    else 
        puts "unsupported TEST_METHOD arg"
    end
end  
Encrypt your Firebase service account for Travis CI

It's always good to protect your privileged access token. You can use Travis CLI to encrypt files and decrypt it on CI build. (see Encryption keys)

travis encrypt-file your_firebase_service_account.json  

It then output your_firebase_service_account.json.enc file. Don't forget to commit this encrypted file to your git repository.

Send to Firebase Test lab

I have another send_instrumented_test_to_firebase.sh file as an isolated script for uploading APKs to Firebase, which is executed inside rake's test task.

#!/bin/bash


# Firebase service account decrypt
openssl aes-256-cbc -K $encrypted_xxxxxx_key -iv $encrypted_xxxxx_iv -in your_firebase_service_account.json.enc -out /tmp/service-account.json -d

# Firebase setup
wget --quiet --output-document=/tmp/google-cloud-sdk.tar.gz https://dl.google.com/dl/cloudsdk/channels/rapid/google-cloud-sdk.tar.gz  
mkdir -p /opt  
tar zxf /tmp/google-cloud-sdk.tar.gz --directory /opt  
/opt/google-cloud-sdk/install.sh --quiet
source /opt/google-cloud-sdk/path.bash.inc

# Setup and configure the project
gcloud components update  
echo $CLOUD_PROJECT_ID  
gcloud config set project $CLOUD_PROJECT_ID

# Activate cloud credentials
gcloud auth activate-service-account --key-file /tmp/service-account.json

# List available options for logging purpose only (so that we can review available options)
gcloud firebase test android models list  
gcloud firebase test android versions list

gcloud firebase test android run \  
    --type instrumentation \
    --app mobile/build/outputs/apk/global/debug/mobile-global-debug.apk \
    --test mobile/build/outputs/apk/androidTest/global/debug/mobile-global-debug-androidTest.apk \
    --device model=Pixel2,version=27,locale=en,orientation=portrait  \
    --device model=NexusLowRes,version=24,locale=en,orientation=portrait

Result

On Travis CI:

On Firebase Test Lab:

comments powered by Disqus