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に揃ってくれるのかもしれない。