識別子で特定したUIコンポーネントに対する操作は、Action欄で指定します。ここでは代表的なコンポーネントのActionをいくつか紹介します。
Button
アクション「Tap」でタップ操作、「LongPress」で長押し操作を実行できます。その他、「TouchDown」など細かいイベントを発生させることや、タップされた座標(x, y)を引数(Arguments欄)に指定することも可能です。
ButtonSelector
ButtonSelectorは、iOSでは「UISegmentedControl」、Androidでは「RadioGroup」に該当します。アクション「Select」は、引数に指定したタイトルラベルを持つボタンを選択状態にします。またアクション「SelectIndex」では、引数に指定した添字に該当するボタンを選択状態にすることができます。
Input
Inputは、iOSでは「UITextField」、Androidでは「android.widget.TextView」に該当します。アクション「EnterText」で、引数に渡した文字列を入力させることができます。
マルチバイト文字(日本語など)も入力できますが、半角スペースを含む場合は引用符でくくる必要があります(引数の区切りと判断されてしまうため)。また、「enter」と指定すると、ソフトウェアキーボードの[Enter]キーを押された振る舞いを再現できます。
ItemSelector
ItemSelectorは、iOSでは「UIPickerView」、Androidでは「Spinner」に該当します。アクション「Select」は、引数に指定したラベルを持つアイテムを選択状態にします。またアクション「SelectIndex」では、引数に指定した添字に該当するアイテムを選択状態にすることができます。
それぞれ、サンプル(iOS版)では以下のように記述しています。
Button Add Tap ButtonSelector "gender segmentedcontrol" Select 男性 Input name EnterText "Newton Geizler" enter ItemSelector "age pickerview" Select 35
ほとんどのコンポーネントは、「Verifiable」で定義されたActionを継承しています。valueを文字列で比較する「Verify」と「VerifyNot」、正規表現で比較する「VerifyRegex」「VerifyNotRegex」、あらかじめ用意した画像と比較する「VerifyImage」、コンポーネントが表示されるのを待機する「WaitFor」「WaitForNot」が用意されており、これらを使用してUIコンポーネントの表示内容を検証できます。
例えば、サンプルでは以下のように記述しています。これは入力した顧客情報をUIWebView(WebView)に表示した画面で、各項目が入力した値通りであることを検証しています。
View name Verify "Newton Geizler" View gender Verify 男性 View age Verify 35 View division Verify "M2層"
なお、「Verify」の検証がエラーとなったとき、テストスクリプトの実行はその箇所で停止します。
システムテストは、より下層に位置するユニットテストなどと比べると厳密な値の検証を行う難易度は高く、特に、日時、天気、株価、為替、乱数、また通信環境のエラーといった変動要素がある場合は非常に困難です。
システムテストとして、その結合度を優先できるのであれば、ここでの検証は「VerifyRegex」などを使用した“あいまいな”検証(例えば「数桁の数字が入っている」というレベル)にとどめて、厳密な検証はより下層のユニットテストなどでスタブサーバーやモックフレームワークを利用して行うことをお勧めします。
Android/iOSデバイスに対する操作を行うコンポーネント「Device」が定義されています(MonkeyIDには常に`*`を指定します)。
「Device」に対し、アクションに「Rotate」、引数に向きを指定することで端末を回転させることができます。引数には、iOSの場合は「left」もしくは「right」、Androidの場合は「portrait」もしくは「landscape」を指定します。
また「Device」には、端末を振るジェスチャを行う「Shake」、iOSのナビゲーションバーボタンおよびAndroidの[Back]キーを操作する「Back」といったアクションも定義されています。
テストスクリプトの途中で必要に応じて、コンポーネント「Device」のアクション「Screenshot」でスクリーンショットを撮影できます。
またスクリプトに明示的に記述せず、MonkeyTalk IDEメニューバーの[MonkeyTalk]にある以下のトグルを操作することでもスクリーンショットを撮影できます。
いずれも、撮影されたスクリーンショットはワークスペースのscreenshotsディレクトリおよびreports/screenshotsディレクトリに出力されます。
一般に「パラメタライズドテスト(Parameterized Test)」(シナリオBDDフレームワークの「Cucumber」では「Scenario Outline」)などと呼ばれる機能が、MonkeyTalkにも備わっています。一連のシナリオ(例えば、サンプルアプリにおける顧客の追加)を、その入力値を変えて何パターンも実行したい場合、下記のように記述できます。
Vars * Define name mail gender age division (snip) Input name EnterText ${name} enter ButtonSelector "gender segmentedcontrol" Select ${gender} ItemSelector "age pickerview" Select ${age} (snip) View name Verify ${name} View gender Verify ${gender} View age Verify ${age} View division Verify ${division}
Script add_customer.mt Run "Newton Geizler" * "男性" "35" "M2層" Script add_customer.mt Run "Hermann Gottlieb" * "男性" "34" "M1層" Script add_customer.mt Run "Mako Mori" * "女性" "22" "F1層"
add_customer.mtは、先頭の「Vars * Define」で変数を定義しており、これを以降のスクリプトの中で「${name}」のように使用しています。変数は入力だけではなく、「Verify」にも使用できます。
一方のadd_many_customers.mtでは、「Script add_customer.mt Run」構文で、先に定義したadd_customer.mtを実行しています。
「Script」に指定した引数はそのままの順序でadd_many_customers.mt側の変数にそれぞれ割り当てられ、実行されます。
このようにパラメーター付きで他のスクリプトファイルを呼び出せるため、テストスクリプトを構造化できます。構造化を行うことで以下のような効果を期待できます。
UI操作を伴うテストは、自動といえどもテストの実行時間はゼロではありません。サンプルアプリにおいて「マーケティング区分」を求める組み合わせの因子は2つ(性別と年齢)しかありませんが、3つ以上に増えた場合はその組み合わせも爆発的に増えていきます。これを現実的な(必要十分な)組み合わせに絞り込むことが必要になるはずです。
因子の組み合わせを絞り込む手法として「直交表(orthogonal array)」「ペアワイズ法(pairwise)」といった技法が確立されています。またペアワイズ法をサポートするツールとして、「PICT」「PictMaster」といった無償で利用できるものが知られています。
MonkeyTalkのスクリプトは、IDEではなくコマンドラインからも以下のように実行できます。
$ java -jar monkeytalk-runner-2.0.5.jar -agent iOS add_many_customers.mt
「monkeytalk-runner-2.0.5.jar」は、MonkeyTalkのzipファイルのrunnerディレクトリに同梱されています。「-agent」には「iOS」「Android」「AndroidEmulator」のいずれかを指定し、最後に実行するスクリプトファイルパスを指定します。
その他のコマンドラインオプションについては、オンラインのリファレンスを参照してください。
MonkeyTalkは、システムレベルのテスト自動化に必要な機能がひと通りそろった上、専用のIDEやレコーディング機能によってQA担当者でも比較的容易にテスト自動化が始められるツールです。
また、Android/iOS双方に対応し、テストスクリプトも共通化が図りやすい点も優れたポイントです。
テスト対象のアプリにエージェントをバンドルするため専用のビルド設定を行う必要はありますが、ビルド自体を自動化して毎回専用アプリが作られるようにすることで導入のハードルは下げられるはずです。
次回は、Android向け自動化ツールである「uiautomator」を紹介します。
長谷川孝二
元メーカー系、現フリーランスのプログラマー。近年はスマートフォンアプリの受託開発を主にしつつ、『電エースQuiz - 河崎実監督と特撮映画の世界』(iOS)、『フットサル ルールと雑学』(iOS)、『山吹色の茸疾走』(Android)をリリース。
著書に『iOSアプリ テスト自動化入門』(秀和システム)、『Androidアプリテスト技法』(共著/秀和システム)
Blog:やらなイカ?
Twitter:@nowsprinting
Copyright © ITmedia, Inc. All Rights Reserved.