28
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

parallel_testsとsimplecovを同時に使うとcoverageが正しく計算されない問題を解決する

Posted at

parallel_testsを使うと、プロセスが複数立ち上がるため、
設定無しでsimplecovと併用すると、coverageが上書きされてしまって、一つのプロセス分しか結果が残らない。
なので、多少ハックが要る。
実は、githubのissueにちゃんと解決策が書いてあるんで、使い込んでる人には既知だと思うけど、
英語なので日本語化プラス自分が使ってる方法ということで書いておく。

spec_helper.rb
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

28
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?