その他
    ホーム 技術発信 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
    
    記事を共有