parallel_testsを使うと、プロセスが複数立ち上がるため、
設定無しでsimplecovと併用すると、coverageが上書きされてしまって、一つのプロセス分しか結果が残らない。
なので、多少ハックが要る。
実は、githubのissueにちゃんと解決策が書いてあるんで、使い込んでる人には既知だと思うけど、
英語なので日本語化プラス自分が使ってる方法ということで書いておく。
Spork.prefork do
ENV["RAILS_ENV"] ||= 'test'
# for SimpleCov
unless ENV['DRB']
require 'simplecov'
SimpleCov.merge_timeout 3600
SimpleCov.command_name "rspec_#{Process.pid.to_s}#{ENV['TEST_ENV_NUMBER']}"
SimpleCov.start 'rails'
end
# ... 以下、ライブラリの読み込みとか、RSpec.configureとか
# ... 中略
end
Spork.each_run do
if Spork.using_spork?
ActiveSupport::Dependencies.clear
ActiveRecord::Base.instantiate_observers
FactoryGirl.reload
end
# This code will be run each time you run your specs.
# for SimpleCov
if ENV['DRB']
require 'simplecov'
SimpleCov.merge_timeout 3600
SimpleCov.command_name 'rspec'
SimpleCov.start 'rails'
end
end
sporkを使ってない場合は、最初のrequire 'simplecov'
以下をspec_helperの頭に書いておけばいいと思う。
要は、以下の設定が必要。
- カバレッジの結合時間のタイムアウトを指定して、その時間以内のテスト実行ならマージされるようにする。
- プロセスIDやテスト実行番号を使ってカバレッジ結果が別々のコマンドで実行されたように見せる。
- bundlerで勝手にrequireしないように、
:require => false
を渡しておく
cucumberでもsuppot/env.rbに同様の設定をすれば、parallel_testsに対応できる。
しかし、guard-sporkでテスト回してる時はカバレッジ出たり出なかったりする。
cucumberでは出るのにrspecでは出ないとか、よくわからない・・・。
まあ、parallelで回す時はspork使えないから別にいいかと細かい所は諦めている。
もうちょっといいやり方をご存知の方は、是非御教授をお願いします。
参考:
Automatically detect the usage of parallel tests and modify setup · Issue #64 · colszowka/simplecov