UIテストフレームワークCalabash-iOSを試す〜導入編〜

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

iOS向けのテストツール(主にUIテスト)を探していたところ、Calabash-iOSがすごくいいという記事を見つけました。

Calabash-iOSとは

Calabash-iOSはオープンソース(Eclipse Public License 1.0)のBDD系UIテストフレームワークです。Calabash-iOSのREADMEを見てみると、「AndroidとiOSのネイティブとハイブリッドアプリケーションのための自動テスト技術です」と書かれています。しかも上で紹介した記事で書かれている通り、シミュレータと実機の両方でテストが実行できるとのことです。

また、Calabashではビヘイビア駆動開発(BDD:Behaviour Driven Development)のツールとして有名なCucumberを使用しているので、テストコードはCucumberの書き方で書ける、すなわち自然言語にかなり近い形で書けます!今までExcelなどで書いていたテストケースをある程度流用することも可能です。

で、Calabash-iOSについての情報を探してみたところあまり見つからなかったので、導入から使い方までを紹介していきたいと思います。今回は導入編です。自分も書きながら覚えていきたいと思います!また、本記事では以下の環境を前提に説明します。

Mac OS X 10.8 Moutain lion
Xcode 4.6.2
iOS SDK 6.1

Calabash-iOSを導入の前に

Xcodeのバージョン確認とCommand Line Toolsのインストール

Calabash-iOSではXcodeは4.3以上が必要です。アップデートしましょう。アップデートしたら、Command Line Toolsをインストールしていなければインストールしましょう。Command Line Toolsは[Xcode>Preferences...]で設定画面を開き、Downloadsをクリックして表示した画面でインストールできます。

Rubyのバージョン確認

Calabash-iOSではgemを利用します。Ruby 1.8.7以上が必要です。以下のRubyのバージョンを確認して、古ければアップデートしましょう。

$ ruby -v

calabash-cucumberのインストール

以下のコマンドを実行して、calabash-cucumberをインストールします。

$ gem install calabash-cucumber

もしエラーが発生したら、コマンドの前にsudoを付けて実行してみましょう。

$ sudo gem install calabash-cucumber

早速使ってみよう!

プロジェクトの作成

それではまず、テスト対象となるXcodeプロジェクトを作成しましょう。XcodeよりSingle View Applicationを選択し、以下の内容でプロジェクトを作成しましょう。

項目 設定値
Product Name CalabashSample
Organization Name 自分の名前(サンプルなのでテキトー)
Company Identifier 会社名(サンプルなのでテキトー)
Class Prefix なし
Devices iPhone
Use Storyboards チェックする(ストーリーボードを使用)
Use Automatic Reference Counting チェックする(ARC有効)
Include Unit Tests チェックしない(unit testのターゲットを含まない)

Calabash-iOSのセットアップ

プロジェクトを作成したらターミナルを起動し、作成したプロジェクトディレクトリ(.xcodeprojが含まれるディレクトリ)に移動します。

$ cd some/path/CalabashSample

移動したら以下のコマンドを実行します。

$ calabash-ios setup

Xcodeが動いているとエラーになるので、コマンド実行前に予め終了しておいてください!

プロジェクトディレクトリの中にcalabash.frameworkが作成されていればOKです。

スケルトン作成

以下のコマンドを実行してスケルトンを作成します。

$ calabash-ios gen

プロジェクトディレクトリの中にfeaturesが作成されていればOKです。

プロジェクトのビルド

この状態でXcodeを起動すると、以下のようにスキーマとターゲットが作成されているはずです。CalabashSample-calスキーマを選択してプロジェクトをビルドしてください。

calabash-ios-1_1

calabash-ios-1_2

テスト実行!

これで準備完了です。あとは以下のコマンドをプロジェクトディレクトリで実行してみましょう。

$ cucumber

すると、シミュレータが起動しターミナルに以下のように表示されます。これでスケルトンで定義されたテストが実行されます。

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                            # features/my_first.feature:6
-------------------------------------
Auto detected APP_BUNDLE_PATH:

APP_BUNDLE_PATH=/Users/hirai/Library/Developer/Xcode/DerivedData/CalabashSample-hdefbpuucovnxvatciabnozakpoj/Build/Products/Debug-iphonesimulator/CalabashSample-cal.app

Please verify!
If this is wrong please set it as APP_BUNDLE_PATH in features/support/01_launch.rb
-------------------------------------
Waiting for App to be ready
    Given I am on the Welcome Screen                 # features/step_definitions/my_first_steps.rb:1
    Then I swipe left                                # calabash-cucumber-0.9.144/features/step_definitions/calabash_steps.rb:211
    And I wait until I don't see "Please swipe left" # calabash-cucumber-0.9.144/features/step_definitions/calabash_steps.rb:149
    And take picture                                 # calabash-cucumber-0.9.144/features/step_definitions/calabash_steps.rb:206

1 scenario (1 passed)
4 steps (4 passed)
0m7.970s

手動でXcodeに設定する場合

ここまではコマンドラインから自動でCalabash-iOSを設定する方法でしたが、手動で設定することもできます。

Xcodeプロジェクトの設定

まず、プロジェクトにある既存のターゲットからCalabash-iOS用のターゲットを複製します。ターゲットの複製は、複製したいターゲットで右クリックし、[Dupulicate target]を選択します。

calabash-ios-1_3

すると、以下の確認ダイアログが表示されるので、[Duplicate only]ボタンをクリックします。

calabash-ios-1_4

プロジェクト名 copy」としてターゲットが複製されるので、「プロジェクト名-cal」にリネームします。

calabash-ios-1_6

ターゲットを複製すると、同時にスキーマも「プロジェクト名 copy」として作成されるので、こちらも「プロジェクト名-cal」にリネームします。

calabash-ios-1_8

やらなくても大丈夫ですが、新しく作成したターゲットのProduct nameも同じように「プロジェクト名 copy」となっているので気になる場合はBuild settingsより直してください。

calabash-ios-1_10

必要なフレームワークの設定

Calabash-iOSを利用するためには以下の2つのフレームワークが必要となります。

  • calabash.framework
  • CFNetwork.framework(iOS SDKに同梱)

以下のURLからcalabash.frameworkをダウンロードします。(執筆時点で最新はcalabash.framework-0.9.126.zip)
https://github.com/calabash/calabash-ios/downloads

解凍してできたcalabash.frameworkをプロジェクトに追加します。このとき、[Add to targets]にCalabashSample-calのみを選択するようにしてください。

calabash-ios-1_11

CFNetowork.frameworkを追加すれば、必要なフレームワークの設定は終了です。

calabash-ios-1_12

Build setiingsの変更

作成したターゲットプロジェクト名-calのBuild settingsを開き、以下の項目を変更します。

項目 設定値
Other linker flags -force_load "$(SRCROOT)/calabash.framework/calabash" -lstdc++

calabash-ios-1_13

実行できるか確認する

スキーマにプロジェクト名-calを設定し、シミュレータで実行してみましょう。Xcodeのコンソールに以下のように表示されれば成功です。

2013-05-21 21:00:57.878 CalabashSample-cal[10040:c07] Creating the server: <LPHTTPServer: 0x721b2e0>
2013-05-21 21:00:57.880 CalabashSample-cal[10040:c07] simroot: /path-to-iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk
2013-05-21 21:00:57.884 CalabashSample-cal[10040:c07] Started LPHTTP server on port 37265
2013-05-21 21:00:58.514 CalabashSample-cal[10040:2003] Bonjour Service Published: domain(local.) type(_http._tcp.) name(Calabash Server)

まとめ

今回はCalabash-iOSの導入まで解説しました。まだテストコードを実際に書いたりしてないのでなんとも言えません!次回はサンプルアプリを使用して実際にテストコードを書いてみたいと思います。