Instantly share code, notes, and snippets.

@TonnyXu /calabash-ios.jp.md Secret
Last active Dec 15, 2015

Embed
What would you like to do?
Calabash-iOSを使いこなすぞ

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を利用している
  1. Kiwi by Allending
  • BDD test用
  • Cedarと似てる
  1. Cedar by Pivotal
  • BDD test用
  • よくできている、OCUnitの代替品になる
  • Deviceのサポートがない
  1. GHUnit by Gabriel
  • OCUnitの代替品
  1. GTM Unit test by Google
  • OCUnitの代替品
  1. OCUnit by Sen:te, supported by Apple
  • Unit Testの一番良いツール
  1. UIAutomation by Apple
  • 大変使い辛い
  • 勿体無いなぁ!
  1. Zucchini by Playup
  2. FoneMonkey -> MonkeyTalk by Gorilla Logic
  3. Frank by Moredip
  • 2年ほど前から更新されていない
  • Deviceでの実行はサポートしているとはいえ、なかなか使いづらい
  1. Calabash-iOS by lessPainful
  • 今日の本題 一番良い
  • BDD用
  • SimulatorとDevice両方使える
  • Record/Playbackをサポート

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

なぜかというと、

  1. Cucumber式のテストコード書き方。頑張れば、 全部日本語で テストコードを書ける。
  2. Record/Playback機能は非エンジニアのテスターを開放。これは素晴らしい。
  3. SimulatorとDeviceを同時にサポート。これだけでもはなかなか難しいだ。ほとんどのUIテストのフレームワークがうまくサポートしていない。
  • 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)

このようなログが出力されます。

次は一番重要

Simulatorでのテスト

Simulatorの場合は必ず同じMacにあるので、次のコマンドを叩くと大丈夫:

$ calabash-ios console
Running irb...
irb(main):001:0> 

Deviceでのテスト

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> 

Record/Playback

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があれば、もっとテストケースぽいよね

実はそんなにきにしなくてもいいよ。Assertionは本当にほんの一部のStepなので、他のStepももっともっと試してみてね。


これを見たら、試してみたいよね!?やりましょうよ!

Calabash-iOSをインストール

$ gem install calabash-cucumber

gemとRubyがまだインストールしていない?

何?それじゃGoogle先生に聞けば〜〜

〜完了〜

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment