RSpecメモ(2) Capybara
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の構文まとめ | プログラミングマガジン