Open6

Android の Android Test のコマンドライン実行に関する覚え書き

hkusuhkusu

$ ./gradlew connectedAndroidTest で実行できる。ビルドタイプ = Release はデフォルトで実行されない。

もし Release ビルドも実行したい場合はこちら ⇒ https://stackoverflow.com/questions/32024574/is-there-connectedreleaseandroidtest-gradle-task

ただ、このままだとプロダクトフレーバ毎に実行されるので、現実的には下記のようにプロダクトフレーバーで絞って実行した方がよさそう。通信モックされたフレーバを用意しておくと、外部環境に依存しないテストができる(とはいえ、API サーバ含めた接続テスト・統合テスト的な意味合いでテストしたい場合もあると思うのでケースバイケース)。

$ ./gradlew connectedMockDebugAndroidTest
hkusuhkusu

メソッド指定で実行するには、次のようにクラス名とメソッドを指定すればよい。

$ ./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=io.github.hkusu.sample.MainActivityTest#hogeMethod

例えば、起動だけ確認だけできればよいという場合などに使えそう。

hkusuhkusu

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 オプションを工夫したりもできそうだが、テスト実行の長さに比べると些細な違いしかないので上記の例では特に何もしていない

参考

hkusuhkusu

例えばライブラリ導入時なんかは、全 API レベルで起動確認しておくと安心感がある。アプリを起動するだけのテストコードを書いて、上記の GitHub Actions のようなワークフローで全 API レベル&メソッド指定で実行するとよさそう。

hkusuhkusu

とはいえまだまだ実行が遅い。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までなので、キャッシュするにはサイズが大きすぎるかも