Google+ もご覧ください
ユーザーアイコン

実践!RubyMotion

第七回 RubyMotion × Calabashで受け入れテストを実現する

Satococoa

第七回 RubyMotion × Calabashで受け入れテストを実現する

前回はビューとコントローラのテストを書いてみました。今回は受け入れテストと呼ばれるEnd to End のテストを書いてみたいと思います。

motion-calabash

受け入れテストの機能は RubyMotion 標準では搭載されていません。ここでは motion-calabash という、Calabash の RubyMotion 向け gem を使用してみたいと思います。

Calabash は Ruby on Rails の開発者にはおなじみ Cucumber の iOS 及び Android 向け実装です。

インストール

RubyGems になっていますので、いつも通り Gemfile を編集して bundle コマンドを打ちます。

Gemfile

gem 'motion-calabash' # この一行を追加

ターミナルから以下を実行します。

$ bundle

続いて Calabash を動作させる上で必要なファイルを生成します。ターミナルから rake calabash:scaffold と入力してください。

$ rake calabash:scaffold
       Run Scaffolding features
      Info Run rake calabash:run to try
Copy launch file /Users/satoshi/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/motion-calabash-0.9.160.1/scripts/launch.rb to features/support/launch.rb

これで features ディレクトリが作られて、その中に以下のようなディレクトリやファイルが生成されます。

$ tree features
features
├── my_first.feature
├── step_definitions
│   ├── calabash_steps.rb
│   └── my_first_steps.rb
└── support
    ├── 01_launch.rb
    ├── 02_pre_stop_hooks.rb
    ├── env.rb
    └── launch.rb

2 directories, 7 files

実行してみる

calabash を使う上で主に作成・編集するファイルは feature ファイルと step 定義ファイルです。

先ほどのコマンド実行時に作られたファイルの中身を見てみましょう。

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

cucumber を使ったことのある方にはおなじみの Gherkin という記法で書かれています。ここでは詳しくは説明しませんが、決まった規則に従ってテストしたい内容を自然言語で書きます。

一見ただの文章ですが、既にテストとして動作します。ターミナルから以下のコマンドを打ち込んで、テストを実行してみましょう。

$ rake calabash:run

my_first.feature を実行
my_first.feature を実行

シミュレータが立ち上がり、テストが実行されたと思います。一見ただ起動して閉じただけに見えますが、左にスワイプし、最後にスクリーンショットを撮るという動作を行っています。screenshot_0.png のようなファイルが作られているのを確認できると思います。

さて、先ほど見ていただいた feature ファイルにある自然言語と、たった今シミュレータで実行された振る舞いを結びつけるのが step 定義ファイルです。

myfirststeps.rb というファイルを開いてください。

features/stepdefinitions/myfirst_steps.rb

Given /^I am on the Welcome Screen$/ do
  element_exists("view")
  sleep(STEP_PAUSE)
end

この step 定義ファイルによって、正規表現でマッチされた自然言語に対応する実際の検証・操作の定義が行われています。

ここでは Given I am on the Welcome Screen という一文に対して 「(何らかの) view があることを確認し、定数 STEP_PAUSE で定められた時間だけ sleep する」という動作が定義されています。

しかし my_first.feature の方に書いてあった Then I swipe left という文の定義はここにはありません。これは calabash に初めから組み込まれている定義を使っているからです。

組み込みの定義は features/stepdefinitions/calabashsteps.rb が require している calabash-cucumber/calabash_steps にあります。calabash-cucumber という gem の中にありますので、ターミナルから以下のコマンドを使って gem がインストールされているパスを調べてみましょう。

$ bundle show calabash-cucumber
/Users/satoshi/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/calabash-cucumber-0.9.160

上記のディレクトリの中にある、features/stepdefinitions/calabashsteps.rb というファイルの中に calabash 組み込みの step が定義されています。

Then I swipe left に対応する定義は以下のようになっていました。

Then /^I swipe (left|right|up|down)$/ do |dir|
  swipe(dir)
  sleep(STEP_PAUSE)
end

calabash でテストを書く際は、この組み込みの定義を使いつつ足りなければ自分で定義を付け足しながら cucumber の語彙を充実させていくことが大事な手順となります。

定義のブロック内で使える swipesleep といったメソッドの他にどのようなメソッドが使えるのかなどについては calabash-ios の wiki を見たり、先ほどの calabash-cucumber のソースを読んだりしながら書いていくことになるでしょう。

エントリ一覧と詳細のテストを書いてみる

では motion-calabash を使って、前回はテストできなかった以下の流れをテストしてみましょう。

  1. エントリ一覧が表示される
  2. 一番上のセルをタップすると詳細画面に遷移する
  3. ナビゲーションバーの戻るボタンで一覧画面に戻る

features/entries.feature を以下の内容で作ります。

features/entries.feature

Feature: エントリ一覧・詳細の機能
  エントリの一覧と本文を見ることが出来る

Scenario: エントリ一覧と詳細が見られる
  Given I am on the Entries Screen
  Then I wait to see a navigation bar titled "RubyMotion"
  Then I touch list item number 1
  Then I should see a webView
  Then I go back
  Then I wait to see a navigation bar titled "RubyMotion"

必要な step の定義を features/stepdefinitions/entriessteps.rb に記述します。

features/stepdefinitions/entriessteps.rb

Given /^I am on the Entries Screen$/ do
  element_exists("view")
end

Then /^I should see a webView$/ do
  check_element_exists("view:'UIWebView'")
end

ではターミナルから実行してみてください。

$ rake calabash:run

entries.feature を実行
entries.feature を実行

無事に上記のスクリーンショットのように通ってくれれば成功です。

また、calabash を使うと実機でテストを実行することも可能です。テストが充実してきたらぜひ実機でも動作させてみてください。

まとめ

今回は motion-calabash を使って受け入れテストを書く方法についてざっと解説しました。 calabash の雰囲気を掴んでいただけたなら幸いです。

ここまで約 3 ヶ月に渡って RubyMotion を使った iOS アプリケーション開発の流れをお見せしてきましたが、本連載における Qiita::API を使ったアプリの開発は一旦ここまでとします。 ぜひご自分で実装やテストを書いて拡張してみてください。

次回以降も RubyMotion で楽しく iOS アプリケーションを開発するための情報を引き続き提供していきたいと思いますので、どうぞよろしくお願いします。

今回のサンプルコードは 201311-1.zip です。

Rubymotion
タグ:

記事をリクエストする

関連記事

コメント