Zenn Tech Blog
💎

RSpecとRuboCopの待ち時間を短縮しました

2023/12/19に公開

はじめに

ZennのRailsプロジェクトのローカル開発時において、RSpecとRuboCopの実行で少し待たされる感じがあったので、高速化を試みた備忘録です。

結果的にRSpecの起動時間が約4.8倍、RuboCopの実行時間が約3.5倍高速化できました。

環境

  • rspec-rails 6.0.1
  • rubocop 1.51.0

やったこと

RSpec

jonleighton/spring-commands-rspec

RSpecでやったことはspring-commands-rspecを導入するだけです。

正確には導入してあったのですが使われていない状況でした。

bundle exec spring binstub rspec

で生成ファイルを更新し、 bin/rspecを使うようにプロジェクト内ドキュメントを変更しました。

結果、起動に2.9sかかっていたのが0.6sになりました。

さらなる改善として、テストの並列実行も考えられます。

rspecの並列実行を導入してテスト高速化 #RSpec - Qiita

ただ今回はそこまでは手を出しませんでした。ローカル開発する上では rspec spec/xxxxx_spec.rb のようにファイルを限定して実行することが常なので、テストそのものの実行時間は十分許容できる範囲におさまります。フラストレーションになっていたのは起動時間だったので、今回はこの短縮が達成されたことのみで良しとしました。

RuboCop

Server Mode :: RuboCop Docs

RuboCopには --server オプションをつけて実行することで、2回目以降の実行を高速化する機能があります。まずは利用者がこれを使うようにします。

rubocop --server

上記はすでにチームで使われていたのですが、重要な機能だと思ったので紹介しました。

差分の効果(それも大きな)があったのは rubocop.yml の見直しです。

Exclude に不要なファイル・ディレクトリを指定する記述を追加しました。

rubocop.yml
+ Exclude:
+   - 'tmp/**/*'
+   - 'log/**/*'
+   - 'coverage/**/*'
+   - 'vendor/**/*'
+   - 'node_modules/**/*'

特に node_modules の除外指定が効果が大きかったです。当プロジェクトでは、ディレクトリ構成的にRailsのルートディレクトリの下に node_modules が発生するようになっていました。そのため、 node_modules 以下の大量のファイルを見に行ってしまって遅くなっていたと思われます。

おわりに

RSpec:

起動時間
Before 2.9s
After 0.6s

約4.8倍高速になりました。

RuboCop:

実行時間
Before 12.9s
After 3.6s

約3.5倍高速になりました。

RuboCopが高速化したことにより、エディタの保存時に実行することも視野に入ってきました。

VS Code で自動的に RuboCop を実行する (rbenv, asdf 対応)

また次の機会に検討したいと思います。

参考

Zenn Tech Blog
Zenn Tech Blog

Discussion