今回は、本連載で使っているサンプルアプリに対して、以下のテストを行います。
以降では、このテストをuiautomatorで実現していきながら、さまざまなノウハウを説明していきます。そのためのテストスクリプトも、冒頭で紹介したリポジトリに追加してありますので、参考にしてください。
今回追加したテストスクリプトの構造は以下のようになっています。
Page Objectパターンを使って、テストケースから画面の操作を隠蔽(いんぺい)するクラスを切り出し、「com.nowsprinting.hellotesting.uiautomator.page」パッケージに定義しています。MasterPageクラス・DetailPageクラス(とそのサブクラス)が、それぞれMaster画面・Detail画面に対応します。これらのクラスには、画面に対する操作(「氏名欄に入力する」など)を実現するメソッドを定義しています。
個々のテストケースは「com.nowsprinting.hellotesting.uiautomator」パッケージにCustomerModifyTest<数字>というクラス名で用意しています。テスト実行時の「-c」オプションに指定するクラス名には、こちらを指定してください。
パッケージ名がcom.nowsprinting.hellotesting.uiautomatorで始まらないクラスは、Uiautomator Unicode Input Helperのヘルパーライブラリ関連のクラスです。
詳しくは「テキスト入力フィールドに非ASCII文字を入力する」の章で説明します。
このように、画面ごとにクラスを用意し、その画面に対する操作を実現するメソッドをまとめておく方法は「Page Objectパターン」と呼ばれており、Webアプリに対するテストを書くときによく使われるデザインパターンです。
Page Objectパターンを使うと、画面レイアウトや構成部品などが後から変更になった場合の影響範囲を、変更した画面クラス(PageObject)内にとどめることができるため、テストスクリプトのメンテナンス性が向上します。
Page Objectパターンについては、STAR(テスト自動化研究会)が提供しているチュートリアル形式の教材も公開されていますので、併せて参考にしてください。
Page Objectパターンに限らず、テストスクリプトの中に何度も似たようなコードが出現する場合は、重複するコードを別のメソッドに切り出すなどのコード共通化ができないか検討してみてください。
今回追加したテストスクリプトでは、個々のテストケースを実行するときに、毎回テスト対象アプリを起動し直しています。
公式のサンプルなどでは、uiautomatorでホーム画面からアプリ一覧を表示し、アプリアイコンをタップしてテスト対象アプリを起動しています。
しかし、この手順を通常のテストでも使用するのは、以下の理由からお勧めしません。
代わりに、以下のシェルコマンドを呼び出してアプリを起動することで、これらの問題を解決できます。
$ am start -S -W -a android.intent.action.MAIN -n {起動したいアプリのパッケージ名}/{起動したいアプリのActivity名}
このシェルコマンドは、指定されたアプリが起動中の場合は、そのアプリを強制終了してから起動し直します。すでに強制終了ダイアログが表示されている場合でも処理が止まることはありません。
また、アプリ起動にかかる時間についても、筆者のAndroid 4.4.2エミュレーターの環境では、公式サンプルの方法と比べて、1回当たり約8.8秒から約1.8秒に短縮しました。
サンプルのテストスクリプトでは、com.nowsprinting.hellotesting.uiautomator.utilパッケージのShellCommands.startApp()メソッドに上記方法を実装してありますので、参考にしてください。
状況によっては、端末内のアプリ専用領域に保存されたデータを毎回消去したくなることもあるかもしれません。その場合は、以下のシェルコマンドが利用できます。
$ pm clear {データを消去したいアプリのパッケージ名}
このシェルコマンドは、端末の[設定]→[アプリ]にある[データ消去]ボタンを押した場合と同様に振る舞い、以下のメソッドで取得できるディレクトリ配下のファイルを消去します。
状況に合わせて利用してみてください。
Copyright © ITmedia, Inc. All Rights Reserved.