Shred IT!!!!

IT全般について試したこと・勉強したことを綴ったり、趣味について語るブログ

Rspec + Capybara + Poltergeist で外部サイトのテストをする方法

概要


外部サイトをテストしたい!なんてことはほとんどないが、 スクレイピングだったりで外部サイトに依存する場合に検知できる方法ないかと思い、 Rspec + Capybara + Poltergeist で外部サイトをテストしてみた。

準備


  • ruby-2.1.3
  • bundler をインストールしておくこと
  • phantomjs をインストールしておくこと(Mac なら brew install phantomjs)
必要 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 の内容
    • フォームに「aaa」と入力し、検索ボタンを押下
    • 検索結果ページに「aaa」という文字列があるか
    • スクリーンショットを「screen_shot.png」として保存
    • 全画面のスクリーンショットを「screen_shot2.png」として保存
    • 次への文字列があるか
テストの結果
$ bundle exec rspec test.rb
..

Finished in 3.21 seconds (files took 0.45994 seconds to load)
2 examples, 0 failures

スクリーンショットは下記。

f:id:jetglass:20150512131041p:plain

まとめ


外部サイトのテストができることが確認できた。

実際に運用するとなると、 外部サイトが高負荷でタイムアウトするとか・エラーで落ちてるとか、 外部サイト起因でテストにこけることがストレスになりそう。

さじ加減によるが、テスト対象のサーバへ負荷をかけてしまうので、 その辺りの配慮も必要になるのかなと思う。