Rails テストファイルの作成・実行

Rails では、rails generateコマンドでモデルなどを作成すると、テストのスケルトン(ひな形)も自動で作成される。

テストだけを作成する場合は、以下のコマンド。

テストのスケルトンを作成

# モデルテストを作成(userモデルの例)
$ bin/rails g test_unit:model user name:string email:string

# システムテストを作成
$ bin/rails g system_test users

# 結合テスト(integration test)を作成
$ bin/rails g integration_test user_flows

# システムテストとコントローラーテストを作成
$ bin/rails g test_unit:scaffold users

テストを実行

# テスト実行(システムテストは実行されない)
$ bin/rails test

# ファイルを指定してテスト実行(システムテストでも可)
$ bin/rails test 実行するテストファイルのパス

# システムテストを実行
$ bin/rails test:system

Rails テスティングガイド - Railsガイド

作成されるモデルテスト(スケルトン)

require 'test_helper'

class ArticleTest < ActiveSupport::TestCase
  # test "the truth" do
  #   assert true
  # end
end

Rails 標準のテストクラスは、ActiveSupport::TestCaseを継承している。ActiveSupport::TestCaseは、Ruby 標準のテストであるMinitest::Testを継承している。

Minitest では、メソッド名がtest_で始まるものをテストとして実行するが、Rails ではtestにブロックを渡す書き方ができる。

def test_the_truth
  assert true
end

上のコードを、下のようにtest "テスト名" doendを使って書ける。

test "the truth" do
  assert true
end

一つのテストメソッド内に複数のアサーションを入れてもよいが、テストが失敗した場合、以降のアサーションは実行されない。そうなると、以降に失敗があるのかないのか判別できないため、基本的には一つのメソッドに一つのアサーションが望ましい。

テストメソッドはランダムに実行される。各テストメソッドは独立させる必要がある(他のテストメソッド内の値を利用したりしない)。

アサーション

アサーション(assertion)とは、オブジェクトや式を評価して、期待された結果が得られるかどうかをチェックするコードのこと。

アサーションの例

アサーション 目的
assert A A が true であることを検証する
assert_equal A(期待値), B(実際の値) A == B であることを検証する
assert_not A A が false であることを検証する
assert_not_equal A B A != B であることを検証する
assert_empty A A が空(empty?)であることを検証する

Rails テスティングガイド - Railsガイド