parallel_testsメモ

testを並列実行できるようにするGem。

parallel_tests 3.7.1で確認。

以下のGemをインストールする。

group :development, :test do
  gem 'parallel_tests'
end

config/database.ymlを編集する。test環境用のデータベースの指定を以下のような形でENV['TEST_ENV_NUMBER']を含む形にする。

test:
  <<: *default
  # database: db/test.sqlite3
  database: db/test<%= ENV['TEST_ENV_NUMBER'] %>.sqlite3

コマンド

おそらく全てのコマンドに共通するオプションでbundle exec rake parallel:create[3]のように[数値]を追加するとその数値分、並列で実行される。未指定だとCPUのコア数で実行される。

bundle exec rake parallel:create

databaseの作成をする。[数値]を指定するとその数値分、並列実行できるように追加のテスト用データベースが作成される。

bundle exec rake parallel:prepare

development環境からschemaをコピーする。

bundle exec rake parallel:migrate

マイグレーションを実行する。

bundle exec rake parallel:setup

databaseの作成からマイグレーションまで実行する。CIで使える。

bundle exec rake parallel:spec

RSpecテストの実行。

parallel_rspecコマンドも用意されており、bundle exec parallel_rspec -n 3のようにしてもよい。-nオプションは並列実行数。

使い方

基本的に初回にbundle exec rake parallel:setupを実行し、適宜bundle exec rake parallel:migrateを実行、bundle exec parallel_rspecでテスト実行という流れになる。

もし、テストデータベースをリセットしたい場合、単にbin/rails db:resetしてもデフォルトのテストデータベースしかリセットされない。

RAILS_ENV=test TEST_ENV_NUMBER=2 bin/rails db:resetのように1つ1つ実行していく他ないため、以下のようなスクリプトを用意した方が良いだろう。

#!/usr/bin/env ruby
parallel_number = ARGV[0].to_i
parallel_number = 2 if parallel_number.zero?

([''] + (2..parallel_number).to_a).each do |number|
  puts %x(RAILS_ENV=test TEST_ENV_NUMBER=#{number} bin/rails db:drop)
end

puts %x(bundle exec rake parallel:setup[#{parallel_number}])

上記内容のファイルをbin/parallel_test_reset_db.rb等において実行権限を付与しておけばbin/parallel_test_reset_db.rb 4のようにしてまとめてリセットができる。

ただ、よく確認していないが、上記のようなスクリプトを用意しなくともbin/rails db:resetbundle exec rake parallel:prepareを実行すればすべてのテストデータベースがdevelopment環境と同じschemaに揃ってくれるのかもしれない。