Rails が自動でブラウザ(Google Chrome)を操作するテストです。
JavaScript の動作確認が主な目的になります。
非常に強力なテストですが、かなりの手間と時間が掛かります。
注意
Rails 8.1 から、Scaffold で System Test が生成されなくなりました。
自前で用意する事は可能ですが、控えめに使うべきと言われています。
参考: https://railsguides.jp/testing.html#システムテストを生成する
サンプルプログラムでは、
Stimulus&Turbo Stream の動作確認で使用します。
参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/302665e
Rails とブラウザの橋渡しをするドライバーが必要です。
以下の手順で設定してください。
chrome://settings/help と入力すれば確認できます。前述の通り、Rails 8.1 から System Test が外れました。
よって、実施したい場合は、
最初に \test\application_system_test_case.rb を自前で用意します。
内容は以下とします。
require "test_helper"
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
driven_by :selenium, using: :headless_chrome, screen_size: [ 1400, 1400 ]
end
:headless_chrome では、Chrome が隠れた状態で実行されます。
debugger で止めるなどして、動作状態を確認したい場合は :chrome に書き換えてください。
ruby bin/rails test:system
で、System Test が実行できます。
0 failures, 0 errors, 0 skips
と表示されて終わればOKです。
エラーが発生したら、その時点でテストを中断し、
エラー内容を表示するので、デバッグします。
Selenium::WebDriver::Error::SessionNotCreatedError: session not created:
This version of ChromeDriver only supports Chrome version XXX
のようなエラーになる場合は、
Chrome と chromedriver.exe のバージョンが一致していません。
共に最新版に上げてください。
サンプルプログラムでは、ユーザー認証に Devise を使用しています。
System Test では実際にブラウザを操作するため、
「ログイン」操作も必要です。
ログイン画面は WEBアプリ依存のため、
コントローラのような Devise 標準の仕組みはありません。
ユーザー操作でログインするのと同じ挙動をプログラムで実行します。
\test\application_system_test_case.rb に以下を追加します。
# Capybara でのログイン
def sign_in_for_systemtest(user, target_path=root_path)
visit new_user_session_path
fill_in "Eメール", with: user.email
fill_in "パスワード", with: TestConstants::DEFAULT_PASSWORD
click_button "Log in"
assert_current_path target_path # ログインが終わるのを待つ
end
次に、各テストファイルの setup メソッドで以下のように書きます。
setup do
@user = users(:admin)
sign_in_for_systemtest(@user)
end
以下、sign_in_for_systemtest の中身の概説です。
/users/sign_in (ログイン画面) の URLです。実際に Stimulus & Turbo Stream の動作をテストします。
大まかな仕様は以下の通り。
では、
参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/f6bad66 の
\test\system\books_test.rb での変更点を見ながら、下記を読み進めてください。
edit_book_path は book の編集画面の URL です。
パラメータに @book を指定すると、その id が使用されます。
Rails では、id を指定する場面で概ねこのような指定が可能です。
纏めると、
ID が “floor_id” の配下にある、”選択してください” option が選択されていなければOK、
です。
なお、
assert は、
対象が true ならOK、false なら NG で例外を吐きます。
assert_equal は、
2つの対象の値が等しければOK、違っていれば NG で例外を吐きます。
“floor_id” を持つ要素を対象に、
“2F” を select (選択) します。
指定文字列が画面上で見つかればOK、見つからなければ NG で例外を吐きます。
accept_alert は、ブラウザのポップアップを制御します。
alert_text = accept_alert do
click_button "Update Book"
end
ちなみに、
OK か キャンセルかを聞く確認ポップアップを処理する場合は、
などが使えます。
System Test は、GEM capybara を使います。
基本的には、
対象画面HTML の要素(部品)を指定して、操作します。
代表的なものとして、
があります。
Selector は多彩な指定ができます。
詳細は、Capybara の README Selectors を参照してください。