こんにちは、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

重要なポイントは全部太字にしました。よく見たら、すごいと思わないですね。このようなツールは世の中にすでにいっぱいありますよ。

既存のテストライブラリ・ツール

  1. KIF ( Keep It Functional ) by Square
    • UI Test用
    • accessibility labelを利用している
  2. Kiwi by Allending
    • BDD test用
    • Cedarと似てる
  3. Cedar by Pivotal
    • BDD test用
    • よくできている、OCUnitの代替品になる
    • Deviceのサポートがない
  4. GHUnit by Gabriel
    • OCUnitの代替品
  5. GTM Unit test by Google
    • OCUnitの代替品
  6. OCUnit by Sen:te, supported by Apple
    • Unit Testの一番良いツール
  7. UIAutomation by Apple
    • 大変使い辛い
    • 勿体無いなぁ!
  8. Zucchini by Playup
  9. FoneMonkey -> MonkeyTalk by Gorilla Logic
  10. Frank by Moredip
    • Deviceでの実行はサポートしているとはいえ、なかなか使いづらい
  11. Calabash-iOS by lessPainful
    • 今日の本題 一番良い
    • BDD用
    • SimulatorとDevice両方使える
    • Record/Playbackをサポート

先に結論からいうと:Calabash-iOSが一番良いツール

なぜかというと、

  1. Cucumber式のテストコード書き方。頑張れば、 全部日本語で テストコードを書ける。
  2. Record/Playback機能は非エンジニアのテスターを開放。これは素晴らしい。
  3. 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 の抜粋

  1. Screenshots
  2. Playback of touch events
  3. Assertions

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さん!)次の記事を御覧ください。