parallel_tests で rspec を並列化する

test-queue でもなんでもいいけど今回は parallel_tests を使った。

readme.md に書いてある通りにすれば使える。二つちょっと工夫した。 一点目は web アプリのテストコードとかでアップロード周りはローカルに切り替えるみたいなのをやるけど、アップロード先とかが決め打ちになっていて、さらにテストごとにそれを削除とかすると、並列で動いてる同士で意図しない挙動になるので TEST_ENV_NUMBER という環境変数を使ってさらに切り分けるようにした。

二点目は、db:migrate をしないと db が作れない状態の時に、これを並列化するともともと重くて遅いものなので時間がかかる。コードにも

  # when dumping/resetting takes too long
  desc "update test databases via db:migrate --> parallel:migrate[num_cpus]"

とある。なのでこんな感じで

$ bundle exec rake parallel:migrate[1] RAILS_ENV=test
$ mysqldump ... $database > /path/to/dump.sql
$ bundle exec parallel_test -n$number -e 'mysql ... $database$TEST_ENV_NUMBER < /path/to/dump.sql'

mysqldump しちゃって入れちゃえば、並列で db:migrate するよりは全然マシになる。

ちなみに perl の test::mysqld を使うときはテストファイルごとに、db 作り直すって感じになって初期データ入れるコストが高いので、一回 db 作ってそのディレクトリ構成をコピーしておいてみたいな感じをやったりするようだった気がする。

parallel_tests 使わせてもらったついでに、failures のカウントがおかしくなってるところがあったので修正の pr を出した。すぐマージ、リリースしてくれて助かった。