Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

Ruby on Rails | Rails + Capybara + FactoryGirlブラウザテストのヘッドレス環境との切り替えについて

概要

Rails + Capybara + FactoryGirlブラウザテストのヘッドレス環境との切り替えについて

内容

Rails + Capybara + FactoryGirlブラウザテストのヘッドレス環境との切り替えに関する
内容をまとめます。

主に想定される用途としては
・日々実行されるテストはヘッドレスで高速に
・エビデンスやドキュメントとして画面キャプチャを必要とするようなテストは低速だがブラウザベースで
双方の目的で同じテストケースを実行することです。

構成

Ruby2
Ruby on Rails4
以下、関連ライブラリ

gem "capybara", "~> 2.1.0"
gem "capybara-webkit", "~> 1.0.0"
gem "spring", "~> 0.0.10"
gem "launchy", "~> 2.3.0"
gem "selenium-webdriver", "~> 2.33.0"
gem "rspec-rails", "~> 2.14.0"
gem "rspec", "~> 2.14.0"
gem "factory_girl_rails", "~> 4.2.1"
gem "factory_girl", "~> 4.2.0"
gem "database_cleaner", "~> 1.0.1"

構成説明

・テストはRSpecで行います。
・テストデータはFactoryGirlで管理します。
・ブラウザベースのテストはCapybara+Selenium-Webdriver。
・ヘッドレスのテストはCapybara+Capybara-Webkit
・ブラウザテスト時のテストデータのクリアにはDatabaseCleaner。

設定

enviroment/test.rb
ブラウザテストの有無を切り替えるための設定を用意します。

config.js = false

各Specにjsの設定をします。デフォルトのままならヘッドレスで実行されます。

describe "describe", js: Project::Application.config.js do

spec/spec_helper.rb
下記の設定を追加

require 'capybara/rspec'
require 'database_cleaner'
Project::Application.config.js = true if ENV['js'] # Projectはプロジェクト名
@use_js = Project::Application.config.js

RSpec.configure do |config|
  config.use_transactional_fixtures = !@use_js
  config.include FactoryGirl::Syntax::Methods
end
if @use_js
  Capybara.javascript_driver = :selenium
  RSpec.configure do |config|
    config.before(:suite) do
      DatabaseCleaner.strategy = :truncation
    end

    config.before(:each) do
      DatabaseCleaner.start
    end

    config.after(:each) do
      DatabaseCleaner.clean
    end
  end
else
  SimpleCov.start "rails"
  Capybara.javascript_driver = :webkit
end
Capybara.register_driver :rack_test do |app|
  Capybara::RackTest::Driver.new(app, :browser => :firefox)
end

実行時

ヘッドレスで実行(capybara-webkit

bundle exec rake spec:integration

ブラウザ有効で実行(capybara-selenium-webdriver)

bundle exec rake spec:integration js=true

後者 js=trueの部分を隠蔽するためにタスク化するのもありです。

namespace :spec do
  desc "ブラウザを有効にして結合テストを実施"
  task :integration_browser => :test do
    ENV['js'] = "true"
    Rake::Task['spec:integration'].invoke
  end
end

タスク登録後の実行コマンド

bundle exec rake spec:integration_browser