まず、このツールを聞いたことが無い方に簡単に紹介します。Googleでcalabash-iosを検索すると一番のリンクをクリックすると、Calabash-iOSのHPに飛んでいきます。
原文を使って、簡単に説明すると
Calabash is an automated testing technology for Android and iOS native and hybrid applications
重要なポイントは全部太字にしました。よく見たら、すごいと思わないですね。このようなツールは世の中にすでにいっぱいありますよ。
- KIF ( Keep It Functional ) by Square
- UI Test用
- accessibility labelを利用している
- Kiwi by Allending
- BDD test用
- Cedarと似てる
- Cedar by Pivotal
- BDD test用
- よくできている、OCUnitの代替品になる
- Deviceのサポートがない
- GHUnit by Gabriel
- OCUnitの代替品
- GTM Unit test by Google
- OCUnitの代替品
- OCUnit by Sen:te, supported by Apple
- Unit Testの一番良いツール
- UIAutomation by Apple
- 大変使い辛い
- 勿体無いなぁ!
- Zucchini by Playup
- FoneMonkey -> MonkeyTalk by Gorilla Logic
- Frank by Moredip
- 2年ほど前から更新されていない
- Deviceでの実行はサポートしているとはいえ、なかなか使いづらい
- Calabash-iOS by lessPainful
- 今日の本題 一番良い
- BDD用
- SimulatorとDevice両方使える
- Record/Playbackをサポート
なぜかというと、
- Cucumber式のテストコード書き方。頑張れば、 全部日本語で テストコードを書ける。
- Record/Playback機能は非エンジニアのテスターを開放。これは素晴らしい。
- SimulatorとDeviceを同時にサポート。これだけでもはなかなか難しいだ。ほとんどのUIテストのフレームワークがうまくサポートしていない。
- UIAutomationは本当にダメな奴だ。
他の原因もあります。この記事では話さないのが、興味があれば、Googleしてね。
- CIシステムと統合しやすい
- テストケースの中に画面キャプチャーを取れる
CucumberはBDDの世界で非常に有名なツールです。Gherkinを使っているのが、実はあまりそれにきにしなくてもいいです。基本的に、そのテストコードが 自然言語(英語)と似ていて、読みやすい のが特徴です。
$ calabash-ios gen # generate the basic test cases
これを実行すると、次のようなコードが生成される
$ cat features/my_first.feature
Feature: Running a test
As an iOS developer
I want to have a sample feature file
So I can begin testing quickly
Scenario: Example steps
Given I am on the Welcome Screen
Then I swipe left
And I wait until I don't see "Please swipe left"
And take picture
ちなみに、GFM(github flavored Markdown)で
```cucumber
を書くと上記のようなSyntax Highlightができる。これは読みやすいぞ!
Cucumberの詳細はまた同じぐらい長さのBlog Postが必要なので、ここでは割愛します。
Calabashがすでにいろいろな Steps を定義してくれたので、基本的なそうだとテストは全部カーバー出来ました。その詳細はCalabash-iOSのWikiページを見れば、すぐに書けます。ここで敢えて一部の抜粋を説明します。
チームのエンジニアが忙しくて、テストをサボっている。非エンジニアの方はチームにいって、どうしても助けてあげたい!ただ、テストコードを書けず、人力テストしかできない。2週間やったら、非エンジニアの方が疲れて、テストがうまく進めていけない〜〜。
このようなシーンは多々あると思いますね。このタイミングに、ちょっと力になるのはCalabash-iOSの自動テストですね。
Calabashは実際にPrivate APIを使って、Eventをレコーディングして、後にそのレコーディングしたEventを完璧に再生できる。
まず、既存のアプリの.xcodeproj
が所在のフォルダで、次のコマンドを叩く:
$ calabash-ios setup
$ xcodebuild -list
終わったら、自動的にテスト専用のtargetが生成される。例えば CoreDataBooks
と言うサンプルコードを使うと、CoreDataBooks-cal
というターゲットが追加されます。
そのTargetを選択して、SimulatorもしくはDeviceに入れて、アプリを起動すると、Xcodeのコンソールに
2013-03-22 17:48:37.022 CoreDataBooks[11445:c07] Creating the server: <LPHTTPServer: 0x7574510>
2013-03-22 17:48:37.025 CoreDataBooks[11445:c07] simroot: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk
2013-03-22 17:48:37.027 CoreDataBooks[11445:c07] Started LPHTTP server on port 37265
2013-03-22 17:48:37.735 CoreDataBooks[11445:2103] Bonjour Service Published: domain(local.) type(_http._tcp.) name(Calabash Server)
このようなログが出力されます。
次は一番重要
Simulatorの場合は必ず同じMacにあるので、次のコマンドを叩くと大丈夫:
$ calabash-ios console
Running irb...
irb(main):001:0>
Deviceでテストを行うとき、必ず DeviceとMacを同じWiFi環境に入れてください。しかもこの環境でお互いにアクセス制限をかけていないのが前提条件です。
例えば、iPhoneのWiFi IP
アドレスは192.168.0.10
、次のコマンドを叩く:
$ NO_LAUNCH=1 DEVICE=iphone OS=ios5 DEVICE_ENDPOINT=http://192.168.0.10:37265 calabash-ios console
Running irb...
irb(main):001:0>
irbのインタラクションでrecord_begin
を叩くと、Eventのレコーディングが始まるよ〜〜
Record Start
irb(main):001:0> record_begin
""
irb(main):001:0>
SimulatorもしくはDevice上動作をしてくださいね。
Record End
irb(main):003:0> record_end "login_facebook"
Fetch version http://localhost:37265/version...
"login_facebook_ios6_iphone.base64"
playback
irb(main):003:0> playback "login_facebook"
BOOOOOM! なんと、すべての動作が自動的に動いている!これはすごくない?これはすごくない?
実はそんなにきにしなくてもいいよ。Assertionは本当にほんの一部のStepなので、他のStepももっともっと試してみてね。
これを見たら、試してみたいよね!?やりましょうよ!
$ gem install calabash-cucumber
何?それじゃGoogle先生に聞けば〜〜
〜完了〜