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:reset
とbundle exec rake parallel:prepare
を実行すればすべてのテストデータベースがdevelopment環境と同じschemaに揃ってくれるのかもしれない。