こんにちは、Bullet Trainコアチームメンバーのガブリエルです。
最近はmagic_testを触っていて、結構面白いと思ったので紹介したいと思います。
magic_testとは
Railsのシステムテストで使えるCapybaraのメソッドを直感的に、ブラウザーを介してクリックなどしながらテストを実装していくgemです。
例えば、レコードの作成をテストしたい時は、Capybaraでこんな感じになります。
click_on 'New foo'
fill_in 'Title', with: 'Test Foo'
click_on 'Create Foo'
assert page.has_content? 'Foo was successfully created.'
magic_testでは、これを全部手動で書く代わりに、ブラウザーでクリックしたりして変更をターミナルで確認すると、このコードは全部自動的に自分のファイルに追加されます。
作成者のアンドリュー・カルバー氏の紹介動画を見ていただくと分かると思いますが、瞬時的に何行ものコードを楽に実装できます。
使い方
gemのインストール
# 今現在、最新版はGitHubからダウンロードする必要があります。
group :test do
  gem "magic_test", git: "git@github.com:bullet-train-co/magic_test.git"
end
> rails g magic_test:install
> bundle binstubs magic_test
これでtest/system/basics_test.rbというファイルが作成されますが、そこのmagic_testメソッドでブラウザーが起動され、テストに書きたい動作をブラウザーで行う、という流れになります。
※ 完全に新しいRailsアプリで動作確認したい方はまずrootをconfig/routes.rbで設定してください。今回の説明のためrails g scaffold Foo title:stringでモデルを作ってからルーティングをroot "foos#index"にしました。
準備が整ったら、新しく作られたテストはこの通りになります。
require "application_system_test_case"
class BasicsTest < ApplicationSystemTestCase
  test "getting started" do
    visit root_url
  
    magic_test
  end
end
bin/magic test test/system/basics_test.rbを実行し、magic_testメソッドで新しいブラウザーを起動しましょう。
テストコード、デバッガー、そしてブラウザーが表示されるはずです。
まずNew fooをクリックし、タイトルを"Test Foo"にしてからCreate fooをクリックします。
新規Fooレコードが上手く作られたメッセージが表示されることもテストしましょう。「Foo was successfully created」を確認するのに、その文字列をハイライトして、Ctrl+Shift+Aを入力します。そして、このメッセージが表示されます。
これで終わり!
次はターミナルでflushを打ったら、ブラウザーで行った動作は全部自動的に記録されます。
これでexitを打ってデバッガーから出て、magic_testメソッドを削除したらそのままテストをコミットできます。
楽でしょう?
まとめ
ということで、直感的にブラウザーを使いながらCapybaraのテストを実装したい人はぜひ使ってみてください。Bullet TrainのDiscordもあるので、質問のある方は気軽に入って話しましょう!


