Android SDK標準の何でもテストツールuiautomatorの基本的な使い方:スマホ向け無料システムテスト自動化ツール(2)(3/3 ページ)
本連載では、スマートフォン(Android/iOS)アプリ開発における、システムテストを自動化するツールを紹介しています。今回は他者の署名したアプリもテストできる、Android SDK標準の何でもテストツールuiautomatorの特徴や基本的な使い方について。
UIコンポーネントの操作
UIコンポーネントを操作するためのメソッドはUiObjectクラスにまとめられています。以下デ代表的なものについて説明しますが、より詳細な情報はAPIリファレンスを参照してください。
- click():UIコンポーネントをクリック
- clickAndWaitForNewWindow():UIコンポーネントをクリックし、ウィンドウの変化(ダイアログの表示・非表示、アクティビティの遷移など)が起きるまで待つ
- setText():目的のUIコンポーネントがEditTextのようなテキスト入力フィールドのときに、中のテキストを設定
setText()メソッドは、テストを実行する端末の言語設定が英語で、かつ、IMEが英語入力モードでないと、想定とは異なる文字列が設定されることがあります。入力できるテキストも原則ASCIIの範囲に限定されます。
マルチバイト文字を扱う方法などについては、次回応用編で紹介します。
要素の検証
uiautomatorにおけるテストでは、JUnit 3で提供されている「assertEquals(expected, actual)」などのアサーションメソッドを用いて検証します。
UIコンポーネントの属性などを取得するメソッドはUiObjectクラスに用意されています。そのメソッドにより取得したUIコンポーネントの属性(actual)が、期待(expected)通りであるかどうかを、assertEquals()メソッドで検証します。
UiObjectクラスに用意されている、主な属性取得系のメソッドは以下の通りです。
- getText():text属性の値を取得
- getContentDescription():contentDescription属性の値を取得
- isChecked():checked属性の値を取得
- isEnabled():enabled属性の値を取得
- isFocused():focused属性の値を取得
- isSelected():selected属性の値を取得
- exists():属性を取得するのではなく、目的とするUIコンポーネントが存在しているかどうかをbooleanで返す
端末の回転
テストを実行する端末がAndroid 4.2以上の場合は、「UiDevice」クラスのsetOrientationから始まるメソッドを呼び出すことで、端末を指定された向きに回転させることができます。より正確に言うと、端末を指定された向きに回転したかのように、画面の向きが変化します。
setOrientationNatural()は、端末を「自然な向き」に持ったときに画面の向きが正しくなるように、画面を回転します。setOrientationRight()とsetOrientationLeft()は、端末を「自然な向き」から右または左に回転させたときに、画面の向きが正しくなるように画面を回転します。
「自然な向き」がどういう状態なのかは端末依存ですが、setOrientationNatural()を呼んだ後にgetDisplayHeight()・getDisplayWidth()メソッドを呼び出すことで、「自然な状態」における画面の高さと幅を取得できるようになっています。
また、freezeRotation()メソッドでセンサーによる画面の自動回転を無効にできます。これはunfreezeRotation()メソッドで解除(有効に)できます。
これらのメソッドを使うに当たっては、以下の点に注意してください。
- setOrientationから始まるメソッドを呼ぶと、画面の向きがそのまま固定されてしまうため、後続のテストに影響する可能性がある。それを回避するために、tearDown()で必ずunfreezeRotation()メソッドを呼ぶようにする
- 画面の回転が完了するまで、少し時間がかかるので、適宜Thread.sleep()を呼ぶようにする
スクリーンショットの撮影
テストを実行する端末がAndroid 4.2以上の場合は、「UiDevice.takeScreenshot()」メソッドを呼び出すことで、任意のタイミングで画面のスクリーンショットを撮影できます。
takeScreenshot()の引数には、保存先のパスを持つFileオブジェクトを指定できます。
// 端末内部の /mnt/sdcard/Pictures/ ディレクトリに // screenshot.png というファイル名でスクリーンショットを保存する。 File filePath = new File("/mnt/sdcard/Pictures/screenshot.png"); getUiDevice().takeScreenshot(filePath);
なお、スクリーンショットの保存先は、テストを実行する端末内部のストレージになるため、後からスクリーンショットを端末から取り出す必要があります。そのためにはadb pullコマンドを利用します。
$ adb pull {端末側に保存したスクリーンショットファイルへのフルパス}
{端末側に保存したスクリーンショットファイルへのフルパス}には、上記の例であれば/mnt/sdcard/Pictures/screenshot.pngを指定します。
テストの実行
uiautomatorでテストを実行するには、テストスクリプトをビルドして得られるjarファイルを、テストを実行する端末内の/data/local/tmp/ディレクトリにインストール(転送)しておく必要があります。テストを実行したい端末をUSBケーブルなどで接続し、adbで認識された状態にしておいてください。
また、端末やエミュレーターを複数接続している場合は、インストール時とテスト実行時のコマンドラインに以下のオプション引数を追加する必要があります。
- antコマンドを実行するとき:-Dadb.device.arg="-s {シリアル番号}"
- adbコマンドを実行するとき:-s {シリアル番号}
ここで{シリアル番号}は、テストを実行したい端末のシリアル番号を表します。接続している端末のシリアル番号はadb devicesコマンドを実行すると知ることができます。
以下では、「uiautomatorテストプロジェクトのセットアップ」の章で例に出したUiautomatorSampleプロジェクトを例に、テストをビルド・インストールし、実行する方法を説明します。
ビルド
Apache Antのbuildターゲットを実行します。
$ cd uiautomator $ ant build
ビルドが成功すると、「bin/」ディレクトリにUiautomatorSample.jarという名前のjarファイルが生成されます。このjarファイル名の.jar取り除いた部分は「テストプロジェクトを作成する」の章でandroid create uitest-projectコマンドを実行したときに-nオプションで指定した名称となります。
インストール
Apache Antのinstallターゲットを実行します。
$ ant install
adbコマンドを直接実行してインストールすることもできます。その場合は、以下のコマンドを実行してください。
$ adb push bin/UiautomatorSample.jar /data/local/tmp/
ここで、bin/UiautomatorSample.jarの箇所には、ビルド時に生成したjarファイルへのパスを指定します。
実行
以下のコマンドを実行します。
$ adb shell uiautomator runtest UiautomatorSample.jar -c com.nowsprinting.hellotesting.uiautomator.CustomerDetailTest
ここで、UiautomatorSample.jarの部分には、テスト対象デバイスに転送したjarファイル名のみを指定します。パスは指定しない点に注意してください。
-cオプションには、実行したいテストケース(UiAutomatorTestCaseのサブクラス)のクラス名をFQCN(Fully Qualified Class Name)で指定します。このオプションは、テストを実行する端末がAndroid 4.3以上の場合は省略することもできます。省略した場合、テストプロジェクトのjarファイルに含まれる全テストケースが実行されます。
コラム「サンプルを実行するときは」
サンプルのテストスクリプトを実行する場合は、テスト実行に先立って、テスト対象デバイス上で、サンプルアプリ起動直後の画面(顧客一覧画面)を表示させておいてください。
テスト実行のために入力するコマンドは、コマンドライン引数の値なども含めて、上記コマンド例と同じです。
uiautomatorコマンドの引数についての詳細は、uiautomatorコマンドのマニュアルを参照してください。
次回は、uiautomator応用編
今回は、uiautomatorについて、基本的なところを説明しました。最低限、今回の記事の内容を理解しておけば、テストスクリプトを書き始めることができるでしょう。
次回は、知っておくと便利な、uiautomatorの応用的なトピックを紹介します。
- iOS/AndroidのUIテストを自動化するAppiumのテストスクリプトの書き方とインスペクターの使い方
- SeleniumのUIテスト自動化をiOS/AndroidにもたらすAppiumの基礎知識とインストール方法、基本的な使い方
- Calabash-Androidのテスト高速化、GPS、スクショ、データ駆動型テスト
- Calabash-AndroidによるBDDの実践とJenkinsによる「Living documentation」
- Calabash-Androidでテストシナリオを作成する方法
- iOS/AndroidにCucumberのBDDをもたらすテストフレームワークCalabashの基礎知識とインストール
- Androidテストで便利なuiautomatorviewer、UiScrollableの使い方、テキスト入力API制限事項の回避方法
- Android SDK標準の何でもテストツールuiautomatorの基本的な使い方
- システムテスト自動化の基礎知識とMonkeyTalkの使い方
著者プロフィール
外山 純生
NTTソフトウェア株式会社勤務。数年前よりAndroidアプリケーション開発にかかわり始めたのを切っ掛けに、Androidにおける自動テストに興味を持つようになる。Android関連プロジェクトに対する技術支援業務に携りながら、Android向けのテストツールがもっと広く使われるようになることを願って、ブログにて技術情報を発信中
Blog:sumioの技術メモ
Twitter:@sumio_tym
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- テスト自動化の歴史と今後、良い/悪い事例〜システムテスト自動化カンファレンス2013レポート
テスト自動化を開発の“武器”にするための3つのポイントや、“自動化”の良い事例、悪い事例など、テストの現場を「進化させる」知見が多数紹介されたカンファンレンスの模様をレポートする。 - DevOps時代、テスト自動化はどうあるべきか?:ビジネス目標を見据えたテスト設計が肝!「DevOps時代のテスト自動化カンファレンス 冬の陣」開催
DevOpsの実践で肝となるソフトウェアテストの自動化。しかし@ITの読者調査でも50%以上が「テスト環境に課題あり」と回答した。これにどう対応すれは良いのだろうか? カンファレンス登壇者の言葉にヒントを探る。 - iOSアプリ開発でもCI/継続的デリバリしようぜ(2):Kiwi+CocoaPodsで始めるiOSアプリの振る舞いテスト入門
現代の開発現場において欠かせないCI/継続的デリバリを、iOSアプリ開発に適用するためのツールやノウハウを解説する連載。今回は、iOSアプリの機能の振る舞いをテストするテスティングフレームワークの特長とインストールの仕方、主な使い方を解説します。 - Androidアプリ開発テスト入門(2):Android SDKでビジネスロジックのテストを自動化するには
Android開発におけるビジネスロジックについて解説し、Android SDKのテストフレームワークの概要と使い方、テストの書き方を紹介します - 第2回Androidテスト祭りレポート:Android開発の上層テストで失敗しないためのポイントとは
セキュリティ設計や受け入れテストガイドライン、CIツールJenkins+コードレビューGeritt、テスト効率化ノウハウ、リモートテストサービスなど