Androidテストで便利なuiautomatorviewer、UiScrollableの使い方、テキスト入力API制限事項の回避方法:スマホ向け無料システムテスト自動化ツール(3)(2/4 ページ)
本連載では、スマートフォン(Android/iOS)アプリ開発における、システムテストを自動化するツールを紹介しています。今回は、Android SDK標準の何でもテストツールuiautomatorの使い方の応用編として、uiautomatorviewer、UiScrollableの使い方、テキスト入力API制限事項の回避方法などを紹介。
今回行うテストの内容
今回は、本連載で使っているサンプルアプリに対して、以下のテストを行います。
- 試験目的:複数の顧客が追加されている状態で、顧客情報を修正できること
- 前提条件:15件の顧客が登録済みであること
- 試験手順・確認内容:
- Master画面(サンプルアプリ起動直後に表示される画面)に表示される顧客一覧から、最後に登録した顧客1件をタップする。それによってDetail画面(顧客情報入力・編集画面)に遷移する
- Detail画面で「氏名」を別の内容に変更し、「戻る」キーを押す。それによってMaster画面に遷移する
- Master画面の顧客一覧に、変更後の氏名が表示されていること
以降では、このテストを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パターン」
このように、画面ごとにクラスを用意し、その画面に対する操作を実現するメソッドをまとめておく方法は「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 {データを消去したいアプリのパッケージ名}
このシェルコマンドは、端末の[設定]→[アプリ]にある[データ消去]ボタンを押した場合と同様に振る舞い、以下のメソッドで取得できるディレクトリ配下のファイルを消去します。
- Context.getFilesDir()
- Context.getCacheDir()
- Context.getExternalFilesDir()
- Context.getExternalCacheDir()
状況に合わせて利用してみてください。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- テスト自動化の歴史と今後、良い/悪い事例〜システムテスト自動化カンファレンス2013レポート
テスト自動化を開発の“武器”にするための3つのポイントや、“自動化”の良い事例、悪い事例など、テストの現場を「進化させる」知見が多数紹介されたカンファンレンスの模様をレポートする。 - ビジネス目標を見据えたテスト設計が肝!「DevOps時代のテスト自動化カンファレンス 冬の陣」開催
DevOpsの実践で肝となるソフトウェアテストの自動化。しかし@ITの読者調査でも50%以上が「テスト環境に課題あり」と回答した。これにどう対応すれは良いのだろうか? カンファレンス登壇者の言葉にヒントを探る。 - Kiwi+CocoaPodsで始めるiOSアプリの振る舞いテスト入門
現代の開発現場において欠かせないCI/継続的デリバリを、iOSアプリ開発に適用するためのツールやノウハウを解説する連載。今回は、iOSアプリの機能の振る舞いをテストするテスティングフレームワークの特長とインストールの仕方、主な使い方を解説します。 - Android SDKでビジネスロジックのテストを自動化するには
- 第2回Androidテスト祭りレポート:Android開発の上層テストで失敗しないためのポイントとは
セキュリティ設計や受け入れテストガイドライン、CIツールJenkins+コードレビューGeritt、テスト効率化ノウハウ、リモートテストサービスなど