Rails5.1.0.beta1 System Testを試してみた

先日、Rails5.1.0.beta1のリリースでSystem Testが導入されたので試してみました。

weblog.rubyonrails.org

システムテストとは?

システムテストは、ブラウザの中でアプリケーションのテスト実行が可能なテスト。 実際のブラウザ体験をテストすることで、JavaScriptのテストが可能になる。

何がメリットか?

リリース文章を読むと以下の2つがメリットのようです。

これらはRspecのfeature specで既に行っているのでメリットというほどではないけれど、フレームワークとしてSystem Testが導入されることで今後は設定が少なくなるので、導入が少し楽になりそうで嬉しい。

今はまだbetaですが、Rails5.1.0でJavaScript周りの環境が大きく変わり、JavaScriptのコードは増える傾向にあるので、システムテストが書きやすくなるのは嬉しいですね!

それでは、コマンドを実行して、Rails5.1.0.beta1のプロジェクトを作成し、テストの作成・実行を行ってみます。

プロジェクト作成

$ rails new sample_app
  • Gemfileのrailsのバージョンを変更
    • ついでにseleniumを消して、poltergeistを入れておく
gem 'rails', '~> 5.1.0.beta1'
group :development, :test do
  # group :development, :test doの中に追加
  # gem 'selenium-webdriver'
  gem 'poltergeist'
end
  • bundle updateしてGemの依存関係の解消(この時点でbundle installすると依存関係が解消できずエラーになった)
$ bundle update rails web-console
  • bundle install(Gemのインストール
$ bundle install
$ bin/rake db:create
$ bin/rake db:migrate
  • サーバ起動(テストとは関係ないですが、一応動くことを確認)
    • 以下のコマンド実行後 http://localhost:3000/users にアクセス
$ bin/rails server

モデルの作成、テストの作成・実行

最新のRailsガイドにシステムテストの記述が追加されていたので、この内容を元にコマンドを実行してみた。

A Guide to Testing Rails Applications — Ruby on Rails Guides

  • Userモデル作成、同時にControllerとViewを生成
    • 下記のコマンドを実行して、ユーザ名とEmailの情報を持ったUserのscaffoldを作成します
    • scaffoldを生成すると同時にシステムテストのファイルも作成されていた
    • 手動で作成する場合は bin/rails generate system_test users を実行
$ bin/rails generate scaffold User name:string email:string
      create    test/system/users_test.rb
  • ドライバをseleniumからpoltergeistに変更(いつもpoltergeist使っているので)
    • test/application_system_test_case.rbを下記のように修正
require 'test_helper'
require 'capybara/poltergeist'

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :poltergeist, using: :chrome, screen_size: [1400, 1400]
end
  • テストの作成
    • test/system/users_test.rbを下記のように修正
      • ユーザ一覧画面で削除リンクを押し、確認ダイアログが表示された際にOKを押すとユーザが削除されることを確認するテストです
require 'application_system_test_case'

class UsersTest < ApplicationSystemTestCase
  test 'ユーザ削除時、確認ダイアログでOKを押すテスト' do
    # ユーザ一覧画面を表示
    visit users_url

    # fixtureでusers情報が2件入っている

    # Destroyリンクをクリックして、ユーザを削除
    # その時に表示される確認ダイアログでOKを押す
    page.accept_confirm do
      find('tbody').first(:link, "Destroy").click
    end

    # ユーザの削除が成功したメッセージが表示されているか確認
    assert_text 'User was successfully destroyed.'
  end
end
  • テストの実行
$ bin/rails test:system

実行結果こんな感じで表示されます。ブラウザの操作を伴うテストが正常に通ったことを確認できました。
f:id:graboros-dev:20170226010313p:plain

エラーが発生した時はコンソールに画像出るのでわかりやすい。 f:id:graboros-dev:20170226005716p:plain

application_system_test_case.rb を少し変更したくらいで、ほぼ設定なしでシステムテストが書けました。 Railsのgeneratorと連携していたり、オプションが追加されたりと今後手間が少なくなりそうです。

正式リリースが楽しみ。