Calabash-Androidでテストシナリオを作成する方法:スマホ向け無料システムテスト自動化ツール(5)(4/5 ページ)
本連載では、AndroidおよびiOSアプリ開発における、システムテストを自動化するツールを紹介していきます。今回は、Calabash-Androidのテストで必要になる、各種UIコンポーネントの特定・操作・検証方法を紹介し、ステップ定義の仕方やUIコンポーネントを調査するための「console」について解説します。
UIコンポーネントを調査するためのインスペクター「console」
これまでの連載で紹介した「MonkeyTalk」「uiautomator」と同様、Calabash-Androidにも、UIコンポーネントを調査するための機能(インスペクター)が、「calabash-android console {YOUR_APK_FILE}」コマンドという形で提供されています(以下、表記の統一のため、単に「console」と表記することとします)。
「console」はCUIツールで、Calabash-Androidが提供している「Ruby API(GitHub)」を実行することで、インタラクティブにテスト対象アプリのUIコンポーネントを特定・操作することが可能です。
また後述しますが、テスト対象アプリやテストサーバーを操作することも可能です。
consoleの基本的な使い方
consoleの起動から終了までの基本的な流れは、以下の通りです。
- 実機を接続する/エミュレーターを起動する
- consoleを起動する
- テスト対象アプリを実機/エミュレーターへインストールする
- テストサーバーを起動する
- 調査対象画面へ移動する
- UIコンポーネントを特定・操作する
- テストサーバーを停止する
- (Optional)テスト対象アプリを実機/エミュレーターからアンインストールする
- consoleを終了する
【1】実機を接続する/エミュレーターを起動する
エミュレーターは、Android Studioなどから「AVD Manager」経由で起動されることが多いかと思いますが、次のコマンドでも起動できます。
$ $ANDROID_HOME/tools/emulator -avd {AVD_NAME} &
詳しくは、前回の『実機の接続/エミュレーターの起動』も併せてご確認ください。
【2】consoleを起動する
プロジェクトのルートディレクトリで「calabash-android console {YOUR_APK_FILE}」コマンドを実行することで、consoleを起動できます。
$ calabash-android console app/build/outputs/apk/app-calabash-release.apk No test server found for this combination of app and calabash version. Recreating test server. ←初回起動時のみ表示 atmarkitの鍵パスワードを入力してください: sample ←初回起動時のみ。リリース用に署名されたアプリをテストする際、keystore情報の入力が必要 Done signing the test server. Moved it to test_servers/dfa3d739ebdeb7ded0fd2f115d11cdc5_0.5.2.apk ←初回起動時のみ表示 Starting calabash-android console... Loading c:/Ruby192/lib/ruby/gems/1.9.1/gems/calabash-android-0.5.2/irbrc Running irb... *** WARNING: You must use ANSICON 1.31 or higher (https://github.com/adoxa/ansicon/) to get coloured output on Windows ←Windowsで起動したため表示 irb(main):001:0>
ちなみに「irb(main):001:0>」の部分が、consoleのコマンドプロンプトとなります。
【3】テスト対象アプリを実機/エミュレーターへインストールする
consoleで「reinstall_apps」コマンドを実行することで、テスト対象アプリを実機/エミュレーターへインストールできます。
irb(main):001:0> reinstall_apps 1948 KB/s (348794 bytes in 0.174s) 1945 KB/s (553402 bytes in 0.277s) nil irb(main):002:0>
【4】テストサーバーを起動する
consoleで「start_test_server_in_background」コマンドを実行することで、テストサーバーを起動できます。
irb(main):002:0> start_test_server_in_background WARNING: linker: libdvm.so has text relocations. This is wasting memory and is a security risk. Please fix. nil irb(main):003:0>
ちなみに、テストサーバーを起動せずに後述の操作を行うと、下記エラーが発生します。
HTTPClient::KeepAliveDisconnected (HTTPClient::KeepAliveDisconnected) (RuntimeError)
【5】調査対象画面へ移動する
実機/エミュレーターでテスト対象アプリを操作し、調査対象画面まで移動します。
【6】UIコンポーネントを特定・操作する
説明すべきことが非常に多いため、後述します。
【7】テストサーバーを停止する
consoleで「shutdown_test_server」コマンドを実行することで、テストサーバーを停止できます。
irb(main):003:0> shutdown_test_server nil irb(main):004:0>
【8】(Optional)テスト対象アプリを実機/エミュレーターからアンインストールする
consoleで「uninstall_apps」コマンドを実行することで、テスト対象アプリを実機/エミュレーターからアンインストールできます。
irb(main):004:0> uninstall_apps nil irb(main):005:0>
【9】consoleを終了する
consoleで「exit」コマンドを実行するか、または「Ctrl」+「C」キーを押すことで、consoleを終了できます。
consoleにおけるUIコンポーネントの特定・操作方法
Calabash-Androidでは、「uiquery」を発行することでUIコンポーネントを特定できます。またuiquery発行用のメソッドとして、「query」メソッドが用意されています。
uiqueryの書式
一応「Query Syntax(GitHub)」にまとめられていますが、非常に分かりづらいため、例を基にポイントを絞って説明します。
uiquery例 | 効果 |
---|---|
button | その画面の"Button"コンポーネントの情報を検索・表示する |
button id:'button_preview' | その画面の"Button"コンポーネントで、IDが「button_preview」のものの情報を検索・表示する |
button index:0 | その画面の"Button"コンポーネントの、0番目のものの情報を検索・表示する |
webView css:'div[name=mail]' | その画面の「WebView」コンポーネントで、<div name="mail">のものの情報を検索・表示する |
* | その画面の全コンポーネントの情報を検索・表示する |
これらをqueryメソッドの第1引数として渡すことで、UIコンポーネントの情報を検索・表示できます。
Customer Detail画面でのuiqueryの実行例を、以下に示します。
irb(main):004:0> query("button") [] irb(main):005:0> query("EditText") [ [0] { "id" => "name", "enabled" => true, "contentDescription" => "name textfield", "text" => "", "tag" => nil, "description" => "android.widget.EditText{b211bec0 VFED..CL .F....I. 66,0-194,40 #7f090005 app:id/name}", "class" => "android.widget.EditText", "rect" => { "center_y" => 117, "center_x" => 146, "height" => 40, "y" => 97, "width" => 128, "x" => 82 } }, [1] { "id" => "email", "enabled" => true, "contentDescription" => "mail textfield", "text" => "", "tag" => nil, "description" => "android.widget.EditText{b20eddb0 VFED..CL ......I. 66,0-194,40 #7f090007 app:id/email}", "class" => "android.widget.EditText", "rect" => { "center_y" => 165, "center_x" => 146, "height" => 40, "y" => 145, "width" => 128, "x" => 82 } } ] irb(main):006:0> query("* index:29") [ [0] { "id" => "button_preview", "enabled" => true, "contentDescription" => "preview", "text" => "", "tag" => nil, "description" => "com.android.internal.view.menu.ActionMenuItemView{b210e988 VFED..CL ......I. 0,0-56,48 #7f09000f app:id/button_preview}", "class" => "com.android.internal.view.menu.ActionMenuItemView", "rect" => { "center_y" => 49, "center_x" => 292, "height" => 48, "y" => 25, "width" => 56, "x" => 264 } } ]
queryメソッドの書式
こちらも一応「QueryコマンドのAPI(GitHub)」にまとめられていますが、非常に分かりづらいため、例を基にポイントを絞って説明します。
queryメソッド例 | 効果 |
---|---|
query("EditText") | その画面の"EditText"コンポーネントの全情報を検索・表示する |
query("EditText", "id") | その画面の"EditText"コンポーネントのID要素の情報のみを検索・表示する |
query("EditText", "text") | その画面の"EditText"コンポーネントのtext要素の情報のみを検索・表示する |
query("EditText", "id", "text") | その画面の"EditText"コンポーネントのID要素とtext要素の情報を検索・表示する |
要は、「query(uiquery, *args)」メソッドの第2引数として、UIコンポーネントの要素を可変長で指定可能ということです。
再び、Customer Detail画面での実行例を、以下に示します。
irb(main):007:0> query("EditText", "id") [ [0] "name", [1] "email" ] irb(main):008:0> query("*", "id") [ [ 0] nil, [ 1] "action_bar_overlay_layout", [ 2] "content", [ 3] "customer_detail_container", [ 4] "customer_detail", [ 5] nil, [ 6] "labelName", [ 7] "name", [ 8] nil, [ 9] "labelEmail", [10] "email", [11] nil, [12] "labelGender2", [13] "gender", [14] "genderMale", [15] "genderFemale", [16] nil, [17] "labelAge", [18] "agePicker", [19] "numberpicker_input", [20] "action_bar_container", [21] "action_bar", [22] nil, [23] nil, [24] "up", [25] "home", [26] nil, [27] "action_bar_title", [28] nil, [29] "button_preview" ]
UIコンポーネントの操作方法
Calabash-Androidが提供しているRuby API(GitHub)のうち、引数にuiqueryが含まれているものは、前述のuiqueryを使用して操作することが可能です。
以下、具体例を示します。
API | 効果 |
---|---|
element_exists(uiquery) | 指定したuiqueryに相当するUIコンポーネントが見つかった場合にtrueを返す |
element_does_not_exist(uiquery) | 指定したuiqueryに相当するUIコンポーネントが見つからなかった場合にtrueを返す |
Touch(uiquery, options={}) | 指定したuiqueryに相当するUIコンポーネントにタッチする |
enter_text(uiquery, text, options={}) | 指定したuiqueryに相当するUIコンポーネントに、引数"text"の値を設定する |
テスト対象アプリ/テストサーバーの操作方法
使用頻度の高いものを、以下に示します。
API | 効果 |
---|---|
reinstall_apps | テスト対象アプリを再インストールする。未インストール時はインストールを行う |
uninstall_apps | テスト対象アプリをアンインストールする |
start_test_server_in_background | テストサーバーを起動する |
shutdown_test_server | テストサーバーを停止する |
なお、Ruby API(GitHub)に明記されていないAPIについては、「{Rubyのインストールディレクトリ}/lib/ruby/gems/{Rubyのバージョン}/gems/calabash-android-0.5.2/lib/calabash-android」以下にあるCalabash-Androidのソースコードをご確認ください。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- テスト自動化の歴史と今後、良い/悪い事例〜システムテスト自動化カンファレンス2013レポート
テスト自動化を開発の“武器”にするための3つのポイントや、“自動化”の良い事例、悪い事例など、テストの現場を「進化させる」知見が多数紹介されたカンファンレンスの模様をレポートする。 - ビジネス目標を見据えたテスト設計が肝!「DevOps時代のテスト自動化カンファレンス 冬の陣」開催
DevOpsの実践で肝となるソフトウェアテストの自動化。しかし@ITの読者調査でも50%以上が「テスト環境に課題あり」と回答した。これにどう対応すれは良いのだろうか? カンファレンス登壇者の言葉にヒントを探る。 - Kiwi+CocoaPodsで始めるiOSアプリの振る舞いテスト入門
現代の開発現場において欠かせないCI/継続的デリバリを、iOSアプリ開発に適用するためのツールやノウハウを解説する連載。今回は、iOSアプリの機能の振る舞いをテストするテスティングフレームワークの特長とインストールの仕方、主な使い方を解説します。 - Android SDKでビジネスロジックのテストを自動化するには
- 第2回Androidテスト祭りレポート:Android開発の上層テストで失敗しないためのポイントとは
セキュリティ設計や受け入れテストガイドライン、CIツールJenkins+コードレビューGeritt、テスト効率化ノウハウ、リモートテストサービスなど