Googleテスト部門のソフトウェアエンジニアであるMona El Mahdy氏はブログ投稿 で“ユニットテストとは何でもユニットテストが可能であるべき”と述べ、Androidアプリケーションのユーザインタフェース(UI)におけるユニットテスト方法をいくつか提案している。Mahdy氏は一般的なユニットテスト用にRobolectric とAndroid StudioGradle plug-in を、UIテストの作成、実行用にEspresso や UI Automator を薦めている。
End-to-End (E2E) テスト UIテストへの最初のアプローチはE2EだとMahdy氏は言う。このテストはAndroidアプリケーションと全ての関連するバックエンドシステムを起動することで実際のシナリオにおけるUIテストを可能にする。これらのテストを繰り返し実行することは難しい。なぜなら“ネットワーク設定や実サーバ認証、システムサイズ、その他もろもろ沢山の値” が原因で“安定したE2Eテストのデバッグ” が困難だからだ。これらの課題を単純にするために、Mahdy氏は新たなテスト・ストラテジを提案している。
hermeticサーバを使ったテスト hermeticサーバ は外部から隔離されたサーバで、単一のマシン上でローカルにネットワーク接続なしに動作している。他のサーバへの接続はディペンデンシー・インジェクションを経たランタイム上で提供される。必要な静的ファイルは当該サーバに同梱されており、必要があればデータストアへの応答リクエストは、あたかもローカルファイルもしくはメモリ内データであるように疑似化される。その他、バックエンドサーバからのレスポンス・シーケンス記録をhermeticサーバへ提供するオプションがある。
テスト目的のためにhermeticサーバはテスト対象のシステム(SUT: System Under Test) と同じAndroidエミュレータが動作しているマシン上でローカルに動作する。テスト実行をスピードアップし、時折発生するネットワーク接続関連の断片化を排除するには、クライアントアプリがバックエンドと同期しているかどうかを確認するための個々の結合テストが必要だ。このため、Google+チームはクライアントアプリとバックエンドサーバ間の正しい送信シーケンスを含むことを意味する一対の“ゴールデン” リクエスト/レスポンスファイルを使う。後でゴールデン・レスポンスファイルと比較するため、ゴールデン・リクエストファイルは再生され当該サーバから受信する全てのレスポンスから生成される。
E2Eテストよりhermeticサーバを使う方がよいが、デバッグはなおも簡単ではないしhermeticサーバはコミュニケーションにおいて断片化の要因になる、とMahdy氏は言う。そこで彼女はさらなる改善を提案する。
Dependency Injection (DI)の活用 いくつかのモジュールを疑似モジュールと入れ替えるDIをテストに使うによりモジュールアプリケーションの設計が可能となる。ネットワークモジュールを通してhermeticサーバとお話をする代わりに、本アプリは全てのリクエストに対する応答を提供する疑似ネットワークモジュールと通信する。これにより、UIテストはさらに早くなり安定化する。Mahdy氏が薦めるDIはDaggerだ。
複数ライブラリ Androidアプリケーションが大きくなった場合は、より小さなコンポーネントのモジュールやライブラリ内のパッケージビューへ分けることをMahdy氏は提案する。これにより、それぞれのコンポーネントが別々のDIや疑似モジュール、テストによって開発、テスト可能となる。結合テストは全てのアプリケーション動作を確認するために必要とされる。本アプローチはテスト作業をさらにスピードアップさせる。
最後にMahdy氏は“UIの部分テストはE2Eよりも格段に早くなり99%以上安定した。早く安定したテストは開発者の生産性を大幅に向上させる”と結論付けた。