システムテスト自動化の基礎知識とMonkeyTalkの使い方:スマホ向け無料システムテスト自動化ツール(1)(4/4 ページ)
本連載では、スマートフォン(Android/iOS)アプリ開発における、システムテストを自動化するツールを紹介していきます。初回はシステムテスト自動化の基礎知識とMonkeyTalkについて。
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}
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操作を行うスクリプトを分離することで、シナリオ側の可読性を上げることができる
- 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」を紹介します。
- iOS/AndroidのUIテストを自動化するAppiumのテストスクリプトの書き方とインスペクターの使い方
- SeleniumのUIテスト自動化をiOS/AndroidにもたらすAppiumの基礎知識とインストール方法、基本的な使い方
- Calabash-Androidのテスト高速化、GPS、スクショ、データ駆動型テスト
- Calabash-AndroidによるBDDの実践とJenkinsによる「Living documentation」
- Calabash-Androidでテストシナリオを作成する方法
- iOS/AndroidにCucumberのBDDをもたらすテストフレームワークCalabashの基礎知識とインストール
- Androidテストで便利なuiautomatorviewer、UiScrollableの使い方、テキスト入力API制限事項の回避方法
- Android SDK標準の何でもテストツールuiautomatorの基本的な使い方
- システムテスト自動化の基礎知識とMonkeyTalkの使い方
著者プロフィール
長谷川孝二
元メーカー系、現フリーランスのプログラマー。近年はスマートフォンアプリの受託開発を主にしつつ、『電エースQuiz - 河崎実監督と特撮映画の世界』(iOS)、『フットサル ルールと雑学』(iOS)、『山吹色の茸疾走』(Android)をリリース。
著書に『iOSアプリ テスト自動化入門』(秀和システム)、『Androidアプリテスト技法』(共著/秀和システム)
Blog:やらなイカ?
Twitter:@nowsprinting
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- テスト自動化の歴史と今後、良い/悪い事例〜システムテスト自動化カンファレンス2013レポート
テスト自動化を開発の“武器”にするための3つのポイントや、“自動化”の良い事例、悪い事例など、テストの現場を「進化させる」知見が多数紹介されたカンファンレンスの模様をレポートする。 - DevOps時代、テスト自動化はどうあるべきか?:ビジネス目標を見据えたテスト設計が肝!「DevOps時代のテスト自動化カンファレンス 冬の陣」開催
DevOpsの実践で肝となるソフトウェアテストの自動化。しかし@ITの読者調査でも50%以上が「テスト環境に課題あり」と回答した。これにどう対応すれは良いのだろうか? カンファレンス登壇者の言葉にヒントを探る。 - iOSアプリ開発でもCI/継続的デリバリしようぜ(2):Kiwi+CocoaPodsで始めるiOSアプリの振る舞いテスト入門
現代の開発現場において欠かせないCI/継続的デリバリを、iOSアプリ開発に適用するためのツールやノウハウを解説する連載。今回は、iOSアプリの機能の振る舞いをテストするテスティングフレームワークの特長とインストールの仕方、主な使い方を解説します。 - Androidアプリ開発テスト入門(2):Android SDKでビジネスロジックのテストを自動化するには
Android開発におけるビジネスロジックについて解説し、Android SDKのテストフレームワークの概要と使い方、テストの書き方を紹介します - 第2回Androidテスト祭りレポート:Android開発の上層テストで失敗しないためのポイントとは
セキュリティ設計や受け入れテストガイドライン、CIツールJenkins+コードレビューGeritt、テスト効率化ノウハウ、リモートテストサービスなど