iOS/AndroidにCucumberのBDDをもたらすテストフレームワークCalabashの基礎知識とインストール:スマホ向け無料システムテスト自動化ツール(4)(3/3 ページ)
本連載では、AndroidおよびiOSアプリ開発における、システムテストを自動化するツールを紹介していきます。今回から数回にわたりオープンソースの「Calabash」、特に「Calabash-Android」を中心に解説。今回は特にツールの基本的な設定・操作方法などを説明します。
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」コマンド実行時に、テストシナリオごとに次の処理が順番に行われます。
- テストサーバーの起動&初期設定の実施
- テスト対象アプリの実機/エミュレーターへのインストール
- テストシナリオの実行
- テスト対象アプリの実機/エミュレーターからのアンインストール
- テストサーバーの停止
これは、連載第3回の「テスト開始時に対象アプリを起動し直す」と同じ話で、テストの冪等性を実現しやすくします。
一方でCalabash-Androidの場合、「uiautomator」とは異なり、テスト対象アプリをテストシナリオの実行の都度アンインストール/インストールするため、テストの冪等性の実現以上にオーバーヘッドが掛かり過ぎてしまうこともあり得ます。この点を改善する方法は、後の連載で説明します。
次回は、テストシナリオの作成方法や、その他の便利な機能の使い方
今回は、Calabashの概要と基本的な設定・操作方法を中心に説明しましたが、いかがでしたしょうか。
次回は、「ステップ定義」を使用してテストシナリオを作成する方法や、その他の機能の使い方について説明します。
- iOS/AndroidのUIテストを自動化するAppiumのテストスクリプトの書き方とインスペクターの使い方
- SeleniumのUIテスト自動化をiOS/AndroidにもたらすAppiumの基礎知識とインストール方法、基本的な使い方
- Calabash-Androidのテスト高速化、GPS、スクショ、データ駆動型テスト
- Calabash-AndroidによるBDDの実践とJenkinsによる「Living documentation」
- Calabash-Androidでテストシナリオを作成する方法
- iOS/AndroidにCucumberのBDDをもたらすテストフレームワークCalabashの基礎知識とインストール
- Androidテストで便利なuiautomatorviewer、UiScrollableの使い方、テキスト入力API制限事項の回避方法
- Android SDK標準の何でもテストツールuiautomatorの基本的な使い方
- システムテスト自動化の基礎知識とMonkeyTalkの使い方
参考資料
- Calabasn-Androidのrdoc(0.5.2)
- The Cucumber Book
- Cucumber Recipes
- Specification by Example
- BDD in Action
- Specification By Example with Gherkin
著者プロフィール
伊藤宏幸
楽天株式会社 開発プロセスオプティマイゼーション部 品質保証課 テスト駆動開発グループ所属 アジャイルコーチ
アジャイルコーチおよびシステムアーキテクトとして、実際に開発現場に入り、CI/CD(Jenkins)、TDD/BDDをベースとした技術基盤の構築と、それらをベースとした開発プロセスの改善支援を行っている。モットーは、開発効率の向上による「Be happy!」の実現。
2014年3月より、テスト自動化研究会(STAR)に参加。
2014年7月、アメリカで開催された世界最大のアジャイルのカンファレンス「Agile 2014」に登壇。
- テーマ『Technology-Driven Development: Using Automation and Techniques to Grow an Agile Culture』、公式サイトページ、プレゼン資料、論文
著書『プログラミングの教科書 かんたん UML入門』(共著/技術評論社)
ブログ「THE HIRO Says」
Twitter:@hageyahhoo
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、テスト効率化ノウハウ、リモートテストサービスなど