こんにちは、genesixで働いているiOSのエンジニアTonnyです。
Calabash-iOSって何?
まず、このツールを聞いたことが無い方に簡単に紹介します。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
- Deviceでの実行はサポートしているとはいえ、なかなか使いづらい
- Calabash-iOS by lessPainful
- 今日の本題 一番良い
- BDD用
- SimulatorとDevice両方使える
- Record/Playbackをサポート
先に結論からいうと:Calabash-iOSが一番良いツール
なぜかというと、
- Cucumber式のテストコード書き方。頑張れば、 全部日本語で テストコードを書ける。
- Record/Playback機能は非エンジニアのテスターを開放。これは素晴らしい。
- SimulatorとDeviceでのテストを同時にサポート。これは実になかなか難しいことだ。他のUIテストのフレームワークはSimulatorとDeviceを同時にサポートできていない。
- UIAutomationは本当にダメな奴だ。
他の原因もあります。この記事では説明しませんが、興味があれば、Googleしてね。
その他の原因
- CIシステムと統合しやすい
- テストケースの中に画面キャプチャーを取れる
Cucumber式のテストコード
CucumberはBDDの世界で非常に有名なツールです。Gherkinを使っていますが、実はあまり気にしなくてもいいです。基本的に、そのテストコードが 自然言語(英語)と似ていて、読みやすい のが特徴です。
Calabashがデフォルトに入れてくれたテストケース
$ 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ページを見れば、すぐに書けます。ここで敢えて一部の抜粋を説明します。
Calabash-iOSの Predefined Steps の抜粋
Record/Playback機能は大変助かる
チームのエンジニアが忙しくて、テストをサボっている。非エンジニアの方はチームにいって、どうしても助けてあげたい!ただ、テストコードを書けず、人力テストしかできない。2週間やったら、非エンジニアの方が疲れて、テストがうまく進めていけない〜〜。
このようなシーンは多々あると思いますね。このタイミングに、ちょっと力になるのはCalabash-iOSの自動テストですね。
一言の仕組み
Calabashは実際に**Private API**を使って、Eventをレコーディングして、後にそのレコーディングしたEventを完璧に再生できる。
Sample
まず、既存のアプリの.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)
このようなログが出力されます。
次は一番重要だ
ただ、長さの制限があるので(なぜかわからないよね! Livedoorさん!)、次の記事を御覧ください。