アプリ側の設定終了後、Calabash-Androidに下記設定を行います。
上記で作成したkeystoreファイルの内容をCalabash-Androidでも認識できるようにするため、プロジェクトのルートで下記コマンドを実行します。
$ calabash-android setup Please enter keystore information to use a custom keystore instead of the default Please enter keystore location ./sample.keystore Please enter the password for the keystore atmarkit Please enter the alias atmarkit Saved your settings to .calabash_settings. You can edit the settings manually or run this setup script again
プロジェクトのルートに「.calabash_settings」というファイルが作成されます。ここにkeystoreファイルの情報が格納されます。
ちなみに、この設定を行った上で、署名されていないアプリをCalabash-Androidでテストしようとすると、下記のエラーが発生します。
{YOUR_APK_FILE} is not signed with any of the available keystores. Tried the following keystores: {プロジェクトのルート}/sample.keystore You can resign the app with {プロジェクトのルート}/sample.keystore by running: calabash-android resign {YOUR_APK_FILE} Notice that resigning an app might break some functionality. Getting a copy of the certificate used when the app was build will in general be more reliable.
なお、Calabash-Androidのセットアップ方法は「Code and Drivel/Android : Calabash Android Automation Setup」に詳細にまとめられているので、こちらも併せて参考にしてください。
テスト対象アプリの種類と「.calabash_settings」ファイルの有無により、Calabash-Androidがトリッキーな挙動を示すため、ここで挙動を整理します。
テスト対象アプリの種類 | .calabash_settingsがある場合 | .calabash_settingsがない場合 |
---|---|---|
デバッグ証明書で署名されたアプリをテストする場合 | ×テスト不可 | ○テスト可能 |
リリース用に署名されたアプリをテストする場合 | ○テスト可能(初回起動時のみパスワード入力が求められる) | ×テスト不可 |
整理すると、次のようになります。
プロジェクトのルートで下記コマンドを実行することで、Calabash-Androidの実行に必要なファイル群とスケルトンを生成できます。
$ calabash-android gen ----------Question---------- I'm about to create a subdirectory called features. features will contain all your calabash tests. Please hit return to confirm that's what you want. --------------------------- <★リターンキーを押す> ----------Info---------- features subdirectory created. ---------------------------
プロジェクトのルートに、下記ファイル群が作成されていることをご確認ください。
features:Calabash-Androidのテストファイル群を格納するディレクトリ ├step_definitions:Step definitionファイル群(後の連載で説明予定)を格納するディレクトリ │ └calabash_steps.rb:Step definitionファイルのスケルトン ├support:フックの設定などを格納するディレクトリ │ ├app_installation_hooks.rb:テストシナリオの実行前後へフックを設定したい場合に使用 │ ├app_life_cycle_hooks.rb:アプリケーション全体のライフサイクルへフックを設定したい場合に使用 │ ├env.rb:独自フックを設定したい場合に使用 │ └hooks.rb:独自フックを設定したい場合に使用 └my_first.feature:フィーチャーファイルのスケルトン
Calabash-Androidでのテストは、上記ディレクトリにファイルを作り足していく形となります。
Calabash-Androidは、コマンドラインで操作・実行していきます。ただし、非常にトリッキーかつ難しいところも多いため、順番に丁寧に説明していきます。
特にWindows系OSでCalabash-Androidを操作しようとすると、次のようなエラーが出ることがあります。
$ calabash-android run app/build/outputs/apk/app-calabash-release.apk c:/Ruby192/lib/ruby/gems/1.9.1/gems/calabash-android-0.5.2/lib/calabash-android/helpers.rb:159:in `scan': invalid byte sequence in Windows-31J (ArgumentError) from c:/Ruby192/lib/ruby/gems/1.9.1/gems/calabash-android-0.5.2/lib/calabash-android/helpers.rb:159:in `extract_md5_fingerprint' from c:/Ruby192/lib/ruby/gems/1.9.1/gems/calabash-android-0.5.2/lib/calabash-android/java_keystore.rb:20:in `initialize' from c:/Ruby192/lib/ruby/gems/1.9.1/gems/calabash-android-0.5.2/lib/calabash-android/java_keystore.rb:48:in `new' from c:/Ruby192/lib/ruby/gems/1.9.1/gems/calabash-android-0.5.2/lib/calabash-android/java_keystore.rb:48:in `read_keystore_with_default_password_and_alias' from c:/Ruby192/lib/ruby/gems/1.9.1/gems/calabash-android-0.5.2/lib/calabash-android/java_keystore.rb:67:in `get_keystores' from c:/Ruby192/lib/ruby/gems/1.9.1/gems/calabash-android-0.5.2/lib/calabash-android/helpers.rb:125:in `sign_apk' from c:/Ruby192/lib/ruby/gems/1.9.1/gems/calabash-android-0.5.2/lib/calabash-android/helpers.rb:104:in `block in resign_apk' from c:/Ruby192/lib/ruby/1.9.1/tmpdir.rb:83:in `mktmpdir' from c:/Ruby192/lib/ruby/gems/1.9.1/gems/calabash-android-0.5.2/lib/calabash-android/helpers.rb:98:in `resign_apk' from c:/Ruby192/lib/ruby/gems/1.9.1/gems/calabash-android-0.5.2/bin/calabash-android:114:in `<top (required)>' from c:/Ruby192/bin/calabash-android:23:in `load' from c:/Ruby192/bin/calabash-android:23:in `<main>'
これは、Calabash-Androidが文字コードとして「UTF-8」を動作前提としている一方で、Calabash-AndroidのバックエンドとしてのRubyのデフォルト文字コードが「UTF-8」ではない場合に発生します。このエラーが発生した場合は、以下の方法で解決できます。
$ ruby -e "puts Encoding.default_external" Windows-31J $ set LANG=ja_JP.UTF-8 $ export LANG=ja_JP.UTF-8 $ruby -e "puts Encoding.default_external" UTF-8
2行目でUTF-8ではないことを確認できます。4行目はMS DOS系CUIツールの場合で、5行目はLinux系CUIツールの場合です。8行目でUTF-8に変更されていることを確認できます。
また、あらかじめ環境変数「LANG」に「ja_JP.UTF-8」を指定しておいてもいいでしょう。
エミュレーターは、Android Studioなどから「AVD Manager」経由で起動されることが多いかと思いますが、次のコマンドでも起動できます。
$ $ANDROID_HOME/tools/emulator -avd {AVD_NAME} &
ちなみに、エミュレーター起動後にCalabash-Androidを操作しようとすると、次のようなエラーが出ることがあります。
No connected devices (RuntimeError)
これは、「adbサーバー」が当該のエミュレーターを認識できていない場合に発生します。このエラーが発生した場合は、以下の方法で解決できます。
$ $ANDROID_HOME/platform-tools/adb kill-server $ $ANDROID_HOME/platform-tools/adb start-server * daemon not running. starting it now on port 5037 * * daemon started successfully * $ $ANDROID_HOME/platform-tools/adb devices List of devices attached emulator-5554 device
9行目でエミュレーターが認識されていることを確認できます。
準備が長かったですが、ようやくテストを実行できます。テストは、「calabash-android run {YOUR_APK_FILE}」コマンドで実行できます。
以下が、実際にテストを実施した際のコンソールメッセージの例です。
$ calabash-android run 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 Done signing the test server. Moved it to test_servers/2ff6eedba9f164539ccf5c0c29e35ba7_0.5.2.apk Feature: XXX (中略) 2256 KB/s (553402 bytes in 0.239s) 2171 KB/s (127482 bytes in 0.057s) WARNING: linker: libdvm.so has text relocations. This is wasting memory and is a security risk. Please fix. (中略) 1 scenario (1 passed) 4 steps (4 passed) 0m11.259s
2行目は基本、初回起動時のみ(次回解説)です。3行目も初回起動時のみです。リリース用に署名されたアプリをテストする際、keystore情報の入力が必要です。4行目も初回起動時のみです。アプリの再署名を実施します。
テストシナリオの具体的な作成方法は、次回説明します。
Calabash-Androidの初期設定では、「calabash-android run」コマンド実行時に、テストシナリオごとに次の処理が順番に行われます。
これは、連載第3回の「テスト開始時に対象アプリを起動し直す」と同じ話で、テストの冪等性を実現しやすくします。
一方でCalabash-Androidの場合、「uiautomator」とは異なり、テスト対象アプリをテストシナリオの実行の都度アンインストール/インストールするため、テストの冪等性の実現以上にオーバーヘッドが掛かり過ぎてしまうこともあり得ます。この点を改善する方法は、後の連載で説明します。
今回は、Calabashの概要と基本的な設定・操作方法を中心に説明しましたが、いかがでしたしょうか。
次回は、「ステップ定義」を使用してテストシナリオを作成する方法や、その他の機能の使い方について説明します。
伊藤宏幸
楽天株式会社 開発プロセスオプティマイゼーション部 品質保証課 テスト駆動開発グループ所属 アジャイルコーチ
アジャイルコーチおよびシステムアーキテクトとして、実際に開発現場に入り、CI/CD(Jenkins)、TDD/BDDをベースとした技術基盤の構築と、それらをベースとした開発プロセスの改善支援を行っている。モットーは、開発効率の向上による「Be happy!」の実現。
2014年3月より、テスト自動化研究会(STAR)に参加。
2014年7月、アメリカで開催された世界最大のアジャイルのカンファレンス「Agile 2014」に登壇。
著書『プログラミングの教科書 かんたん UML入門』(共著/技術評論社)
ブログ「THE HIRO Says」
Twitter:@hageyahhoo
Copyright © ITmedia, Inc. All Rights Reserved.