Firebase Test LabのRobo testを使用してリグレッションテストを自動化してみる

# Firebase Test LabのRobo testとは
Firebaseの[リファレンス](https://firebase.google.com/docs/test-lab/android/robo-ux-test)を引用して簡素に記載すると、アプリUIの構造を分析しユーザーのアクティビティを自動的にシミュレートして体系的な調査を行ってくれるテストツールとのことです。
アプリの機能によってはRobo testで自動化できないものもあるため、
完全自動化ではなくリグレッションテストの一部を自動化してみるという観点で利用してみます。
## 動作環境
・Android Studio Chipmunk 2021.2.1 patch 1
・Flutter:3.0.5
・Dart:2.17.6
## 前提条件
・Firebase Projectのセットアップが完了していること
・テスト可能なアプリケーションが作成済みであること
## Robo testを実行してみる
初めにRobo testに投入するアプリはプロジェクト作成時に自動生成されるアプリになります。
その後、アプリに改良を加えてRobo testがどこまでシミュレートしてくれるのかを確認していきます。

テストアプリの挙動
<img width="200" alt="hoge.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706893/ddc6deff-b9fe-e94d-050f-2a9a5478a86c.gif">
1.さっそくFirebase ConsoleからRobo testを実行してみます。
　Firebase Consoleの構築 > Test Labを選択します。
![Test_Lab_選択_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706893/62db41e8-c17e-fea9-ae6d-f3c14e636d42.png)
2.テストを実行するボタンを押してテストタイプのRoboを選択します。
![Test_Lab_Home_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706893/beb536c8-ddc4-6852-7eb6-1cf06bea5857.png)
3.Robo testを実行するアプリをアップロードします。
　Androidの場合はAPK又はAAB形式のアプリが実行可能です。
![Test_Lab_Robo_test_実行前.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706893/ab3daf06-f513-326d-05ca-9509fe5a1091.png)
4.テストの実行環境を選択します。
　初回はプリセットもないので独自のプリセット作成からになります。
　2回目以降で同じ実行環境を用いる場合はプリセットに登録しておくと便利です。
![Test_Lab_Robo_test_環境選択.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706893/a57681e7-5ea0-83a0-ffb9-584552fb8aef.png)
5.テストデバイスを選択します。
　複数のデバイスとOSを選択可能で端末毎の動作差分とOSでの差分検知も幅広くできそうです。
![Test_Lab_Robo_test_デバイス選択.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706893/3bfd2e33-4336-8219-6992-ff38253b3421.png)

テストデバイスの選択が終わるとRobo testが実行されます。
テストが完了すると登録しているメール宛に完了通知がきます。
## Robo testの結果を確認する
Robo testが完了するとこのように実行結果が確認できました。
今回の実行環境は1デバイスのみだったので1件のみ結果が表示されてます。
![Test_Lab_Robo_test_結果_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706893/134ecc3b-2134-fa38-011c-037a62fcb1e8.png)

さらに画面内でどのようなテストが行われたのかを詳細に表示することができます。
アプリの挙動が右下のフローティングアクションボタンをタップで画面中央の数字がインクリメントするだけでしたが、このテスト結果で正常に動作していることが分かります。
![Test_Lab_Robo_test_結果_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706893/a2afd347-cace-339d-95f5-8140b7d84e4d.png)

## テストアプリを改良してRobo testを実行してみる
初めに試したテストアプリを改良して画面遷移の機能とドロワーメニューの機能を追加してみます。
このアプリをRobo testに投入してどのような結果が得られるのかを試してみます。

改良後のテストアプリ
<img width="200" alt="hoge.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706893/e7d2f385-9dd0-6b53-96b3-33d83e1ca656.gif">

さっそく改良後のアプリでRobo testの結果を確認してみましょう。
![Test_Lab_Robo_test_kai_結果_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706893/c684395f-f3cc-4b27-e36c-da7c91cb2528.png)
![Test_Lab_Robo_test_kai_結果_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706893/057dab5a-8982-533a-94c6-8a52392ca66f.png)

追加したドロワーメニューの操作と画面遷移の操作それぞれが行われていることが確認できました。
Robo testでは画面内に表示されているユーザ操作可能なViewを自動で検知し、
遷移可能な画面全てを網羅するように実行されているようです。

## Robo testでリグレッションテストを自動化するための課題
冒頭に記載しましたが完全自動化ではなく一部を自動化する観点でこれまでの検証を行いました。
ここでなぜ完全自動化ではないのか、Robo testを試してみた結果から見えてきた課題を記載していきます。

**Robo testの制限**
今回のテストアプリには存在しませんでしたが、WebView画面内の操作、
ログインが必須の画面に遷移する操作や認証情報,キャプチャの入力etcは、
**通常の**Robo testで実行することができません。

ではどうするのかというと、Roboスクリプトというものが用意されているようです。
このRoboスクリプトを作成することでログインなど通常では行ってくれない操作で
Robo testの実行が可能になります。
[Roboスクリプトリファレンスガイド](https://firebase.google.com/docs/test-lab/android/robo-scripts-reference?hl=ja)

またFCMと連携した機能についてはRobo testで動作担保をすることが難しいと思います。
Roboスクリプトでadbコマンドを使ったFCMでの受信は可能なのですが、
実際にはPushサーバetcとの連携をしているわけではないため、
こういった機能は手動でテストをする方が確実かと思います。

## さいごに
リグレッションテストの一部自動化という観点で検証を行いましたが、
結論としてはアプリリリース前にRobo testを実行することである程度の品質は担保可能だと思いました。
Robo testにリグレッションテストの全てを任せることは難しいため、
どこまでをRobo testで担保しどこまでを手動でテストするのかの見極めをして、
リリースの度にかかるコストを削減していくことが大事ですね。