連載
» 2014年12月16日 18時00分 公開

スマホ向け無料システムテスト自動化ツール(4):iOS/AndroidにCucumberのBDDをもたらすテストフレームワークCalabashの基礎知識とインストール (3/3)

[伊藤宏幸,テスト自動化研究会(STAR),楽天株式会社]
前のページへ 1|2|3       

Calabash-Androidのセットアップ

 アプリ側の設定終了後、Calabash-Androidに下記設定を行います。

keystoreファイルの認識(リリース用に署名されたアプリをテストする場合)

 上記で作成した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_settings」ファイルの有無により、Calabash-Androidがトリッキーな挙動を示すため、ここで挙動を整理します。

テスト対象アプリの種類 .calabash_settingsがある場合 .calabash_settingsがない場合
デバッグ証明書で署名されたアプリをテストする場合 ×テスト不可 ○テスト可能
リリース用に署名されたアプリをテストする場合 ○テスト可能(初回起動時のみパスワード入力が求められる) ×テスト不可

 整理すると、次のようになります。

  • デバッグ証明書で署名されたアプリをテストする場合「.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の基本的な使い方

 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」コマンド実行時に、テストシナリオごとに次の処理が順番に行われます。

  1. テストサーバーの起動&初期設定の実施
  2. テスト対象アプリの実機/エミュレーターへのインストール
  3. テストシナリオの実行
  4. テスト対象アプリの実機/エミュレーターからのアンインストール
  5. テストサーバーの停止

 これは、連載第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


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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