概要
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