ホーム DoRuby parallel_tests+MongoDBの落とし穴

parallel_tests+MongoDBの落とし穴

この記事はアピリッツの技術ブログ「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
記事を共有

最近人気な記事