「剣と魔法のログレス」公式サイトを支えるgemその1・テスト編

「剣と魔法のログレス」公式サイトを支えるgemその1・テスト編

こんにちは。 Web 開発チームの黒木です。

先日オープンサービスを開始した「剣と魔法のログレス」。その公式サイトは、 Aiming の Web 開発チームが Ruby on Rails3 を使って開発しました。

今日は、その「剣と魔法のログレス」公式サイトで使用している gem (数えてみたら全部で56個ありました!)の中から、テストに関連するものを紹介します。

rspec, rspec-rails

定番ですが、 Aiming の Web 開発チームでは Rails のテストを書くのに RSpec(on Rails) を使っています。

RSpec が何かという説明はここでは割愛します。先日、弊社の堀井が書いた記事(RSpec を使い始める人が読むべき N 個のドキュメント)に入門記事などへのリンクがまとまっていますので、そちらを参照してください。

cucumber, cucumber-rails

cucumber は、自然言語に近い形でテストケースを記述できるツールです。

例えばこんな感じのテストケースを書くことができます。

フィーチャ: お問い合わせ送信
 シナリオ: ユーザーがお問い合わせを送信できる。
  前提 "お問い合わせ"ページを表示している

  もし "メールアドレス"に"user@example.com"と入力する
  かつ "inquiry[inquiry_category_id]"から"不具合報告"を選択する
  かつ "お問い合わせ内容"に"問い合わせメッセージの本文。"と入力する
  かつ "確認画面へ"ボタンをクリックする

  ならば "お問い合わせ内容確認"ページを表示していること
  かつ "user@example.com"と表示されていること
  かつ "不具合報告"と表示されていること
  かつ "問い合わせメッセージの本文。"と表示されていること
  かつ "メール送信"ボタンをクリックする

  ならば "お問い合わせ送信完了"ページを表示していること
  かつ "bug@example.com"がメールを1通受信していること

これがテストケースとして回せるってすごい事で、 cucumber を使ってチーム外の人にテストケースの草稿を書いてもらうように…しようとした時期もあったのですが、現時点ではそこまではできていなくて、 cucumber を使ったテストは数えるほどしか書かれていません。その代わりに統合的なテストケースを書く時に活躍しているのが、次に紹介する capybara です。

capybara

capybara を使うと、「ブラウザでこういう動作をしたらこういう画面が出る」というテストケースがものすごく綺麗に書けるようになります。

例えばこんな感じ。

describe "Inquiries" do
  let!(:category) { Factory :inquiry_category }

  context 'with valid input params' do
    before do
      visit '/inquiries'

      fill_in 'inquiry_email', :with => 'alice@example.com'
      fill_in 'inquiry_player_name', :with => 'alice'
      fill_in 'inquiry_body', :with => 'some inquiry'
      select category.name, :from => 'inquiry_inquiry_category_id'
    end

    it 'should complete inquiry flow' do
      click_on 'inquiry_submit'
      page.current_path.should == '/inquiries/confirm_new'

      click_on 'inquiry_submit'
      page.current_path.should == '/inquiries/completed'
    end
  end
end

ここに登場する、 visit, fill_in, select, click_on などのメソッドが、 capybara で使えるようになるメソッドです。英語がある程度読めれば、上記のコードがどういうテストケースか、 RSpec や capybara を知らなくてもだいたいわかると思います。

capybara-webkit

上記の capybara を使って、更に javascript の挙動も含めたテストケースを書けるようになります。Qt と webkit を使う事でこれを実現しているのですが、これの利用には X server が必要で、開発環境に ubuntu server を使っていた私はテスト結果がエラーだらけになって大変でした。それを助けてくれたのが、次に紹介する headless です。

headless

Xvfb の Ruby 用インターフェースです。これを使うことで、 ubuntu server のような環境でも、 capybara-webkit を使ったテストケースを走らせることができるようになりました。

spork

RSpec on Rails の起動は、 Rails とアプリケーションの読み込みがあるので、非常に時間がかかります。今試しにやってみたら35秒くらいかかりました。TDD で開発していくとき、開発完了までには何度も何度もテストの実行は行います。その度にこんなに時間がかかったのではたまったもんじゃないです。

spork はこれを解決してくれるツールで、起動しておくとテスト実行に必要な Rails とアプリケーションの読み込みをしてくれて、ずっと保持しておいてくれます。テストの実行は spork が保持している Rails とアプリケーションに対して行うので、 2 回目からはあっという間に起動します。もちろん、アプリケーションで変更したファイルは読み込み直してくれます。

RSpec on Rails で TDD するなら spork は必須じゃないかなーと思ってます。


実はまだ半分くらいしか紹介してないですが、だいぶ長くなってきたので、ひとまずはここまでとします。続きに乞うご期待。