LoginSignup
1
1

More than 1 year has passed since last update.

RSpec システムスペックのドライバーとは?

Posted at

はじめに

Everyday Rails - RSpecによるRailsテスト入門でRSpecの学習中、以下の記述の理解が難しかったので調べてみました。

RSpec
before do
  driven_by :rack_test
end

環境

ruby 3.2.1
Rails 7.0.4
rspec-rails 6.0.1
Capybara 3.38.0
selenium-driver 4.8.1
webdrivers 5.2.0

driven_by

これはシステムスペックの設定オプションで、使用するドライバーやブラウザを指定できるそうです。

例えばseleniumドライバーと、Chromeブラウザを使用したい場合は以下のようになります。

driven_by :selenium, using: :chrome

参考: Railsドキュメント

ドライバの種類

以下引用です。   参考: Capybaraチートシート

ドライバ 使用するときのシンボル 概要
Rack::Test :rack_test デフォルト。 Rails標準のテスト機能。Rackと通話して通信をシミュレートする。 高速だがJavaScriptを使えない、Rackアプリ外の通信をテストできない。
Selenium :selenium js利用時のデフォルト。Selenium Web DriverによりFirefoxをヘッドレスブラウザとして起動し、その中でテストする。多機能だがFirefoxに依存する。
Webkit :webkit QtWebkitを使ったヘッドレスブラウザ環境。Webkit準拠、Seleniumより高速。
Poltergeist :poltergeist PhantomJSベースのヘッドレスブラウザ環境。ピュアヘッドレス(のため高速)、Webkit準拠。

RSpecでどれを使用すればいいのか?

基本的には:rack_testだけでいいと感じました。
jsを使用してテストする際も、デフォルトのseleniumで事足ります。

簡単なアプリケーションなどであればjsをわざわざ使用しなくても一応テストはできますし、:seleniumを使用した感じ、テスト実行〜完了までが時間かかります。
なのでjsじゃなきゃダメなんだ、という時以外はデフォルトの:rack_testでいいと思います。

使用方法

:rack_test

システムスペックファイル作成

ターミナル
$ rails g rspec:system test

デフォルトでrack_testは設定されています

spec/systems/test_spec.rb
require 'rails_helper'

RSpec.describe "Tests", type: :system do
  before do
    driven_by(:rack_test)
  end

  pending "add some scenarios (or delete) #{__FILE__}"
end

:selenium

今回はChromeでの使用方法について説明します。

gemでドライバーをインストールする。
:selenium使用時にChrmeを使用したい場合はwebdriversをインストールします。
(Rails6以降であればデフォルトで入っています)

Gemfile
  gem "selenium-webdriver" #javascriptが実行可能なドライバー
  gem "webdrivers" #chromeとやり取りするインターフェースになる

seleniumでChromeを使用するように設定する

spec/rails_helper.rb
# jsオプション有効時のドライバを設定(デフォルトは:selenium)
Capybara.javascript_driver = :selenium_chrome

各ブロック内でjs: trueを指定する

spec/systems/test_spec.rb
describe '...', js: true do
  # javascriptが有効になる
end

context '...', js: true do
  # javascriptが有効になる
end

it '...', js: true do
  # javascriptが有効になる
end

seleniumでブラウザのシミュレーションをする際の難点

テストはブラウザが自動で立ち上がり、操作されながら実行されるのでテストが完了するまでに時間がかかります。
大掛かりなアプリでは相当な時間になります。

その場合は、ブラウザを立ち上げずに実行する方法もあります。

spec/rails_helper.rb
# jsオプション有効時のドライバを設定(デフォルトは:selenium)
Capybara.javascript_driver = :selenium_chrome_headless

参考サイト

Railsドキュメント
Everyday Rails - RSpecによるRailsテスト入門
Capybaraチートシート

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1