この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
Rails+MongoDBアプリケーションのテストを高速化する際にparallel_testsを導入してハマッた点を紹介したいと思います。
■ parallel_testsについて
説明を割愛します。
他の文献を参考にしていただければと思います。
■ Rails+MongoDBでハマりやすい点
- 設定忘れ
PostgreSQLなどの SQLとあわせてMongoDBを利用する場合でも、parallel_tests向けにDBの保存先を複数に分ける設定が必要になります。
当然といえば当然ですがこれを忘れると、複数インスタンスで同時書き込みが発生して、テストに失敗するケースがあるので注意が必要です。
- メモリを食う
これはMongoDBに関わらず当然注意すべき点になります。
単純に「Railsインスタンス*並列実行数」なので、1インスタンスが300Mbytes必要であれば8つ並列実行する場合は2.4GBytesのメモリが必要になります。
- ディスクも食う
とくにMongoDBを利用している場合は、定期的にDBデータの整理/削除が必要になります。
実際のアプリでも、1回のテスト実施で合計1〜2GBytesの再利用されないデータが生成されるケースがあったので、注意が必要かと思います。
■ parallel_tests+MongoDB用のrakeタスク
parallel_tests+MongoDB用のDBを初期設定できるRakeタスクを作成しました。
下記の内容を lib/tasks 以下に設置してご利用ください。
require 'parallel_tests/tasks'
namespace :parallel do
namespace :mongoid do
rails_env = ENV['RAILS_ENV'] || 'test'
desc "db:mongoid:drop --> parallel:mongoid:drop[num_cpus]"
task :drop, :count do |t,args|
run_in_parallel("rake db:mongoid:drop RAILS_ENV=#{rails_env}", args)
end
desc "db:mongoid:purge --> parallel:mongoid:purge[num_cpus]"
task :purge, :count do |t,args|
run_in_parallel("rake db:mongoid:purge RAILS_ENV=#{rails_env}", args)
end
end
end