BitArts Blog

ロードバイク通勤のRubyプログラマで伊豆ダイバー。の個人的なブログ。

RSpec+Capybara+SeleniumでモダンなWebアプリをテスト

Railsアプリのテストにrequest spec + Capybara(RSpec 2.10.0 + Capybara 1.1.2)を使い始めてみた 。Cucumberみたいに客も読めるみたいな文章風の文法ではないけど、単体テストからRSpecで統一できるのでお気軽。「受入テスト」というより「結合テスト」としてはいいかも。

基本的にはこんなふうにテストケースを書きます。

describe 'ユーザー情報' do
  it '詳細表示'
    vist users_path
    click_link '近藤勇'
    page.should have_content '近藤勇の詳細情報'
  end
end

いつでも回帰テストできる環境を知ってしまうと、もうテスト無しでは不安でコード書けません。

しかしJavaScriptAjaxを使ったアプリがターゲットの場合は面倒そうだなあ。と思ったら簡単だった。describeメソッドかitメソッドに :js=>true を追加するだけでSeleniumで動いちゃう。

describe 'ユーザー情報', :js => true do

Firefoxが起動してガチャガチャやってくれる。

でもWebSocketなどのPush技術を使って、あるクライアントが送信した情報が直接他の特定のクライアントに飛ぶようなアプリはどうやってテストしたらいいだろう。…、Capybaraのソースを眺めてたら、using_session を使えばいいっぽいことが分かった。異なるセッションでブラウザを複数起動できる。

it 'チャット送信'
  # 2つのブラウザで同じページを開く
  using_session :user_A do
    visit '/chat/001'
  end
  using_session :user_B do
    visit '/chat/001'
  end
  # メッセージを送信
  using_session :user_A do
    fill_in '名前', :with => 'おれ'
    fill_in 'メッセージ', :with => 'こんにちは。'
    click_button '送信'
  end
  # 相手のブラウザにメッセージが表示される
  using_session :user_B do
    page.should have_content 'こんにちは。'
  end
end

すばらしい。これで安心してWebSocketとかバリバリ使える。