AndroidTestをFastlaneで実行する


Androidアプリのインストゥルメント化単体テスト(ハードウェア デバイスまたはエミュレータで実行されるUIを使用したテスト)をCI環境に組み込むためにFastlaneから実行する方法のメモ。

背景

AndroidStudioからの実行はandroidTestディレクトリのコンテキストメニューから実行するという非常に直感的でわかりやすいが、完全に自動化しようとすると下記のステップを自動化する必要があり、自前では意外と簡単には行かなかった。

  • エミュレータを起動
  • 起動完了を待つ
  • テストを実行
  • テスト終了を待つ
  • エミュレータを終了

前提

  • Androidアプリ開発に必要なツールは一通りインストール済み
  • Fastlaneを既にプロジェクトで使用している

TL;TR

AzimoLabs/fastlane-plugin-automated-test-emulator-run Fastlaneプラグインを使用することで、設定のみで実現できてしまう。

手順

プラグインのインストール

fastlane add_plugin automated_test_emulator_run

プロジェクトのfastlaneディレクトリにAVD_setup.jsonを作成する

{
  "avd_list":
  [
    {
      "avd_name": "Nexus5_API_21_Play",

      "create_avd_package" : "system-images;android-21;google_apis;x86_64",
      "create_avd_device" : "Nexus 5",
      "create_avd_tag" : "google_apis",
      "create_avd_abi": "x86_64",
      "create_avd_hardware_config_filepath": "",
      "create_avd_additional_options": "",

      "launch_avd_snapshot_filepath": "",
      "launch_avd_launch_binary_name": "emulator",
      "launch_avd_port": "",
      "launch_avd_additional_options": "-gpu on"
    }
  ]
}

create_avd_device ではハードウェアプロファイルを指定する。AVD Manager GUI版では下記スクショの画面で選択するものにあたる。

avdmanager list device コマンドで表示されるリストのIDを指定する。

% ~/Library/Android/sdk/tools/bin/avdmanager list device
...
---------
id: 14 or "Nexus 9"
    Name: Nexus 9
    OEM : Google
---------
id: 15 or "Nexus One"
    Name: Nexus One
    OEM : Google
---------
id: 16 or "Nexus S"
    Name: Nexus S
    OEM : Google
---------
id: 17 or "pixel"
    Name: Pixel
    OEM : Google
---------
id: 18 or "pixel_c"
    Name: Pixel C
    OEM : Google
---------
id: 19 or "pixel_xl"
    Name: Pixel XL
    OEM : Google

で表示されるリストのIDを指定する。
リスト中の
id: 8 or "Nexus 5"
のところ。

その他の詳細はこちら
https://github.com/AzimoLabs/fastlane-plugin-automated-test-emulator-run#json-config

fastlane/Fastfileに下記の様にlaneを定義。

lane :run_android_test do
  # Delete existing emulator data to avoid failure of starting emulator
  sh("rm -rf ~/.android/avd/Nexus5_API_21_Play.avd")
  automated_test_emulator_run(
    AVD_setup_path: "fastlane/AVD_setup.json",
    gradle_task: "connectedDevelopmentDebugAndroidTest",
    gradle_flags: "-Pandroid.testInstrumentationRunnerArguments.class=com.smbc_card.vpoint.ui.email.EmailActivityTest",
  )
end

AVD_setup_pathに上記で作成したjsonファイルを指定する。

gradle_taskで指定するタスクはconnectedVariantNameAndroidTestとなる。つまり、フレーバーがDevelopmentでビルドモードがDebugなら connectedDevelopmentDebugAndroidTestとなる。
公式ドキュメントはこちら

gradle_flagsは必須ではないが、例では実行するテストクラスを指定している。
ここからの情報

sh("rm -rf ...") は前回作成されたavdのディレクトリが残っているとエラーになることがあったのだが、原因までは調べる時間なかったので、毎回削除することで回避している。

下記コマンドで実行

bundle exec fastlane run_android_test

Happy testing~!