• トップ
  • ブログ一覧
  • 【Android】Github ActionsでFirebase Test Labの実行を分散する
  • 【Android】Github ActionsでFirebase Test Labの実行を分散する

    笹川(エンジニア)笹川(エンジニア)
    2024.04.02

    IT技術

    Github ActionsでFirebase Test Labの実行を分散する

    (株)ライトコードでモバイルアプリケーションメインで色々開発している笹川(ささがわ)です!

    今回はGithub ActionsでFirebase Test Labの実行を分散するステップの書き方を紹介したいと思います

    基本の書き方

    基本的にはFirebase Test Labの公式ドキュメントを見ながら書いてもらうのが良いと思います

    下記は一例です

    プルリクエストが作られた時に、アプリケーションをビルドしてTestLabに渡しています

    1name: ui-test
    2on:
    3  pull_request:
    4
    5env:
    6  GOOGLE_PROJECT_ID: "{project_id}"
    7  RESULT_BUCKET: "{result_bucket}"
    8
    9jobs:
    10  ui-test:
    11    runs-on: ubuntu-latest
    12    steps:
    13      - uses: actions/checkout@v3
    14      - uses: actions/setup-java@v3
    15        with:
    16          java-version: '{各自の環境で}'
    17      - name: Build
    18        run: |
    19          ./gradlew assembleDebug
    20          ./gradlew assembleDebugAndroidTest
    21      - uses: google-github-actions/setup-gcloud@v1
    22      - name: Login to Google Cloud
    23        run: |
    24          echo ${{ secrets.gcp用の認証鍵 }} | base64 -d > ${HOME}/gcloud-service-key.json
    25          gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json
    26          gcloud --quiet config set project ${GOOGLE_PROJECT_ID}
    27          gcloud info
    28      - name: Run Instrumentation Tests in Firebase Test Lab
    29        run: >
    30          gcloud firebase test android run 
    31          --type instrumentation 
    32          --app {パス}/app-debug.apk
    33          --test  {パス}/app-debug-androidTest.apk
    34          --device {デバイス指定}
    35          --results-bucket ${RESULT_BUCKET}
    36          --timeout 45m
    37      - name: Install gsutil dependency and copy test results data
    38        run: |
    39          mkdir -p ~/firebase_test_results
    40          sudo pip install -U crcmod
    41          sudo gsutil -m cp -r -U `sudo gsutil ls gs://${RESULT_BUCKET} ~/firebase_test_results

    何が問題なのか

    上記の基本的な書き方で問題はないといえばないです

    ですが、テストケースが増えてくると実行時間が多くかかってしまいます

    プロダクトの開発が進むにつれてテストケースも増加するはずです

    そうなると待ち時間も増えますし、TestLabやCIの制限時間の影響を受け最後まで実行されない懸念が生まれます

    そうだ、分散しよう

    まず前提として、テストケースを削ることはできません

    なので分割実行という手段が良さそうです

    Firebase Test Labではオプションで対象を指定することができます

    1-test-targets

    このオプションを使って、パッケージ(ディレクトリ)を指定すれば分割実行ができるようになります

    例えばですが、画面ごとでディレクトリを分けておけば

    1--test-targets "package com.example.app.login"

    のようにログイン機能のUIテストだけ分割して実行できます

    以下が分割後の全文になります

    1name: ui-test
    2
    3on:
    4  pull_request:
    5
    6env:
    7  GOOGLE_PROJECT_ID: "{project_id}"
    8  RESULT_BUCKET: "{result_bucket}"
    9
    10concurrency:
    11  group: ${{ github.workflow }}-${{ github.ref }}
    12  cancel-in-progress: true
    13
    14jobs:
    15  build:
    16    runs-on: ubuntu-latest
    17    steps:
    18      - uses: actions/checkout@v3
    19      - uses: actions/setup-java@v3
    20        with:
    21          java-version: '{各自の環境で}'
    22      - name: Build
    23        run: |
    24          ./gradlew assembleDebug 
    25          ./gradlew assembleDebugAndroidTest
    26      - uses: actions/upload-artifact@v4
    27        with:
    28          name: debug.apk
    29          path: {パス}/debug.apk
    30      - uses: actions/upload-artifact@v4
    31        with:
    32          name: debug-androidTest.apk
    33          path: {パス}/debug-androidTest.apk
    34  ui-test1:
    35    needs: [ build ]
    36    runs-on: ubuntu-latest
    37    permissions: write-all
    38    steps:
    39      - uses: actions/download-artifact@v4
    40        with:
    41          name: debug.apk
    42      - uses: actions/download-artifact@v4
    43        with:
    44          name: debug-androidTest.apk
    45      - uses: google-github-actions/setup-gcloud@v1
    46      - name: Login to Google Cloud
    47        run: |
    48          echo ${{ secrets.gcp用の認証鍵 }} | base64 -d > ${HOME}/gcloud-service-key.json
    49          gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json
    50          gcloud --quiet config set project ${GOOGLE_PROJECT_ID}
    51          gcloud info
    52      - name: Run Instrumentation Tests in Firebase Test Lab
    53        run: >
    54          gcloud firebase test android run
    55          --type instrumentation
    56          --app $GITHUB_WORKSPACE/debug.apk
    57          --test $GITHUB_WORKSPACE/debug-androidTest.apk
    58          --test-targets "package {分割したいパッケージ1}" #ここの設定が大事
    59          --device {デバイス指定}
    60          --results-bucket ${RESULT_BUCKET}
    61          --timeout 45m
    62  ui-test2:
    63    needs: [ build ]
    64    runs-on: ubuntu-latest
    65    permissions: write-all
    66    steps:
    67      - uses: actions/download-artifact@v4
    68        with:
    69          name: debug.apk
    70      - uses: actions/download-artifact@v4
    71        with:
    72          name: debug-androidTest.apk
    73      - uses: google-github-actions/setup-gcloud@v1
    74      - name: Login to Google Cloud
    75        run: |
    76          echo ${{ secrets.gcp用の認証鍵 }} | base64 -d > ${HOME}/gcloud-service-key.json
    77          gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json
    78          gcloud --quiet config set project ${GOOGLE_PROJECT_ID}
    79          gcloud info
    80      - name: Run Instrumentation Tests in Firebase Test Lab
    81        run: >
    82          gcloud firebase test android run
    83          --type instrumentation
    84          --app $GITHUB_WORKSPACE/debug.apk
    85          --test $GITHUB_WORKSPACE/debug-androidTest.apk
    86          --test-targets "package {分割したいパッケージ2}"
    87          --device {デバイス指定}
    88          --results-bucket ${RESULT_BUCKET}
    89          --timeout 45m

    おわりに

    分割実行便利ですが、分割していることを忘れて、「指定してないパッケージが実は自動テスト対象になってなかった」なんてことも起きるかもしれません

    チーム内でも運用方法は認識を合わせて健全かつ効率的な開発をしていきましょう

    笹川(エンジニア)

    笹川(エンジニア)

    おすすめ記事