以前にCalabsh-Androidを動かしてみました。
Calabash-Androidを利用してAndroidのシナリオテストを日本語で書いてみる
上記を参考(自分のブログですが)にCalabash-andoridをAWS Device Farmで動かしてみたのでメモ
参考
環境
- MacOSX
- AndroidSDKなどの設定は完了済み
Calabash-android?
こちらの資料がわかりやすかったです。
テスト対象アプリ
AndroidStudioで作成したHelloWorld!と表示されるだけのアプリ
なお、Clabash-andoridではテストの際にインターネットアクセスを許容していないとダメなのでAndroidManifestは以下のように android.permission.INTERNET を追記してビルドしておいてください。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.toshihirock.helloworld" >
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
calabash-andoridのインストール
以下のコマンドでインストール。Rubyのバージョンは公式ドキュメントを見る限りruby 1.8.7以上であれば大丈夫のようです。
$gem install calabash-android
確認
$gem list --local |grep android
calabash-android (0.5.12)
なお、calabashでは環境変数$ANDROID_HOME
が設定されている必要があるのでやっておいてください
calabash-androidの設定
Calabash-androidで必要なファイル群を以下のコマンドで作成します。
$cd {your-android-project}
$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というディレクトリができているのが確認できるかと思います。
$tree features
features
├── my_first.feature
├── step_definitions
│ └── calabash_steps.rb
└── support
├── app_installation_hooks.rb
├── app_life_cycle_hooks.rb
├── env.rb
└── hooks.rb
試験はhoge.featureという形で作成すればよく、とりあえずmy_first.featureというファイルができました。(一つのファイルに複数の試験を書くのも可能)
試験の変更
スケルトンで作成された試験だと今回のアプリとは合っていないので以下のように「起動されたらHello world!と表示されること」という意味の試験に変更します。
Feature: HelloWorld feature
Scenario: Display "Hello World!"
Then I see "Hello world!"
ローカル環境で実行してみる
まずは、ローカル環境でテストが成功するか確認します。
エミュレーターが起動した状態で以下のコマンドを実行します。 app/build/outputs/apk/app-debug.apkという部分はテスト対象のアプリのapkに変更してください。
$cd {your-android-project}
$calabash-android run app/build/outputs/apk/app-debug.apk
Feature: HelloWorld feature
Scenario: Display "Hello world!" # features/my_first.feature:3
1299 KB/s (560158 bytes in 0.421s)
1703 KB/s (933970 bytes in 0.535s)
Then I see "Hello world!" # calabash-android-0.5.12/lib/calabash-android/steps/assert_steps.rb:5
1 scenario (1 passed)
1 step (1 passed)
0m17.717s
上記の通り、テストがpassしたことが分かります。
AWS Device farmへアップロードするテストのZIP圧縮
AWS Device farmでCalabash-androidを実行する際にfeaturesフォルダ配下の情報をZIP圧縮してアップロードする必要があるのでやっておきます。
$zip -r features.zip features
adding: features/ (stored 0%)
adding: features/my_first.feature (deflated 23%)
adding: features/step_definitions/ (stored 0%)
adding: features/step_definitions/calabash_steps.rb (deflated 10%)
adding: features/support/ (stored 0%)
adding: features/support/app_installation_hooks.rb (deflated 56%)
adding: features/support/app_life_cycle_hooks.rb (deflated 39%)
adding: features/support/env.rb (stored 0%)
adding: features/support/hooks.rb (stored 0%)
AWS Device Farmでやってみる
上記試験をAWS Device Farmでやってみます。
AWSのマネージメントコンソールにログインしてAWS Device Farmを選択します。東京リージョンがないのでOregonリージョンにします。
その後、Getting startedかCreate a new projectでプロジェクトを作成します。名前は適当で。
次にテスト対象のapkをアップロードします。私の環境の場合、 app/build/outputs/apk/app-debug.apk をアップロードしました。
アップロード後、アップロードしたアプリの情報が上記のように確認できます。
次にClabashのテストをアップロードします。先ほど作成したZIPファイルをアップロードします。
次にテストしたい実機端末を選択します。
デフォルトだと5機種でやるようになってますが、時間がかかるのでとりあえず1台だけやるように設定しました。
次に端末の状態を設定します。今回はデフォルトのままとします。
最後にReviewを行って、Runさせます。
しばらく待つとテスト結果が表示されます。
グラフ部分を選択すると詳細が確認できます。
画面の下にログも表示されており、こちらで定義した試験HelloWorld featureの実施とSetup SuiteとTeardown Suiteという試験が行われていることがわかりました。
画面キャプチャを取ってみる
試験を変更して画面キャプチャを取ってみます。
Feature: HelloWorld feature
Scenario: Display "Hello world!"
Then I see "Hello world!"
Then take picture
なお、指定可能な操作は以下に記載があります。
変更後、feature.zipを再作成します。
その後、AWS Device farmで create new runを選択し、再度試験を実行します。
テスト対象のapkについては先ほど利用したapkが選択できるので再度アップロードする必要がありませんが、feature.zipは変更されているので再度アップロードしてください。
少し待つと試験結果がわかりますが、Screeenshotsタブでスクリーンキャプチャが取得できているのが確認できます!
失敗するテストにしてみる
以下のように表示される想定の文言を変更して失敗するか確認します。
Feature: HelloWorld feature
Scenario: Display "Hello world!"
Then I see "aaaaaaa"
さきほどと同じようにfeature.zipを再アップロードして試験を行ってみます。
予想通り失敗しました。
Display "Hello world!" failed: Timeout waiting for elements: * {text CONTAINS[c] 'aaaaaaa'} (Calabash::Android::WaitHelpers::WaitError)
と表示され、aaaaaaというテキストが表示されるのを待ったけど表示されずエラーとなっているのも確認できます。
また、テスト失敗の際にはスクリーンキャプチャが取得されるようでした。
試験を日本語で書く
Calabshの良いところとして日本語でシナリオがかけるのでそれもやってみます。
まず、どの日本語の命令が指定された時にどの定義済みの命令と紐付けるのかを定義します。
# coding: utf-8
require 'calabash-android/calabash_steps'
ならば /^"(.*?)"と表示されていること$/ do |text|
step %{I see "#{text}"}
end
ならば /^スクリーンショットを撮る$/ do
step %{take picture}
end
ならばhogefugaと表示されていること と書いた場合には I see hogefuga という命令と書いたと等しいということを表しています。スクリーンショットの部分も同じになります。
紐付けが出来たのでfeatureファイルも変更します。
# language: ja
フィーチャ: HelloWorld画面の表示確認を行う
シナリオ: HelloWorld画面を表示する
ならば"Hello world!"と表示されていること
ならばスクリーンショットを撮る
同じようにzip化してアップロードしてみます。
おお、無事日本語で表示されています!
ログの一部は文字化け?してしまっていますが、Clabashの実行?部分なのでしょうがないかもしれません。。。
最後に
AWS Device Farmでは試験時のlogcatも取得できるようだったのでもし、エラーが発生した場合でも原因の特定がしやすいのではないかと思います。
また、Clabash-Androidは日本語で試験を書いてDevice Farmで試験をしておけば簡易なアプリの仕様書としても使えると思います。
まだ試してないですが、Espresso、JUnitなどの実行もやってみたいです。