検索
連載

Android SDK標準の何でもテストツールuiautomatorの基本的な使い方スマホ向け無料システムテスト自動化ツール(2)(3/3 ページ)

本連載では、スマートフォン(Android/iOS)アプリ開発における、システムテストを自動化するツールを紹介しています。今回は他者の署名したアプリもテストできる、Android SDK標準の何でもテストツールuiautomatorの特徴や基本的な使い方について。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

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の応用的なトピックを紹介します。

著者プロフィール

外山 純生

テスト自動化研究会(STAR)Androidテスト部

NTTソフトウェア株式会社勤務。数年前よりAndroidアプリケーション開発にかかわり始めたのを切っ掛けに、Androidにおける自動テストに興味を持つようになる。Android関連プロジェクトに対する技術支援業務に携りながら、Android向けのテストツールがもっと広く使われるようになることを願って、ブログにて技術情報を発信中

Blog:sumioの技術メモ

Twitter:@sumio_tym


Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る