Android SDKに追加されたUIテスティングツール uiautomator を試してみたのでメモ。
テスト実行までの手順
テストプロジェクトの作成
1. Eclipseで新規Javaプロジェクトを作る
2. プロジェクトのProperties > Java Build Path > Libraries
2.1 "Add Library..." > "JUnit"を選択してNext -> JUnit3を選択してFinish
2.2 "Add External JARs..." >
テストケースの作成
テストクラスは、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のテスト実行結果が出力されます。
そして上のサンプルだとこんな感じに投稿されました。
おれがゆーあいおーとめーたーだ!
— Koji Hasegawa (@nowsprinting) November 22, 2012
所感
- apkの署名に関係なく、実機にインストールされているアプリの操作が可能
- 操作対象オブジェクトは、レイアウトのヒエラルキを辿ったり、ラベルのついているオブジェクトはテキスト(全角文字OK)で拾ったり、クラス名で拾ったり、android:contentDescriptionが付いていればそれで拾ったり(これは未検証)できます。
- ヒエラルキの確認には、uiautomatorviewerが使えます。
/tools/下にあります。 - ボタンなどオブジェクトを指してのタップ操作が可能
- テキスト入力も可能。これはmonkeyrunnerのようにテキストを送り込むのでなく、ソフトウェアキーボードが開くのでキーボードに対する入力になります。操作が端末のLocaleによって変わる上に、日本語キーボードの操作は大変そうです。
- UiDeviceクラスに座標指定のclick()およびswipe()メソッドがあるので、たぶん例のアレの収穫もできるはず。
おまけ
コマンドライン操作には android-completion を入れておくと便利です。最新のサブコマンドには対応されていませんが。