RSpecの実行に数分〜数十分単位がかかるようになってきたので、並列実行を導入しました。ちなみに最近日本で流行りのCircleCIなどは使わず、古きよきJenkinsを使っています。
高速化の方法の選択として、下記記事を参考にしました。
20150106: RailsのRSpecテストを速くする方法まとめ
私はtest-queueというgemを実行に使うことで高速化をはかりました。
どれぐらい早くなった?
まず先に結論から。およそ3倍早くなりました。
なぜ3倍かというと、Jenkinsのホストマシンが3コアのマシンだからです。
もしこれが10コアだったら、10倍速になることでしょう。
一応、「データベースとの兼ね合いで...」「テストの実行順序が...」といった話はもちろん出ると思うんですが、私が今回試したアプリはActiveRecordを使っていないRailsアプリケーションなので、その点は問題ありませんでした。
純粋にコア数など並列実行数を上げれば上げるほど早くなるはずです。
どうやるの?
やったことはたった2つです。
- test-queueをInstall
- Jenkins上での実行コマンドをtest-queueを利用する
rspec-queue --format progress spec
に変更
データベースを使う場合にはテストの並列実行の数(worker数)だけデータベースを作らないといけません。そのためのコード・方法もtest-queue README.mdに書いてありますのでどなたでもすぐ出来ると思います。
多くの人はデータベースを必要とするでしょうから、上記2点に加えてデータベース関連のコードをコピペするという工程が加わって、計3工程で行えるものと思います。
『Parallel tests』 vs 『test-queue』
RSpecの並列実行のためのgemはParallel testsの方が有名です。GitHubのスターも1400を超えていますし、ruby-toolboxでもparallel_testsの方がスコアが高いです。test-queueのGitHubスターは333しかありません。(本記事投稿時点)
基本はparallel_testsの方をおすすめします。
並列化したいけどめんどくさいなーって思ってた方にはtest-queueがおすすめです。設定もシンプルですし、rake
系の独自コマンドを覚えたりする必要もありません。
いや、Parallel testsもシンプルに出来るはずなんですけどね、ドキュメントの量自体が多くって、どうしても、とっつきがめんどくさいんですよね。。。
おまけ
参考までに実行中の各コアのCPU使用率を貼ってみます。ほぼ全コア平均して50%~80%を消費していました。
おわりに
Jenkins万歳! \(^o^)/
Dockerコマンドを多用しているSideCIはCircleCIではテストが動きません。フロントエンドのテストはCircleCIを使っていますが。
Dockerを使った「コードレビュー」のためのCI環境であるSideCIはユーザ様だけでなく一緒に働いて頂けるエンジニアの方も募集しております! _(._.)_