Android の Android Test のコマンドライン実行に関する覚え書き
Android Developers での説明 ⇒ https://developer.android.com/studio/test/command-line
$ ./gradlew connectedAndroidTest
で実行できる。ビルドタイプ = Release はデフォルトで実行されない。
もし Release ビルドも実行したい場合はこちら ⇒ https://stackoverflow.com/questions/32024574/is-there-connectedreleaseandroidtest-gradle-task
ただ、このままだとプロダクトフレーバ毎に実行されるので、現実的には下記のようにプロダクトフレーバーで絞って実行した方がよさそう。通信モックされたフレーバを用意しておくと、外部環境に依存しないテストができる(とはいえ、API サーバ含めた接続テスト・統合テスト的な意味合いでテストしたい場合もあると思うのでケースバイケース)。
$ ./gradlew connectedMockDebugAndroidTest
メソッド指定で実行するには、次のようにクラス名とメソッドを指定すればよい。
$ ./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=io.github.hkusu.sample.MainActivityTest#hogeMethod
例えば、起動だけ確認だけできればよいという場合などに使えそう。
GitHub Actions で実行する例
jobs:
android-test:
runs-on:
group: your-larger-runners-group # GitHub Larger Runners のグループを指定。MacでなくUbuntu系のRunnerでOK
strategy:
matrix:
api-level: [23, 26, 30]
fail-fast: false
timeout-minutes: 30 # エミュレータでのテストは不安定なのでタイムアウトを指定
steps:
- name: Check out
uses: actions/checkout@v3
- name: Set up JDK
uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: 11
- name: Enable KVM group perms
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Run Android test
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ matrix.api-level }}
target: 'google_apis'
arch: 'x86'
profile: 'pixel'
disable-animations: true
script: ./gradlew connectedMockDebugAndroidTest
※ キャッシュを導入したり実行時の Gradle オプションを工夫したりもできそうだが、テスト実行の長さに比べると些細な違いしかないので上記の例では特に何もしていない
参考
- https://github.com/android/nowinandroid/blob/b91773d05358fee6cbc64bc9de90817522399a3d/.github/workflows/Build.yaml
-
https://github.blog/changelog/2023-02-23-hardware-accelerated-android-virtualization-on-actions-windows-and-linux-larger-hosted-runners/
- 試したところ、たしかに GitHub hosted の Mac の runner より 2-3 倍は速い感じがした
- 使用した Runner は 8 core のもの。グループに並列処理したいだけぶら下げた https://speakerdeck.com/hkusu/android-no-ci-github-actions-nogai-shan-de-zui-jin-yatutakoto?slide=9
- 試したところ、たしかに GitHub hosted の Mac の runner より 2-3 倍は速い感じがした
例えばライブラリ導入時なんかは、全 API レベルで起動確認しておくと安心感がある。アプリを起動するだけのテストコードを書いて、上記の GitHub Actions のようなワークフローで全 API レベル&メソッド指定で実行するとよさそう。
とはいえまだまだ実行が遅い。2019 年の Android Developers Blog だが、このような環境の方が速いのか? ⇒ https://android-developers.googleblog.com/2019/10/continuous-testing-with-new-android.html
もしくは、GitHub Actions のキャッシュを利用して、ダウンロードしたり作成したりしたエミュレータを使い回すような仕組みを作るとよい?システムイメージはこのあたりに保存されている ⇒ https://developer.android.com/studio/run/emulator-commandline?system-filedir#system-filedir ただ1リポジトリあたりで使えるキャッシュは合計10Gまでなので、キャッシュするにはサイズが大きすぎるかも