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、テスト効率化ノウハウ、リモートテストサービスなど