【Android】Github ActionsでFirebase Test Labの実行を分散する
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
おわりに
分割実行便利ですが、分割していることを忘れて、「指定してないパッケージが実は自動テスト対象になってなかった」なんてことも起きるかもしれません
チーム内でも運用方法は認識を合わせて健全かつ効率的な開発をしていきましょう
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
笹川(エンジニア)
新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!
おすすめ記事
移転したライトコード大阪オフィスを調査せよ!
広告メディア事業部
2024.04.03
日常
【GCP】BIG QUERYを触り程度に理解してみる
かねまさ(エンジニア)
2024.04.02
IT技術
【Next.js】App Router で使用できるキャッシュまとめ
モーリー(エンジニア)
2024.03.29
IT技術
GitHubActionsのランナーに触れてみた
こやまん(エンジニア)
2024.03.28
IT技術
Azure Data FactoryでSlackへ通知をしてみる
たかやん(エンジニア)
2024.03.28
IT技術