新しいRailsプロジェクトに取り組む際に、テストもしっかり書こうと思い調べたことをまとめます。
System SpecとFeature Specの違い
どちらもRSpecで提供されているE2Eテスト機能です。
Feature Specのほうが歴史が長く、古いバージョンのRailsプロジェクトではこちらがよく使われていると思います。
Rails5.1でSystemTestCase
という新しいテストケースクラスが導入され、これをラップした (使えるようにした) System SpecがRSpecでも導入されました。
RSpecリリース
結果として両者が共存している状態ですが、公式READMEではSystem Specが推奨、Feature Specは引き続きサポートしていくことが表明されています。
Before Rails introduced system testing facilities, feature specs were the only spec type for end-to-end testing. While the RSpec team now officially recommends system specs instead, feature specs are still fully supported, look basically identical, and work on older versions of Rails.
System Specの導入により、嬉しいことが増えました。
1. database_cleaner
のようなgemを使って、テスト時のDBトランザクション管理をする必要がなくなった。
これはRailsのSystemTestCase
がフレームワーク内でうまいことやってくれるようになり、テスト内で適切にロールバックができるようになったからです。
2. テスト失敗時にtmp/screenshotsにスクリーンショットを保存してくれる。
デバックしやすくなって嬉しいです。
3. JavaScriptを使用した画面のテストをする際の、面倒な設定が不要になった。
Feature SpecでJSを使ったテストを行う場合は、いろいろを面倒な設定が必要でした。
以下は公式ブログの引用です。
RSpec の Feature Spec はデフォルトの Capybara ドライバーとして Rack::Test を利用します。 もし Selenium のような JavaScript が有効なドライバーを使いたい場合は、 ユーザーが自身で Capybara の設定をする必要がありますが、この設定はかなり高度で難しいものでした。 System Spec でデフォルトで Selenium 経由で Chrome を利用しますが、 これらの難解な設定は Rails があなたの代わりに行なってくれます。
上記にあるように、System SpecではデフォルトでSelnium + Chrome
を使ってテストが実行されるため、セットアップが必要です。
かんたんにセットアップだけ説明します。
gemにselenium-webdriver
を追加します。
gem 'rails', '6.0.3.4' # 5.1以上が必須
# ---
group :development, :test do
# ---
gem 'rspec-rails'
# ---
end
group :test do
gem 'capybara'
gem 'selenium-webdriver'
end
ローカルマシンにChromeDriverをインストールしておきましょう。
$ brew install chromedriver
Docker環境の場合は、Dockerfile内でインストールしたり、docker-compose内でイメージを指定したりしてできそうです。
chrome:
image: selenium/standalone-chrome:3.141.59
volumes:
- /dev/shm:/dev/shm
参照記事
ありがとうございました。