Calabash-Androidを動作させるためには、以下のものが必要です。
Calabash-Androidは、Ruby Gemを使用してインストールします。下記コマンドを実行することで、Calabash-Androidをインストールできます。
$ gem install calabash-android
ネットワーク環境にもよりますが、おおむね5分程度でインストールが完了します。
次に、下記コマンドを実行することで、calabash-androidが正しくインストールできていることを確認できます。
$ gem list --local | grep calabash calabash-android (0.5.2)
なお、Calabash-Androidのインストール方法は「Calabash-AndroidのGitHub上のInstallationページ」に詳細にまとめられているので、こちらも併せて参考にしてください。
Calabash-Androidでアプリをテストできるようにするためには、アプリ側にもいくつかの設定を行う必要があります。そのためには、「Instrumentation Test Server」の仕組みについて整理・理解しておく必要があります。
なお、本稿執筆時点(2014年11月)でのサンプルプログラムの状況は以下の通りです。詳細については、いずれも後述します。
Instrumentation Test Serverの仕組み(http://blog.lesspainful.com/2012/03/07/Calabash-Android/とhttp://blog.lesspainful.com/2012/03/07/Calabash/の図を基に筆者が加筆・修正)上図のようにCalabash-Androidは、「Instrumentation Test Server」という仕組みを使い、HTTP通信によってテスト対象アプリを操作します。
Instrumentation Test Serverは「AndroidのInstrumentationの仕組み」を使い、テスト対象アプリを操作します。
「Ruby Client Library」(フィーチャー/シナリオ/ステップをinterpretする機能)と「Instrumentation Test Server」との間でHTTP通信を行い、テスト対象アプリを操作します。このことは、下記資料を付き合わせることで確認できます。
また、Calabash-Androidの仕様として、Calabash-Androidがテスト対象とするapkと「Instrumentation Test Server」のapkは、同じ証明書で署名されている必要があります(詳しくは「Running Calabash Android」を参考にしてください)。
Calabash-Androidでテスト可能なアプリは、次のものです。
以上を踏まえ、アプリのセットアップを進めていきます。
先述の通り、Calabash-AndroidはRuby Client LibraryとInstrumentation Test Serverとの間でHTTP通信を行います。そのため、アプリにネットワークへの接続許可が必要になります。
この設定は、「{プロジェクトのルート}/app/src/main/AndroidManifest.xml」ファイルに下記の定義を追加することで実現できます。
<uses-permission android:name="android.permission.INTERNET" />
しかし、テストを実行するためだけにリリース対象アプリに直接手を加えることは得策ではありません。そのため、「MonkeyTalk」と同様、Calabash-Androidによるテスト実行専用のプロダクトフレーバーを追加します。
まず、「{プロジェクトのルート}/app/src/」の下に「calabash」ディレクトリを作成します。
「{プロジェクトのルート}/app/src/calabash」ディレクトリに、下記内容で「AndroidManifest.xml」ファイルを追加します。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
「{プロジェクトのルート}/app/build.gradle」ファイルを、下記のように修正します。
productFlavors {
<中略>
calabash {
applicationId "com.nowsprinting.hellotesting.calabash"
}
}
これで、リリース対象アプリに直接手を加えることなく、Calabash-Androidでアプリをテストすることが可能になります。
ちなみに、この設定を行わない場合、Calabash-Android実行時に下記のエラーが発生します。
RuntimeError: App did not start
リリース用に署名されたアプリをテストする場合、最初に、署名用にkeystoreファイルを作成する必要があります。以下は、今回のサンプルで使用する「{プロジェクトのルート}/sample.keystore」ファイルの作成手順です。
$ keytool -genkeypair -keyalg RSA -keystore sample.keystore -keypass sample -alias atmarkit -storepass atmarkit -validity 10000
なお特に明記のない限り、後述の説明は、この「{プロジェクトのルート}/sample.keystore」ファイルの設定に基づいて行うこととします。
リリース用に署名されたアプリをテストする場合、さらに上記で作成したkeystoreファイルを使用して、ビルド時にアプリへ署名できるようにします。
「{プロジェクトのルート}/app/build.gradle」ファイルを、下記のように修正します。
signingConfigs {
calabash {
storeFile file("../sample.keystore")
keyPassword "sample"
keyAlias "atmarkit"
storePassword "atmarkit"
}
}
productFlavors {
def calabashSigningVariable = signingConfigs.calabash
<中略>
calabash {
applicationId "com.nowsprinting.hellotesting.calabash"
signingConfig calabashSigningVariable
}
}
この修正後、プロジェクトのルートで下記コマンドを実行すると、リリース用に署名されたアプリが作成されるようになります。今回のサンプルでは「{プロジェクトのルート}/app/build/outputs/apk/app-calabash-release.apk」ファイルが該当します。
$ ./gradlew build
なお、gradleでのkeystoreファイルの指定方法については、以下も併せて参考にしてください。
テスト自動化の歴史と今後、良い/悪い事例〜システムテスト自動化カンファレンス2013レポート
ビジネス目標を見据えたテスト設計が肝!「DevOps時代のテスト自動化カンファレンス 冬の陣」開催
Kiwi+CocoaPodsで始めるiOSアプリの振る舞いテスト入門
Android SDKでビジネスロジックのテストを自動化するにはCopyright © ITmedia, Inc. All Rights Reserved.