強火で進め

このブログではプログラム関連の記事を中心に書いてます。

iPhone SDK 4からの新機能UI Automationの使い方

UI AutomationはJavaScriptで記述されたプログラムでUIの自動テストを行うものです。

JavaScriptの記述

例えばこの様に記述します。

UIALogger.logStart("Starting Test");
UIALogger.logDebug("--logElementTree()");
UIATarget.localTarget().frontMostApp().logElementTree();
UIALogger.logDebug("--mainWindow().logElement()");
UIATarget.localTarget().frontMostApp().mainWindow().logElement();
var view = UIATarget.localTarget().frontMostApp().mainWindow();
var textfields = view.textFields();
UIALogger.logDebug("--textfields.length : "+textfields.length);
if (textfields.length != 2) {
    UIALogger.logFail("UITextFieldの数が変だよ");
} else {
    UIALogger.logPass("UITextFieldの数に問題なし");
}
textfields[0].setValue("aaa");
textfields["last_name"].setValue("bbb");
UIALogger.logDebug("--buttons().logElementTree()");
var buttons = view.buttons();
UIALogger.logDebug("--buttons.length : "+buttons.length);
if (buttons.length != 1) {
    UIALogger.logFail("UIButtonの数が変だよ");
} else {
    UIALogger.logPass("UIButtonの数に問題なし");
}
//view.buttons()[0].tap(); // こっちの書き方でもOK
view.buttons()["実行"].tap();

UIはこの様に配置。

主なところを説明します。

UIATarget.localTarget().frontMostApp() で今、アクティブになっているアプリを取得できます。 UIATarget.localTarget().frontMostApp().logElementTree(); と記述する事でアプリに存在するelementの一覧をログ出力できます。

UIATarget.localTarget().frontMostApp().mainWindow(); でメインのViewが取得できます。

var textfields = view.textFields(); でUITextFieldの一覧を取得できます。

UIALogger.logFail() で失敗したとき、 UIALogger.logPass() でパスした(成功した)ときのログ出力を行う事ができます。汎用的なログ出力である UIALogger.logDebug() と異なりこちらを使用した場合、 logFail() なら赤文字で、 logPass() なら緑の文字で出力されます。

if (textfields.length != 2) {
    UIALogger.logFail("UITextFieldの数が変だよ");
} else {
    UIALogger.logPass("UITextFieldの数に問題なし");
}

textfields[0].setValue("aaa"); の様に記述してUITextFieldの値を更新する事ができます。要素番号以外にも textfields["last_name"].setValue("bbb"); の様に名称(name)で指定する事もできます。

ボタンなどの場合であればtitleプロパティの値がJavaScript側では name になる様です。そのようなものが存在しない UITextField では Inspecter の Label に記述したものが name になる様です。

ボタンなどであれば view.buttons()["実行"].tap(); でボタンのタップなどユーザの操作をシミュレーションする事も可能です。

実行方法

自分が調べた範囲ではXcodeから直接起動する事は出来ませんでした。XCode上でDebugでビルドした後、 Instruments を起動する必要があります。

Instruments を起動し、新規Trace Documentを作成します。シミュレータ向けの場合は以下の様に選択します。

次にJavaScriptで自動テストするアプリの選択します。

アプリの選択はフォルダを順番にたどって行って選択するのも良いですが以下の手順であればちょっとだけ簡単でかつ間違い無く選択出来るので自分こちらの方法で選択しています。

1. プロジェクトの Products に有る。実行ファイルを右クリックし、「Finder に表示」を選択(似たもので「Finder で開く」も有るので間違えない様に)。
2. Finderに表示されたアプリファイルをファイル選択画面にドラック。
※自分としてはこれが現時点で一番簡単な選択方法だと思ってるんですがもっと簡単に選択できる方法をご存知の方は是非是非教えて下さい。

実行するJavaScriptを選択。

画面左上の「Record」をクリックし、Traceを開始。

以下の様に「苗字」「名前」の UITextField の値が変更され「実行」ボタンが押されるシミュレーションが行われます。

今回使用したサンプルはこちらからDLできます。同梱されている test.js にJavaScriptの処理が記述して有ります。

関連動画

WWDC 2010の動画のSession 306など

関連サイト

Alex Vollmer — Working with UIAutomation
http://alexvollmer.com/posts/2010/07/03/working-with-uiautomation/

iOS SDK 4 から追加された UIAutomation について « Elegant Apps Developers
http://dev.elegant-apps.com/blog/archives/2010/09/22/uiautomation.html