Firebase Test Labとは?
Googleのデータセンターでホストされている端末上で、アプリをテストしてくれるサービスです。
iOSおよびAndroidに対応していて、テスト結果はFirebaseコンソール上で確認出来ます。
公式ドキュメント: https://firebase.google.com/docs/test-lab/
利用方法
Test Labの利用には、Firebaseコンソール上から実行する他に、AndroidStudioやgcloudコマンドラインからも可能です。
特にgcloudコマンドラインを使うことで、CI/CDツールに組み込むことも可能となります。
料金
Test Labの利用には、従量課金制のBlazeプランが推奨されています。
Blazeプランの場合、以下の設定です。(https://firebase.google.com/pricing/)
端末 | 料金 |
---|---|
仮想 | $1/device/hour |
物理 | $5/device/hour |
出来ること
- iOS版
- XCTestフレームワークを使ったテストの実行
- Firebaseコンソール、gcloudコマンドラインからのテスト
- 物理端末を用いたテスト
- 利用可能な端末: https://firebase.google.com/docs/test-lab/ios/available-testing-devices
- Android版
- Espresso, UI Automator 2.0を使ったテストの実行
- Roboテストの実行
- ゲームループテストの実行
- Firebaseコンソール、AndroidStudio、gcloudコマンドラインからのテスト
- 仮想端末もしくは物理端末を用いたテスト
- 利用可能な端末: https://firebase.google.com/docs/test-lab/android/available-testing-devices
Roboテストを利用した背景
仕事でAndroidアプリの開発を行う中で、以下のような課題がありました。
- リリース前に複数バージョンのOSおよび機種で動作確認をしたい
- 上記は自サービスのシェア上位のものをカバーしたい
- 特定の機能よりは、画面の網羅性を重視したい
自サービスでは、ログインしていないと確認できない画面もあるため、EspressoかUI Automatorでのテストを考えていましたが、Roboテストもログイン操作をパスさせることができることが分かり、試用結果次第では導入してみたいと思いました。
Roboテストの特徴
UI構造の分析
AndroidアプリのAPKファイルをアップロードすると、UI構造を分析し自動的にユーザー操作をシミュレートしてくれます。
モンキーテストとは異なり、同じ設定下では同じ順序でシミュレートしてくれるとのことで、テスト結果に従ってバグを修正した場合、その修正の検証をすることが可能になります。
テキスト入力の指定
Roboテストを作成する際、EditTextのリソースIDと入力値を設定してあげることで、テスト中に入力をシミュレートしてくれます。
ログイン操作に用いる他にも、検索機能などにも対応させることができました。
スクリプトによる制御
今回は試してません。
AndroidStudioのFirebaseツールから、実際のアプリ操作からRoboテスト用のスクリプトを生成することが出来るようです。
他にもいろいろあるので、詳細はドキュメントを見てください。
試用結果
いくつか不安を感じる部分もありましたが、薄く広く動作確認を自動でやってくれるという目的であれば、現段階でも十分実用的だなと思いました。(感じ方は、期待する精度によって変わると思います。)
Roboテストによって得られる結果
Firebaseコンソール上で、以下の結果をデバイス毎に確認できます。AndroidStudioでデバッグするときに見られる情報は、だいたい見ることができます。
以下の結果はGCSバケットに自動保存され、下図の「テスト結果」をクリックすることで該当バケットに遷移し、ダウンロードも可能でした。
ただし、このテスト結果は90日間しか保持されないので、必要に応じて自分のGCSバケット等に手動でバックアップする必要があります。
https://firebase.google.com/docs/test-lab/android/analyzing-results
- クロールグラフ(画面遷移図に発生したイベントが書き込まれた画像)
- デバッグログ
- スクリーンショット
- 動画
- パフォーマンス計測(CPU、メモリ、ネットワーク)
Roboテストでイマイチだったところ
アプリ側のクオリティにも寄る部分がありますが、シミュレート内容に以下のような不安を感じる部分がありました。
- ログイン出来た端末と出来なかった端末があった
- テキスト入力はされていたものの、なぜかログインボタンを押さずにテキスト入力を繰り返してしまっていた
- UI階層が深い箇所を先にテストが開始されると、他の画面をテスト出来ずにタイムアウトしてしまっていた
- これはアプリ側の画面設計にも課題がある
- 特定の操作の組み合わせで同じ画面をループしてしまうケースがあり、タイムアウトまでそれを繰り返してしまっていた
- これもアプリ側の問題ではある
テストのタイムアウトは自由に設定できるので設定値を延ばすことも可能ですが、むしろアプリの画面遷移パターンやUIを見直すことが必要だなと考えるきっかけになりました。
それはそれとして、テスト時間で課金される仕様上、同じ操作や同じ画面間などでループしていたらテストを中断するようになってくれるといいなと思います。