【週末Rails勉強会】Rails + Rspec テストコード導入方法 書き方、削除方法などまとめ

開発
スポンサーリンク
Rspecの初心者がテストコードについて学んだ順序など、備忘録を兼ねて記事を書き起こします。
色々調べていると素晴らしい記事がたくさんあり、とても勉強になります。謝謝。
テストコード?なにそれ美味しいの?というRspec童貞の方向け。
スポンサーリンク

実行環境

mac os sierra
ruby 2.6.3
rails 5.2.2

Rspecの基礎知識

rspecの前提知識として下記記事を一通り読ませていただきました。
使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」
とてもわかりやすく、基本的な構文を説明してくれています。
また、合わせて、下記ドキュメントも参考になります。
ドキュメント

Sampleテストコードの作成

なんとなく書き方が分かったので、実際にサンプルプロジェクトを作成して動かしてみる。
下記記事を参考に作成しました。
とても分かりやすく設定方法などが記述されています。
ただ、テストコード例がRails newでは作成されない、User追加のテストコードになっていたので、rails new してできるサンプルページに飛ぶのを確認するテストコードにして試してみました。
下記のようにテストコードを書いて
 
/* spec/features/sample_spec.rb */

require 'rails_helper'

RSpec.describe 'サンプル画面テスト' do
  it '遷移できる' do
   visit root_path # (root_path = http://localhost:3000/)
    expect(page).to have_content 'Rails' # 画面に遷移して文字が表示されているかテスト
  end
end
rails s
localサーバーを立ち上げた後、テスト実行
rspec spec/features/sample_spec.rb
> 1 example, 0 failures 
ということで、とりあえず基礎中の基礎のテストコードの設定と確認ができた。

テストデータの作成方法

次に、テストを行うためのテストデータの作成方法を以下記事を参考に学んだ。

学び

テストデータ作成するためにfactory_bot_railsを利用する。
テストデータ作成のコードが一番ダルい(取っ付きづらい)かも・・・orz

テストデータの削除方法

いろいろ調べているうちに、テストデータの削除をDatabaseCleanerや、DatabaseRewinderというgemを利用して行なっている人が多かった。
ただ、Rspecでもデフォルトでトランザクションが効いているはずなのになぜ利用するのか??
以下の記事がとても参考になった。
 
上記記事でも詳細されているように、rspecのhookの実行順序は
before(:suite)
before(:all)
before(:each) # rspecデフォルトトランザクション
after(:each)  # rspecデフォルトロールバック
after(:all)
after(:suite)
 
となっていて、rspecデフォルトだと:eachのロールバックしか行われない。
なので、:allなどを利用するテストケースがある場合DatabaseCleanerを利用するパターンが多いらしい。
また、featureテスト(結合テスト)のようなテストコードの場合にも動作がおかしくなる場合がありDatabaseCleanerを利用するパターンが多い。
 
データ削除のためだけにDatabaseCleaner入れるのか・・・Rspecのトランザクションでどうにかならないのか?
と調べていたら
 
こんな記事が!!!
以下の記事がとても参考になりました。
 
Rspec開発陣も問題視していたようで
最新のSystemSpec(結合テスト)なるものを利用することで、DatabaseCleanerは不要になると(:each以外もトランザクションがかかるようになった)
すばらしいですね!!
Rspec3.7以降にて利用できるようです。
 
ただ、Rails5.1 以上である必要があるので注意が必要ですね。
テスト宣言に、type: :system と追記することで system testとして認識されるみたいです。
featureテストと似てますが、一部違いがありsystemテストが推奨されている。
 

学び

DatabaseCleanerを利用すると、clean方法(transaction truncation deletion)、対象テーブルなどを制御できる。
ただ、最新のrspecのsystemテストを利用すればDatabaseCleanerは不要(当社比)

所感

・テストコード導入時に追加が必要なgem
 rspec-rails(テストフレームワーク)
 factory_bot_rails(テストデータ登録用)
・テストデータの削除について
 Rspecの標準トランザクションで事足りる
・(補足)rails new時に入っているテスト用gemについて
 capybara(結合テスト時のブラウザ操作用ドライバ)
 selenium-webdriver(javascript含む時のテスト用ドライバ)
 chromedriver-helper(choromeテスト用)こちらは現在はサポート終了のため非推奨
 (webdrivers推奨(https://github.com/titusfortner/webdrivers))

各種ドキュメント

コメント