どうもこんにちは。
今回は以前投稿したこちらの記事の派生で、RSpecテストについて記載します。
RSpecってどんなやつ?
RSpecテストとは、Railsのモデル、ビュー、コントローラなどのコードを実際に動かしているかのように 動的なテスト をしてくれるツールです。
(コーディング規約に反していないかチェックするツールとしてRuboCopというツールがありますが、別の記事でメモしました。)
RSpecのメリット
- 書いたコードのエラーを自動で発見することができる
- Railsをバージョンアップさせたときに実行すれば、修正の必要箇所がよくわかる
RSpecのデメリット
- 自分でテストコードを書かなければならない
テストコードを書くのがかなり時間がかかります。。。
導入方法
最低限のRailsアプリケーションが構築されている状態であると仮定して説明を進めます。
1. Gemを追加する。
Gemfileに以下のコードを記述します。
group :development, :test do
gem 'rspec-rails', '~> 5.0'
gem 'factory_bot_rails'
gem 'faker'
gem 'capybara'
gem 'database_cleaner-active_record'
gem 'simplecov'
end
- factory_bot_rails・・・テストデータを簡単に作成するためのライブラリ
- faker・・・ランダムなテストデータを生成するためのライブラリ(メールアドレスなど)
- capybara・・・システムテストやフィーチャーテストを書くためのライブラリ
- database_cleaner-active_record・・・テストの前後でデータベースをクリーンに保つためのライブラリ
- simplecov・・・RSpecテストのカバレッジを測定、可視化するためのライブラリ
2. bundle installの実行
ターミナルでbundle install
を実行します。
3. RSpecの初期設定
ターミナルでrails g rspec:install
を実行します。
これを実行すると、.rspec
、spec/spec_helper.rb
、spec/rails_helper.rb
が自動生成されます。
4. 設定の調整
.rspec
ファイル
.rspec
ファイルに以下のコードを記述します。
--require spec_helper
--format documentation
spec/rails_helper.rb
ファイル
spec/rails_helper.rb
ファイルに以下のコードを記述します。
# deviseを導入している場合には必要
config.include Devise::Test::IntegrationHelpers, type: :request
# FactoryBotのメソッドを簡単に使用するためのコード
config.include FactoryBot::Syntax::Methods
config.include FactoryBot::Syntax::Methods
については別の記事でメモします。
5. SimpleCovの設定
spec/spec_helper.rb
の先頭に以下のコードを追加します。
require 'simplecov'
SimpleCov.start
5. テストの記述
最初は、アクション1つにつきテスト1つのテストを書いていきます。(最初はUsersコントローラのテストを書くのがおすすめです。)
6. テストの実行
ターミナルで以下のコマンドを実行します。
bundle exec rspec
実行結果はターミナルに出力されます。テストが全て成功するまでテストコードを追加・修正をしていきます。
この時に、coverage
ディレクトリが自動生成されます。ブラウザでcoverage/index.html
を開くと以下の画像のようなページが閲覧できます。
ここで確認すべきは、app/controllers/users_controller.rb
などのコントローラやモデルファイルのコード全てをカバーできているかどうかです。それは、カバレッジ一覧画面のapp/controllers/users_controller.rb
をクリックして確認してみてください。以下のようにファイルごとのカバレッジが確認でき、どのコードがカバーされていないかまで確認することができます。
ちょいめも
特定のテストコードだけ実行したいとき
特定のファイルだけのテストを実行したい場合は、以下のようにパスを指定します。
bundle exec rspec spec/requests/users_controller_spec.rb
## RSpecの実行結果をHTML形式で見たいとき
RSpecの実行結果をHTML形式で見たい場合は、.rspec
ファイルに以下のコードを記述します。
--require spec_helper
--format html
--out spec/results/rspec_result.html
これでbundle exec rspec
を実行すると以下のような画面が出てきます。
テストが成功しているときは緑、失敗した時は赤で結果が表示されます。もちろん、そのテストコードで失敗しているかも表示してくれます。
まとめ
今回はRSpecテストについてメモしてみました。
RSpecはAPI通信とかもテストできるので便利だなぁと感じます。
テストコードを書くのはちょっと難易度高めですが。。。
以上