• トップ
  • ブログ一覧
  • 【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に渡しています

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

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

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

    おわりに

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

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

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    笹川(エンジニア)
    笹川(エンジニア)
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background