SaFi Bank Space : Github Action + Firebase Test Lab

To be able to run integration tests through Firebase Test Lab automatically, we need to include the process in the workflow. We will set up a CI/CD workflow based on GitHub Actions and Firebase Test Lab. First, make sure the firebase project has been created, then create a workflow

Github Action Workflow

  1. Go to safi-mobile-app-ci.yml file

  2. Add 2 new job. One job to build apk test and another to run firebase test lab.

jobs:
...
...
...
  integrate:
    name: Integration Testing
    needs:
      - analyze_test_main_app
      ...
      ...
      ...
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 1.8
        uses: actions/setup-java@v3
        with:
          distribution: "zulu"
          java-version: "11"
      - uses: subosito/flutter-action@v2.4.0
        with:
          flutter-version: "3.0.1"
      - name: Assemble app debug APK and Android Instrumentation Tests
        run: |
          cd app/app_safi/
          pushd android
          flutter clean
          flutter pub get
          flutter build apk --debug
          ./gradlew app:assembleAndroidTest
          ./gradlew app:assembleDebug -Ptarget=integration_test/integration_test.dart
          popd
      - name: Upload app APK
        uses: actions/upload-artifact@v3
        with:
          name: app-debug
          path: ${{ github.workspace }}/app/app_safi/build/app/outputs/apk/debug/app-debug.apk
          if-no-files-found: error
      - name: Upload Android Test APK
        uses: actions/upload-artifact@v3
        with:
          name: app-debug-androidTest
          path: ${{ github.workspace }}/app/app_safi/build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk
    
  firebase:
    name: Run UI tests with Firebase Test Lab
    needs: [integrate]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Download app APK
        uses: actions/download-artifact@v3
        with:
          name: app-debug
      - name: Download Android test APK
        uses: actions/download-artifact@v3
        with:
          name: app-debug-androidTest
      - id: "auth"
        name: Login to Google Cloud
        uses: "google-github-actions/auth@v0"
        with:
          credentials_json: "ewogICJ0eXBlIjogInNlcnZpY2VfYWNjb3VudCIsCiAgInByb2plY3RfaWQiOiAiYWNxdWlyZWQtYmFkZ2UtMzQ4NDA1IiwKICAicHJpdmF0ZV9rZXlfaWQiOiAiNDVhMjcyNWQ0YzE5ZTRjODU0YTE2NTVkNTY0NzE0Mzk5NmQyZGNjMyIsCiAgInByaXZhdGVfa2V5IjogIi0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLVxuTUlJRXZRSUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NCS2N3Z2dTakFnRUFBb0lCQVFEZU9IUXkrZFhIdkM5T1xuVTVOU2xvVVM1SUdIS2JQdTRjK3dPTEJWcG0wbmdVWGlaL0VlU0EzeFpTQy9zWnZrQ3Z1elhzNFZFdlRPS3o4b1xuNFcyZTAwMFUrOHNabWc3SDV2K2NHdHI1TlJMMDV3WjJ3cW1xL1QwaDRaOHlOdXdmSjVVSFhhWnFuaE9GR3ZQdVxubmhXNDErRzRHMURkVjRCcDF2bGdTNTVBOFd6L2ltVWdrT0lCRjhkSFdFNzRVUDlHR3lWSExPZWhpRis4c3R5OFxuTXkvcGYrNWhuUHFmV0FNRnJrMDA2N2J3Ky8xdVZyV2YxQW1tUG1ZaHc0Tjg0QWhMZW0wUHNRTGZ4cVJtY0NUZFxuWGtpa2xQZ0tackN6cnJSRWl1MmRkWktjOEhVRjRBajdjSWk0cmFDN0UvdXlOU0xuMk9jc2ZRWEhzSGZPL1ZaWVxuajlta3RhdUZBZ01CQUFFQ2dnRUFNNExEa0xOdjlpb3Rqd3I1ZWVueE0rVnJEd0ZBTjgzNVBpQ040M1MrRmF1MlxuSHRxNFBpdzJxeStsYlRvRzZGQVJjMDAxR1JaNVQ3Y2ZuMkxON2NTT09DQjd2bFlET2h4V1FRSEtvM3pGaGFadFxuemFhbS9MOVI1ZUl1YkUzbDR2emlZMEEybkwxQ3loWnExL09tRm1CWWJyeEtQTnlWSkRPVVA5bVhkL2RlckVjaVxuR0F5ZW9aTUdlZmJ4dmFabUtkQm1zWWlLMTJvNjliNmJyV2tuWkRVR1FZVWJUZ1RHajNrdkZkdXVxTGxmaFQ2d1xuWnpTeFlqS1p3eDFDV3pBNnRTRUxIMmJqeWZsa1FQZnIzWkdFcWxaWmwrR3FHb1lkcGRGc3Frdm8zSmhjU0RsYlxuVjIvOEF6bEdPTURPU3lBSFV2UDhpbVBGcTA3VjNTb2Y0NGZSSUhxc2tRS0JnUUQ3d0RtNUwyUTFJNEtFdDVrcVxuR1JwR25KTTdDQklSaUQrKzVEQmF0VnRCOTRja3hlRDkwMjFOUy9mWW50VFBIcHB5TWZlRHJvcG5WcVd5K1FzVVxuRmNMQ0NZVCtPSm1HSFZLZHF0U0QxemdjVTMyUGZ5b3orOEU1MTM5U3Z2Z0pFMS9hd1NxVGsydHVIUE9ISlBPdVxudU9lbUFyQ0p4d04zT1B5M1JEd25uZVE3blFLQmdRRGgrS0h2WUtBRGlMbi9tRUJCNWZUTjBPUXp4Q3ZPbHJPTVxudWY0dlpUbUpTNGtwWjltK1g2R0dNdmZyd3ZjT3AyUytFNHRGckNRZ1ErN2lMUjd4UE9pbzNqZDlxR0RLS0IzNlxuUEF0Y2kxSkNnMnFkK3FkM0Uzb1VQSFBCeXRMRTNPbGJ1TWZYY3h1WnAraWJ5SWFIZEJJUWlDZFVlZDBOTU41QVxuZHNEVTZhanZDUUtCZ0VYc2wxdmJVTzc5aFBRTjlzbmRuUkc5elpzWTI4UG8zeVBMUjY3NkxuVzlKZGxONlBjM1xuY1dXRjB6cGtxMkUzODlnQ0R1aVJZem5ldERsb3VPNEVPVXNoejhHNHdOT2ljMTc5b3ZkWG9Pc2xPWHZRNjB6elxuQVRGcXJKKzBFVHFjR2dTdG9JREs4b3pzRjZ3UzFHaFVUV3NyMWhMK3B2VEhiRklPN3RKbUpZMTFBb0dCQUw3SFxuN3RndWFRcHl6aTVJT2NBcFNOVFhqME5SVlhiMjd5SmFDWXUwVjY1ZDByRGRtQTNOcVk2bXk0QUdQQlhvSi9yK1xuZnpCVWxLK1ZDME56dXRNTGpKYTkvbldkeWhJRGFzUFJHL3FIT2Uwa0RNalNUYjhQOTVyTUt5TXJmV1Z0NmF0aFxueDM5VUZMSlcrK0ZDbktvUnlncWhHU3VPTTU0bWF3NWI5SlFOcm00WkFvR0FOZStnWlNmdVIzalg0Umlkb1FzelxudHkvdGY3ZE4xSHFLWDFKTTRabGc1TU1xdkFSWG05ZHowd09OQmRMbEwvY01kZjA4L1QxeVBQK3kybWZGMGFpU1xubnExd0g0eWl3ZVNHUlVkdlB1bDR0TDMzTE82azgyUWV0U3RhQktCSUN5V0hhZVdnU1FGZUlheHhWQVVpZEtLNVxuNmVGNm0vOHpsbzNndEE0WGppcjhLRFU9XG4tLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXG4iLAogICJjbGllbnRfZW1haWwiOiAiZmlyZWJhc2UtYWRtaW5zZGstbzZoZGhAYWNxdWlyZWQtYmFkZ2UtMzQ4NDA1LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwKICAiY2xpZW50X2lkIjogIjEwNTkyNjM3NTYyMjU1OTU4MDgzNSIsCiAgImF1dGhfdXJpIjogImh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi9hdXRoIiwKICAidG9rZW5fdXJpIjogImh0dHBzOi8vb2F1dGgyLmdvb2dsZWFwaXMuY29tL3Rva2VuIiwKICAiYXV0aF9wcm92aWRlcl94NTA5X2NlcnRfdXJsIjogImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92MS9jZXJ0cyIsCiAgImNsaWVudF94NTA5X2NlcnRfdXJsIjogImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3JvYm90L3YxL21ldGFkYXRhL3g1MDkvZmlyZWJhc2UtYWRtaW5zZGstbzZoZGglNDBhY3F1aXJlZC1iYWRnZS0zNDg0MDUuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iCn0="
      - name: Set current project
        run: gcloud config set project "acquired-badge-348405"
      - name: Run Instrumentation Tests in Firebase Test Lab
        run: |
          gcloud firebase test android run --type instrumentation \
          --app app-debug.apk \
          --test app-debug-androidTest.apk \
          --device model=Pixel2,version=28,locale=pl,orientation=portrait

- Generate APK job

  1. Using a previously defined setup

  2. Assemble app debug APK and Android Instrumentation Test

    • This stage creates an apk to be tested, and an apk that contains testing data using gradle wrapper command. As previously done on ./android_integration.sh in Integration Testing

  3. Upload app & Upload app test

    • To process the generated apk into the workflow, then use github action actions/upload-artifact

  4. Report Status

    • If there is a problem with job build_apk_test, it will send information on the created slack channel

    • Documentation for slack notification will be on another page

- Run Firebase Test Lab job

  1. Using a previously defined setup

  2. Download app APK & Download Android test APK

    • The apk that has been uploaded is then downloaded to run on firebase

  3. Login to Google Cloud

    • Then connect with firebase using google cloud

    • credential_json obtained from the private key project on google cloud that has been encoded with base64

  4. Set current project

    • This is the project ID that can be obtained from firebase in the project settings

  5. Run Instrumentation Tests in Firebase Test Lab

    • Run the test in firebase test lab

source: Medium