【Android】Github ActionsでFirebase Test Labの実行を分散する
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
おわりに
分割実行便利ですが、分割していることを忘れて、「指定してないパッケージが実は自動テスト対象になってなかった」なんてことも起きるかもしれません
チーム内でも運用方法は認識を合わせて健全かつ効率的な開発をしていきましょう
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!