久しぶりにRspecを書こうと思った時に、導入手順を忘れたので、メモ!
Contents
そもそも、なぜテストをするのか?
■プロダクトの品質を上げるため(品質保証)
■プログラムが想定した動作をすることをチェックするため
■コードの追加、改修によって想定外の場所でバグが発生していないかを確認することができる
■リリース前にテストコードを実行することで、バグの含まれたコードのリリースを防ぐことができる。
■何を意図したコードであるか、読み取ることができる
■バグ・不具合を見つけるため
■クラッカー対策
⇒普通のユーザーであれば、しないような行為、例えば256桁のパスワード、500文字のメールアドレス等をフォームに入力・PostされたときにDBが不具合を起こしたりしないようにModelspecでバリデーションがきちんと働いているかチェックしたりする。 等々https://furien.jp/columns/300/#1
テストのデメリット
・通常のプログラムに加えてテストコードも書くことになるため、工数がかかる
・仕様が変わったり、コード変更になったら都度メンテナンスしないといけない。
Rspecの導入
参考記事:https://ruby-rails.hatenadiary.com/entry/20141026/1414289421
Gemの導入
1 2 3 4 5 6 7 |
group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'rspec-rails', '~> 3.7.2' gem 'factory_bot_rails' #テスト用のデータを作成することができる便利ツール gem 'faker' #疑似データを作成することができる便利ツール gem 'spring-commands-rspec' #Rspecのコマンドの待ち時間を短縮できる end |
Springとは
Rails4.1から標準で付属するようになったアプリケーションプリローダー。
Railsでは様々なライブラリのロードなどの前処理が行われるので、コマンドを実行するためには待ち時間がかかってしまう。事前にバックグラウンドでライブラリをロードしておくことで、その待ち時間を短縮するのが、アプリケーションプリローダー。
https://ruby-rails.hatenadiary.com/entry/20141026/1414289421
Springを使うために、Rspecのstubファイルを作成しておく
stub(スタブ)とは:テスト対象から呼び出される代用品。本番のデータはないから仮のデータで本番さながらのリハーサルをやっているイメージ
https://wa3.i-3-i.info/word14933.html
1 2 |
[~/]$ bundle exec spring binstub rspec *bin/rspec: generated with spring |
◯FactoryBotはテスト用のデータを作成してくれるツール
https://qiita.com/A-Hama/items/d1b0219b00eb1e9a14f5
FactoryBotとは
FactoryBotは、テスト用のデータを簡単に作成することができる便利ツール。
下記の設定を行うと、Rspecのテストコード中でFactory_botのメソッドを使用する際に、名前空間の指定を省略することができる
1 2 3 4 |
/spec/rails.helper RSpec.configure do |config| config.include FactoryBot::Syntax::Methods end |
1 2 3 4 5 |
# 通常FactoryBotをつけないと、メソッドを呼べない user = FactoryBot.create(:user) # 上の設定を追加することで、FactoryBotの記述が省略できる。 user = create(:user) |
下記コマンドを入力することで、factoriesディレクトリが作成される。
今回は一例としてuserモデルのテストコードを記述することを想定して、modelをuserにしている
1 2 |
[~/]$ bundle exec rails g factory_bot:model user create spec/factories/users.rb |
あとは、FactoryBotにデータを作成すれば使える
1 2 3 4 5 6 7 8 |
FactoryBot.define do factory :user do username {"hoge"} email {"hoge@example.com"} password {"Hoge12345"} password_confirmation {password} end end |
Fakerとは
fakerは疑似データを作成する便利なツール
https://qiita.com/A-Hama/items/d1b0219b00eb1e9a14f5
こんな感じで使う
1 2 3 4 5 6 7 8 |
FactoryBot.define do factory :user do username { Faker::Name.lastname } email { Faker::Internet.free_mail} password { Faker::Internet.password } password_confirmation { password } end end |
Rspecの初期ファイルをインストールする
1 2 3 4 5 |
[~/]$ bundle exec rails g rspec:install create .rspec create spec create spec/spec_helper.rb create spec/rails_helper.rb |
テストは空だが、これでRspecを実行することができるようになる
1 2 3 4 5 |
[~/]$ bundle exec rspec No examples found. Finished in 0.00024 seconds (files took 0.08184 seconds to load) 0 examples, 0 failures |
■下記コマンドでローカル開発環境と同様のマイグレーションをテスト環境で再現できる
1 |
rails db:migrate RAILS_ENV=test |