今更ですが、Ruby on Rails 5.1 で導入された E2Eテスト(system test) を試してみたら、あまりにも簡単で感動したのでブログに書いておくことにしました。
E2Eテストの難しさ
従来 E2E テストを行おうとすると、いくつかの問題点がありました
- E2Eテストを実行する環境を作るのが難しい
- E2Eテストを書くのは面倒
- UIが変わると、テストを書き直す必要がある
2、3 はE2Eテストの本質的な難しさだと思います。しかし、まずE2Eテストを試してみようとすると
- どのソフト(ツール)を使うか選ぶのが難しい
- 設定ファイルを書くのが面倒
- 動かない時にどうしたら良いのか判らない
などの原因で諦めてしまう事も多いと思います。
E2Eテスト環境
JavaScriptが正しく動くようなE2Eテストの環境には、
- ブラウザー(または相当するソフト)
- ブラウザーをコントロールするソフト
- テスト用API
- テストコードを書くためのフレームワーク
などが組み合わされていて、ソフト・ツールの選択や設定ファイルが複雑です。また、ソフトの開発が終了してしまい使えなくなることも、時々あります。
私も従来は、RSpec/Cucumber/Turnip + Capybara + Phantom.js を使ってきたのですが、Phantom.jsは更新が止まってしまい最新のブラウザー仕様には対応していません。
このような面倒なE2Eテスト環境が、普通に Ruby on Railsをインストールするだけで、直ぐに使えるようになるのは素晴らしい事です。
Ruby on RailsのE2Eテスト環境
- ブラウザー: Chrome や Firefox、Edge、IE
- ブラウザーをコントロールするソフト: Selenium WebDrivers
- テスト用API: Capybara
- テストコードを書くためのフレームワーク: minitest
少し古くなってますね
ただし、もうすぐ Ruby on Rails 6.0がリリースされそうな現在では、実行するといくつか Warnig が出てきます。
- Gemfileの変更と再インストール(
bundle install
)
- gem 'chromedriver-helper'
+ gem 'webdrivers', '~> 3.0'
また、ブラウザーを起動しないでE2Eテストを実行するには以下のように変更します
- test/application_system_test_case.rb
- driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
+ # driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
+ driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400]
まとめ
もう一度書きますが、普通に Ruby on Railsをインストールするだけで、E2Eテスト環境が直ぐに使えるようになるのは素晴らしい事です。
E2Eテストを書きメンテし続けるのはコストがかかりますが、少なくともテスト環境が Ruby on Railsの開発チームによって担保されているのは、とてもありがたいです。
アプリ全体のE2Eテストを書くのは大変なので、まずはアプリの中で重要な部分のみでもテストを書いてみると良いかと思います。