これまでの連載で紹介した「MonkeyTalk」「uiautomator」と同様、Calabash-Androidにも、UIコンポーネントを調査するための機能(インスペクター)が、「calabash-android console {YOUR_APK_FILE}」コマンドという形で提供されています(以下、表記の統一のため、単に「console」と表記することとします)。
「console」はCUIツールで、Calabash-Androidが提供している「Ruby API(GitHub)」を実行することで、インタラクティブにテスト対象アプリのUIコンポーネントを特定・操作することが可能です。
また後述しますが、テスト対象アプリやテストサーバーを操作することも可能です。
consoleの起動から終了までの基本的な流れは、以下の通りです。
エミュレーターは、Android Studioなどから「AVD Manager」経由で起動されることが多いかと思いますが、次のコマンドでも起動できます。
$ $ANDROID_HOME/tools/emulator -avd {AVD_NAME} &
詳しくは、前回の『実機の接続/エミュレーターの起動』も併せてご確認ください。
プロジェクトのルートディレクトリで「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のコマンドプロンプトとなります。
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>
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)
実機/エミュレーターでテスト対象アプリを操作し、調査対象画面まで移動します。
説明すべきことが非常に多いため、後述します。
consoleで「shutdown_test_server」コマンドを実行することで、テストサーバーを停止できます。
irb(main):003:0> shutdown_test_server nil irb(main):004:0>
consoleで「uninstall_apps」コマンドを実行することで、テスト対象アプリを実機/エミュレーターからアンインストールできます。
irb(main):004:0> uninstall_apps nil irb(main):005:0>
consoleで「exit」コマンドを実行するか、または「Ctrl」+「C」キーを押すことで、consoleを終了できます。
Calabash-Androidでは、「uiquery」を発行することでUIコンポーネントを特定できます。またuiquery発行用のメソッドとして、「query」メソッドが用意されています。
一応「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コマンドの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"
]
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のソースコードをご確認ください。
テスト自動化の歴史と今後、良い/悪い事例〜システムテスト自動化カンファレンス2013レポート
ビジネス目標を見据えたテスト設計が肝!「DevOps時代のテスト自動化カンファレンス 冬の陣」開催
Kiwi+CocoaPodsで始めるiOSアプリの振る舞いテスト入門
Android SDKでビジネスロジックのテストを自動化するにはCopyright © ITmedia, Inc. All Rights Reserved.