検索
連載

システムテスト自動化の基礎知識とMonkeyTalkの使い方スマホ向け無料システムテスト自動化ツール(1)(4/4 ページ)

本連載では、スマートフォン(Android/iOS)アプリ開発における、システムテストを自動化するツールを紹介していきます。初回はシステムテスト自動化の基礎知識とMonkeyTalkについて。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

UIコンポーネントの操作

 識別子で特定した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]にある以下のトグルを操作することでもスクリーンショットを撮影できます。

  • Turn screenshot-on-error on/off:スクリプトの実行中にエラーが発生したとき、スクリーンショットを撮影。デフォルトでon
  • Turn screenshot-after-every-command on/off:スクリプトの各行を実行するたびにスクリーンショットを撮影。デフォルトはoff

 いずれも、撮影されたスクリーンショットはワークスペースの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}
add_customer.mt(iOS版・抜粋)
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_many_customers.mt

 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操作を行うスクリプトを分離することで、シナリオ側の可読性を上げることができる
  • UI操作を担当するスクリプトにAndroid/iOSアプリ固有の操作をまとめることで、テストシナリオ側はAndroid/iOSで共通化できる

コラム「因子の組み合わせを絞り込む手法」

 UI操作を伴うテストは、自動といえどもテストの実行時間はゼロではありません。サンプルアプリにおいて「マーケティング区分」を求める組み合わせの因子は2つ(性別と年齢)しかありませんが、3つ以上に増えた場合はその組み合わせも爆発的に増えていきます。これを現実的な(必要十分な)組み合わせに絞り込むことが必要になるはずです。

 因子の組み合わせを絞り込む手法として「直交表(orthogonal array)」「ペアワイズ法(pairwise)」といった技法が確立されています。またペアワイズ法をサポートするツールとして、「PICT」「PictMaster」といった無償で利用できるものが知られています。


IDEではなくコマンドラインからMonkeyTalkスクリプトを実行

 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」のいずれかを指定し、最後に実行するスクリプトファイルパスを指定します。

 その他のコマンドラインオプションについては、オンラインのリファレンスを参照してください。

次回は、uiautomatorについて

 MonkeyTalkは、システムレベルのテスト自動化に必要な機能がひと通りそろった上、専用のIDEやレコーディング機能によってQA担当者でも比較的容易にテスト自動化が始められるツールです。

 また、Android/iOS双方に対応し、テストスクリプトも共通化が図りやすい点も優れたポイントです。

 テスト対象のアプリにエージェントをバンドルするため専用のビルド設定を行う必要はありますが、ビルド自体を自動化して毎回専用アプリが作られるようにすることで導入のハードルは下げられるはずです。

 次回は、Android向け自動化ツールである「uiautomator」を紹介します。

著者プロフィール

長谷川孝二

テスト自動化研究会(STAR)Androidテスト部

元メーカー系、現フリーランスのプログラマー。近年はスマートフォンアプリの受託開発を主にしつつ、『電エースQuiz - 河崎実監督と特撮映画の世界』(iOS)、『フットサル ルールと雑学』(iOS)、『山吹色の茸疾走』(Android)をリリース。

著書に『iOSアプリ テスト自動化入門』(秀和システム)、『Androidアプリテスト技法』(共著/秀和システム)

Blog:やらなイカ?
Twitter:@nowsprinting


Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る