検索
連載

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

本連載では、AndroidおよびiOSアプリ開発における、システムテストを自動化するツールを紹介していきます。今回は、Calabash-Androidのテストで必要になる、各種UIコンポーネントの特定・操作・検証方法を紹介し、ステップ定義の仕方やUIコンポーネントを調査するための「console」について解説します。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

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.

ページトップに戻る