Edited at

database_cleaner transactionの設定

More than 5 years have passed since last update.


database_cleanerの設定(transactionが使える場合)


背景

database_cleanerでテスト前後のDBの消去をしています。

database_cleanerには消去の方法として以下の2つがあります

- truncation

- transaction

transactionはtruncationに比べ、DBに制約はあるものの、

truncateするのではなくtransactionをrollbackするだけなので早いです。

詳しくは公式のページを見てください。

https://github.com/bmabey/database_cleaner

自分の対象とするシステムはmysqlを使っているので、

transactionが使えました。


実際の設定方法

Guard+spork+rspecでまわしている場合、

Spork.preforkの中に以下のように追記すればOK

最初に一度truncationで消したあと、

各テストケースごとにtransactionで消しています。

最初にtruncationするとき、マスタ系などいちいち消さないテーブルは

:exceptで指定するとそれ以外のテーブルを消してくれます。


spec_helper.rb

Spork.prefork do

...
RSpec.configure do |config|
....
# for database_cleaner
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation,{:except => %w{except1 except2}})
DatabaseCleaner.strategy = :transaction
end

config.before(:each) do
DatabaseCleaner.start
end

config.after(:each) do
DatabaseCleaner.clean
end
end
end



効果

transactionにすると、手元の環境では以下のように大きな差がでました。

- truncationの場合: 9m 17s

- transactionの場合: 28s

transactionが使える場合はtransactionを使ったほうがいいかと思います。