35
29

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.

RSpecの速度を並列実行で3倍速に〜3行書き換えて〜

Posted at

RSpecの実行に数分〜数十分単位がかかるようになってきたので、並列実行を導入しました。ちなみに最近日本で流行りのCircleCIなどは使わず、古きよきJenkinsを使っています。

高速化の方法の選択として、下記記事を参考にしました。
20150106: RailsのRSpecテストを速くする方法まとめ

私はtest-queueというgemを実行に使うことで高速化をはかりました。

どれぐらい早くなった?

まず先に結論から。およそ3倍早くなりました
なぜ3倍かというと、Jenkinsのホストマシンが3コアのマシンだからです。

Before
スクリーンショット 2015-07-10 16.34.07.png

After
スクリーンショット 2015-07-10 16.52.20.png

もしこれが10コアだったら、10倍速になることでしょう。
一応、「データベースとの兼ね合いで...」「テストの実行順序が...」といった話はもちろん出ると思うんですが、私が今回試したアプリはActiveRecordを使っていないRailsアプリケーションなので、その点は問題ありませんでした。
純粋にコア数など並列実行数を上げれば上げるほど早くなるはずです。

どうやるの?

やったことはたった2つです。

  1. test-queueをInstall
  2. 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%を消費していました。

スクリーンショット 2015-07-10 16.35.37.png

おわりに

Jenkins万歳! \(^o^)/
Dockerコマンドを多用しているSideCIはCircleCIではテストが動きません。フロントエンドのテストはCircleCIを使っていますが。

Dockerを使った「コードレビュー」のためのCI環境であるSideCIはユーザ様だけでなく一緒に働いて頂けるエンジニアの方も募集しております! _(._.)_

35
29
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
35
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?