Rails Diary

プログラミングの学習記録です。

RSpecメモ(2) Capybara

qiita.com

Capybara

  • Webアプリ用のE2E(end to end…始めから終わりまでテストすること)テストフレームワーク
  • 複数あるドライバ(動作システム)の中から使いたいものを選択できる
    →Capybaraのテスト実行環境(Headlessブラウザ)を選択

※ ヘッドレスブラウザとはGUIを持たないブラウザ。人が操作する目的のものではない。
GUI…マウスや指などで操作できる画面を持たないブラウザのこと。テストの実行環境。 https://wa3.i-3-i.info/word1371.html

Capybaraを使うことで、Webアプリのブラウザでの自動実行、JavaScriptの動作確認、Headlessブラウザ(GUIのないブラウザ)を操作できる

RSpecファイル作成、使用するドライバ設定

❶ テストファイル作成

bundle exec rails g rspec:system User, UserSessions, Task

❷ 作成したスペックファイルにテストを記載

require 'rails_helper'

RSpec.describe "Users", type: :system do
# デフォルトではRack::Testというドライバが設定されている
  before do
    driven_by(:rack_test)
  end

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

Rack::Test…デフォルトのドライバ。高速だがJSを使えない。 Rackとは

Seleniumドライバ

JavaScriptもサポートしているseleniumドライバを使う場合、デフォルトでFirefoxを使ってテストする様に設定されているが、互換性の問題でChromeを使うように設定しておいた方がいいとのこと。Chromeを使うためにはwebdriversジェムを追加する。webdriversはライブラリの依存関係上、selenium-webdriverも一緒にインストールしてくれるので、明示的に書かなくて済むそうな。

他にも、Webkitドライバ(Seleniumより高速)、Poltergeistなどがある

ドライバの設定

通常テストで複数スペックを作成するので、各ファイルに自動的に記載されているドライバの設定は削除し、自作したsupportディレクトリにまとめておく

# spec/support/capybara.rb supportディレクトリを自分で作成
RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :selenium, using: :headless_chrome
  end
end

こっちの書き方でもOKだった

RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by(:selenium_chrome_headless)
  end
end

末尾の_headlessを外すことで実際のブラウザでの動作が見られる

rails_helper.rbなどにsupport配下のファイルを読み込む設定を記載

これにより上で作成したsupport配下の設定ファイルが読み込まれる

# spec/rails_helper.rbの下記のコメントアウトを外す
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }

capybaraの構文

describeやit等の起点はRSpecのもの、vistやfill_in '', with: ''というのは、Capybara独自の起点

.rspec

下記のようにルートディレクトリに.rspecファイルを作成し、下記の様に記述することでテスト結果を見やすくすることができる。

--format documentation
--color

RSpecで特定のテストを実行する方法

# ファイル名と行数指定してテストが実行できる
$ rspec spec/models/user_spec.rb:12

もしくは
spec_helper.rbに以下の記述を追加し、focus: trueを使える様にする

RSpec.configure do |config|
  config.filter_run_when_matching :focus
end

テストファイルのdescribe, context, itの内、実行したいテストブロックの先頭にfをつけてfdescribe, fcontext, fitのようにすることで特定のテストのみ実行ができる。

fの消し忘れ対策として

Rubocopでclass: RuboCop::Cop::RSpec::Focusを設定しておくと消し忘れた場合に検知できる。 pre-commitやCIを使って自動でRubocopを実行する様にしておくと便利とのこと。

参考にしたサイト

【Rspec】Capybaraについて | プログラミングマガジン

【Rspec】Capybaraの構文まとめ | プログラミングマガジン

Selenium + Capybara + RSpecで自動テストしてみる : 準備編

RSpecで特定のテストを実行する方法

Rackとは何か - Qiita

Capybaraチートシート - Qiita