連載
» 2015年01月28日 18時00分 公開

スマホ向け無料システムテスト自動化ツール(5):Calabash-Androidでテストシナリオを作成する方法 (4/5)

[伊藤宏幸,テスト自動化研究会(STAR),楽天株式会社]

UIコンポーネントを調査するためのインスペクター「console」

 これまでの連載で紹介した「MonkeyTalk」「uiautomator」と同様、Calabash-Androidにも、UIコンポーネントを調査するための機能(インスペクター)が、「calabash-android console {YOUR_APK_FILE}」コマンドという形で提供されています(以下、表記の統一のため、単に「console」と表記することとします)。

 「console」はCUIツールで、Calabash-Androidが提供している「Ruby API(GitHub)」を実行することで、インタラクティブにテスト対象アプリのUIコンポーネントを特定・操作することが可能です。

 また後述しますが、テスト対象アプリやテストサーバーを操作することも可能です。

consoleの基本的な使い方

 consoleの起動から終了までの基本的な流れは、以下の通りです。

  1. 実機を接続する/エミュレーターを起動する
  2. consoleを起動する
  3. テスト対象アプリを実機/エミュレーターへインストールする
  4. テストサーバーを起動する
  5. 調査対象画面へ移動する
  6. UIコンポーネントを特定・操作する
  7. テストサーバーを停止する
  8. (Optional)テスト対象アプリを実機/エミュレーターからアンインストールする
  9. 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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。