2011/08/17からのアクセス回数 8369
titanium/単体テスト(QUnit)を試すでは、データベース廻りの単体テストを紹介しましたが、 今回は、XCodeに付属するAutomationを使ったUIのテスト方法について説明します。
Automationは、XCodeのInstrumentsのライブラリとして提供されています。
Automationのテストは、javascriptで記述したスクリプトに沿って行われます。
Scriptのタグで使用するスクリプトをセットします。ここではautomation_test.jsをセットします。
最初に、ログの出力と部品の構成を出力するスクリプトを実行します。
UIALogger.logStart("Starting Test"); UIALogger.logStart("Logging Tab1 element tree …"); UIATarget.localTarget().logElementTree(); UIALogger.logPass();
しています。スクリプトの実行は、Recordボタンを押した後にStart Scriptボタンを押します。 *2
テストの画面は、
出力結果は、
これでは、良く分からないので、このログの階層構造を示すと以下のようになります。
Automation Reference Collection*3 に各部品へのアクセス方法が載っています。
すべてのUI部品が、UIAElementクラスのサブクラスとなっているので、部品が含む要素は、buttons()等のように部品要素単位で取得することができます。
logElementTreeで正確な画面の構成が取得できるので、これを元に部品にアクセスします。
最初のスクリプトにタブバーのTab 1ボタンの名前を出力してみます。
var target = UIATarget.localTarget(); var app = target.frontMostApp(); var main = app.mainWindow(); var navi = main.navigationBar(); var tab = main.tabBar(); UIALogger.logDebug(tab.buttons()[0].name());
実行結果は、以下の通りです。
次に画面遷移ですが、通常の操作通り、部品をタップ(tap関数)して画面を遷移します。
Tab 2のWebViewのFoodLogサイト画面に遷移してみます。 Webページの表示に時間がかかるので、delay関数ですこし待ちます。
tab.buttons()["Tab 2"].tap(); target.delay(3.0); UIALogger.logStart("Logging Tab2 element tree …"); main.logElementTree(); UIALogger.logPass();
ログの結果、WeViewの中身の要素も通常の要素と同じように表示されていることが分かります。 *4
また、tapの直後はmain.logElementTreeが正しく表示されませんので、delay関数で少し時間を 置くのを忘れないようしてください。
画面の切り替えができたので、テストシナリオに沿った動作をさせてみましょう。
以上の処理をスクリプトにすると記録の追加は、
// Tab 1に戻り tab.buttons()["Tab 1"].tap(); target.delay(2.0); // 追加ボタンを押す navi.buttons()["Add"].tap(); target.delay(0.5); // 体重を入力 main.textFields()[1].setValue("63.5"); target.delay(1.0); main.buttons()["この値で保存する"].tap(); target.delay(1.0);
となり、グラフ表示は、
// グラフを表示 navi.buttons()["Graph"].tap(); target.delay(1.0);
となります。
実際にiPhoneシミュレータで実行している動画をアップします。
上記デモに使ったテストスクリプト
皆様のご意見、ご希望をお待ちしております。