DEV Community

Peter Chege
Peter Chege

Posted on

Running Instrumented Tests on Github Actions with Firebase Test Lab

Hello guys welcome back to another article, In the previous article we learnt about generating UI state
in android
.
In today's article we will learn how to run instrumentation tests on GitHub actions via
Firebase Test Lab

Normally when we set up CI/CD pipelines we usually follow 3 general steps
namely: Build,Test and Deploy.
In android development we have different type of tests

  • Unit Test
  • Instrumented Test

Unit Test usually run on the JVM and only test a single portion of your code
i.e a class or a function

Instrumentation tests usually run on an android device (Physical or Emulator).These
tests usually need specify android components to run hence the need for an android
device

On a CI/CD platform like github actions running unit tests is usually straight foward since
you just setup the JDK and run the gradle command as shown below

on:
  push:
    branches: [ main ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Set up JDK
        uses: actions/setup-java@v1
        with:
          java-version: 11
      - name: Cache gradle
        uses: actions/cache@v1
        with:
          path: ~/.gradle/caches
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
          restore-keys: |
             ${{ runner.os }}-gradle-    

      - name: Run Unit Tests with Gradle
        run: ./gradlew test

Enter fullscreen mode Exit fullscreen mode

But when it comes to instrumented test it is a bit tricky because we don't have a android emulator
on our CI server.While there are a few solution to this like using this
action on a macOS runner

The solution I am about share makes it so easy

In comes Firebase Test Lab

As per the description
, Firebase Test Lab is a cloud-based app testing infrastructure that lets you test your app on a range of devices and configurations,
so you can get a better idea of how it'll perform in the hands of live users.

Assuming you have an android project in which you have instrumented tests already written you can proceed

1. Setup a firebase project

For this you need to set up you android app with a firebase project
For more info on how to get started check here

2. Set up your firebase Test Lab Service Account

For use to use the firebase test lab services we need a service account file to help the service
authenticate us.
To do that we need to go to the Google cloud console
here and create a service account (Every firebase project is
essentially a Google cloud project). To create a service account to be used in a CI system
check here (In the example above they use Jenkins
but the same can be used with github actions)

3. Build your androidTest Apk

Once you have defined a device configuration, you should now build and androidTest apk. The androidTest apk
packages all of our tests defined in the androidTest source set into an apk that will be used to
execute the tests. The androidTest apk is usually upload to firebase test lab and the apk is executed
in the cloud.

4. Define a device configuration

For use to execute the apk we need a device. We need to specify some device configuration to test firebase test lab
what kind of device we want our apk to run on. Note that you can run your tests on multiple different types
of devices just to make sure you app runs correctly in different devices

To define a device configuration we create a YAML file in the root of our project
e.g android-device.yml

In there we add the following

android-pixel-4:
  type: instrumentation
  app: app/build/outputs/apk/debug/app-debug.apk
  test: app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk
  device:
    - model: redfin
      version: 30
      locale: 'en'
      orientation: portrait

Enter fullscreen mode Exit fullscreen mode

In the above example we create a device configuration called android-pixel-4 with the following settings :

  • The app- key are a path to the actual debug apk
  • Test - Path to the android test apk
  • device - Device specific settings
    • Model - Device ID of a device supported on firebase test lab. For more device options check here
    • Version - Version of the android OS
    • Locale -
    • Orientation - Orientation of the device when the tests run

5 : Run our tests

Now we are done with the setup, let's run our tests
To run our tests on our workflow add the following to your workflow file
We use this action
to access the firebase test lab APIs in our CI environment

      - name: Build App with Gradle
        run: ./gradlew build

      - name: Build Android Test APK
        run: ./gradlew assembleAndroidTest

      - name: Run Android tests on Firebase Test Lab
        uses: asadmansr/Firebase-Test-Lab-Action@v1.0
        with:
          arg-spec: 'android-device.yml:android-pixel-4'
        env:
          SERVICE_ACCOUNT: ${{ secrets.FIREBASE_TEST_LAB_SERVICE_ACCOUNT }}

Enter fullscreen mode Exit fullscreen mode

The arg-spec specifies the device we defined in the android-device.yml appended with the device
settings. We then put the service account in our GitHub action secrets and reference it in the file

If all is good we should see our test results in the firebase console like this

Firebase Test Lab console

Troubleshooting

If for some reason you workflow fails at the firebase test lab stage, check the log messages, they can help in
deciphering the problem but here are a few possible causes :

  • You wrongly configured the service account i.e. you gave the wrong permissions when creating the service account. Go over the instructions again
  • You probably defined a wrong path to your apks
  • The tests probably were uploaded but failed, Check your tests
  • You passed a model id for your device configuration

I hope you liked this article and I hope it helped you run your instrumentation test more reliably on your CI workflow

For the example project I used here you can find it on GitHub
here

You can also follow me on github and twitter

See you next time 👋👋

Top comments (0)