やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

uiautomatorを試してみた #android_tec

Android SDKに追加されたUIテスティングツール uiautomator を試してみたのでメモ。

要件

ADT r21以上
API Level 16以上(Android 4.1)
が必要です。

テスト実行までの手順

テストプロジェクトの作成

1. Eclipseで新規Javaプロジェクトを作る
2. プロジェクトのProperties > Java Build Path > Libraries
2.1 "Add Library..." > "JUnit"を選択してNext -> JUnit3を選択してFinish
2.2 "Add External JARs..." > /platforms/android-17/下のandroid.jarとuiautomator.jarを追加

テストケースの作成

テストクラスは、com.android.uiautomator.testrunner.UiAutomatorTestCase
のサブクラスとして実装します。
今回作ったサンプルはgistに上げておきました。

ビルドの準備

ビルド用のbuild.xmlを生成します。

$ cd <テストプロジェクトのパス>
$ android create uitest-project -n <プロジェクト名> -t <ターゲットSDKのNo> -p .

【11/23訂正】"create"サブコマンドが要ります。他はupdateがあるのですが、なぜかcreateのみ。

ターゲットSDKのNoは環境にインストールされているSDKの番号です。
$ android list target
コマンドで調べることができます。ここでAPI Level 16以上のSDKを指定します。

android create uitest-projectコマンドが成功すると、コンソールに
Added file ./build.xml
と表示され、ビルド定義ファイルができています。

ビルド実行

$ ant build

成功すると、bin/下にjarファイルができています。

実機に転送

$ adb push <jarファイルのパス> /data/local/tmp

複数の端末が接続されている場合、-sオプションで端末シリアルNoを指定できます。

テスト実行

$ adb shell uiautomator runtest <jarファイル名> -c <テストクラス名(FQDN)>

実機でUI操作が動き、コンソールにはJUnitのテスト実行結果が出力されます。

そして上のサンプルだとこんな感じに投稿されました。

所感

  • apkの署名に関係なく、実機にインストールされているアプリの操作が可能
  • 操作対象オブジェクトは、レイアウトのヒエラルキを辿ったり、ラベルのついているオブジェクトはテキスト(全角文字OK)で拾ったり、クラス名で拾ったり、android:contentDescriptionが付いていればそれで拾ったり(これは未検証)できます。
  • ヒエラルキの確認には、uiautomatorviewerが使えます。/tools/下にあります。
  • ボタンなどオブジェクトを指してのタップ操作が可能
  • テキスト入力も可能。これはmonkeyrunnerのようにテキストを送り込むのでなく、ソフトウェアキーボードが開くのでキーボードに対する入力になります。操作が端末のLocaleによって変わる上に、日本語キーボードの操作は大変そうです。
  • UiDeviceクラスに座標指定のclick()およびswipe()メソッドがあるので、たぶん例のアレの収穫もできるはず。

おまけ

コマンドライン操作には android-completion を入れておくと便利です。最新のサブコマンドには対応されていませんが。