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
作成されるモデルテスト(スケルトン)
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 "テスト名" do
〜end
を使って書ける。
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?)であることを検証する |