CircleCI で coveralls.io と parallel_tests を組み合わせたらハマったのでメモ
問題
parallel_tests で実行したテストを simplecov でHTML出力して見ていたのだが、定期的に収集したくなって coveralls.io を導入した。そしたらHTMLの出力結果は正しく得られるが、 coveralls.io 上で表示される結果がHTMLのものより低く出て困った。
登場する RubyGems
-
lemurheavy/coveralls-ruby
- coveralls.io の公式 Ruby サポート
-
colszowka/simplecov
- coveralls-ruby が内部で依存してるカバレッジ計測ツール
-
colszowka/simplecov-html
- simplecov のデフォルトの結果出力フォーマッター
-
grosser/parallel_tests
- minitest とか Rspec を平行で実行するツール
やったこと
❌ Coveralls.wear!
require 'coveralls'
Coveralls.wear!
これだと平行して走らせてるそれぞれのテストが終わるたびに coveralls.io に結果が送信され、はじめに送られたカバレッジのみが反映される。
🔺 parallel=true
でリクエストする
PARALLEL BUILDS WEBHOOK - coveralls.io にかいてある方法。結果はマージされるけど、カバレッジレポートが毎回新しくなってしまい、カバレッジの増減をレポートできなかった。
コード見ると平行テストじゃなくて平行ビルドのサポートっぽく、一つのコンテナでビルドする時はparallel=trueにならないのでちょっと改造して検証した。
def self.set_service_params_for_circleci(config)
...
config[:parallel] = ENV['CIRCLE_NODE_TOTAL'].to_i > 1
...
end
この箇所をこうした
config[:parallel] = ENV['CIRCLE_NODE_TOTAL'].to_i > 1 unless config[:parallel]
⭕️ SimpleCov.at_exit
で ParallelTests
の実行状況をチェックする
結果的にこれで行けた。 parallel_testsのwikiに書いてあった方法。 With simplecov -- by a grateful user - parallel_tests wiki
require 'simplecov'
require 'coveralls'
require 'parallel_tests'
SimpleCov.start
SimpleCov.at_exit do
# 今まで通りの出力
SimpleCov.result.format!
# 最後の平行テスト
Coveralls.push! if ParallelTests.number_of_running_processes <= 1
end
SimpleCov.at_exit
を実行すると既存の動きが上書きされるので、 SimpleCov.result.format!
で今まで通り simplecov のHTMLフォーマットを出力しつつ、最後のテストが終わったときだけ coveralls.io に送信するようにしたら正しく結果が出るようになった。