RSpecとRuboCopの待ち時間を短縮しました
はじめに
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
RuboCopには --server
オプションをつけて実行することで、2回目以降の実行を高速化する機能があります。まずは利用者がこれを使うようにします。
rubocop --server
上記はすでにチームで使われていたのですが、重要な機能だと思ったので紹介しました。
差分の効果(それも大きな)があったのは rubocop.yml
の見直しです。
Exclude
に不要なファイル・ディレクトリを指定する記述を追加しました。
+ 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 対応)
また次の機会に検討したいと思います。
Discussion