Rspec + Capybara + Poltergeist で外部サイトのテストをする方法
概要
外部サイトをテストしたい!なんてことはほとんどないが、 スクレイピングだったりで外部サイトに依存する場合に検知できる方法ないかと思い、 Rspec + Capybara + Poltergeist で外部サイトをテストしてみた。
準備
必要 gem のインストール
# cd [WORK_DIR] # vim Gemfile
source "http://rubygems.org" group :test do gem 'capybara' gem 'capybara-webkit' gem 'rspec' gem 'poltergeist' end
$ bundle install --path vendor/bundler
Rspec の準備
$ rspec --init create spec/spec_helper.rb create .rspec
テストコードの実装
$ vim spec/test.rb
require 'spec_helper'
require 'capybara/rspec'
require 'capybara/poltergeist'
require 'capybara-webkit'
require 'capybara/dsl'
Capybara.javascript_driver = :poltergeist
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, :js_errors => true, :timeout => 60)
end
Capybara.configure do |config|
config.run_server = false
config.default_driver = :poltergeist
config.app_host = 'http://www.google.com'
end
describe "test", :type => :feature do
subject{ page }
before { visit('/') }
it "test" do
expect(page).to have_text('画像')
end
it "test2" do
within("form") do
fill_in "q", with: "aaa"
end
click_button "Google 検索"
expect(page).to have_text('aaa')
page.save_screenshot('screenshot.png')
page.save_screenshot('screenshot2.png', full: true)
expect(page).to have_text('次へ')
end
end
テスト内容は下記。
- test の内容
- Google トップページを開いて「画像」の文字列があるか
- test2 の内容
テストの結果
$ bundle exec rspec test.rb .. Finished in 3.21 seconds (files took 0.45994 seconds to load) 2 examples, 0 failures
スクリーンショットは下記。

まとめ
外部サイトのテストができることが確認できた。
実際に運用するとなると、 外部サイトが高負荷でタイムアウトするとか・エラーで落ちてるとか、 外部サイト起因でテストにこけることがストレスになりそう。
さじ加減によるが、テスト対象のサーバへ負荷をかけてしまうので、 その辺りの配慮も必要になるのかなと思う。