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~!