強火で進め このページをアンテナに追加 RSSフィード

整理された情報は こちら へどうぞ。

2010年06月26日

[]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はこの様に配置。

f:id:nakamura001:20100626091706p:image

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

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 になる様です。

f:id:nakamura001:20100626075120p:image

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

実行方法

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

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

f:id:nakamura001:20100626075115p:image:w320

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

f:id:nakamura001:20100626091703p:image

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

1. プロジェクトの Products に有る。実行ファイルを右クリックし、「Finder に表示」を選択(似たもので「Finder で開く」も有るので間違えない様に)。

2. Finderに表示されたアプリファイルをファイル選択画面にドラック。

※自分としてはこれが現時点で一番簡単な選択方法だと思ってるんですがもっと簡単に選択できる方法をご存知の方は是非是非教えて下さい。

f:id:nakamura001:20100626075118p:image:w320

実行するJavaScriptを選択。

f:id:nakamura001:20100626091705p:image

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

f:id:nakamura001:20100626091704p:image

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

f:id:nakamura001:20100626075119p:image:w320

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

参考サイト

UI Automation Reference Collection

https://developer.apple.com/iphone/library/documentation/DeveloperTools/Reference/UIAutomationRef/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009771-CH1-SW1

How to use UIAutomation to create iPhone UI tests - O'Reilly Answers

http://answers.oreilly.com/topic/1646-how-to-use-uiautomation-to-create-iphone-ui-tests/

関連動画

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

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

リンク元