Rspecのテストを高速化する手法としてはいくつかあります。
- Railsの起動を高速化する。
- Railsを取り外す。
- テストを並列化させる。
- タグを使う。
- モックやスタブを使用する。
Railsの起動を高速化する。
binstubというGemを使えばSpring経由でRailsを起動するのでテストの実行を高速化できます。
binstubとは?
アプリケーションの起動を早くすることができます。仕組み的にはSpringの恩恵を受けています。
インストール
1 2 3 |
group :development do gem 'spring-commands-rspec' end |
下記コマンドを実行します。
1 |
bundle |
新しいbinstubを作成する。
下記コマンドを実行するとbinディレクトリにrspecというファイルが生成されます。
1 |
bundle exec spring binstub rspec |
binstubを使ってRspecを起動する。
binstubの動作確認は下記のように行うことが可能です。
1 |
bin/rspec |
ちゃんとbinstubがインストールされていれば下記のように表示されます。
デフォルトでは全てのスペックのテストが実行されてしまうのでスペックを絞ってテストを実行したい場合は下記のようにします。
1 |
bin/rspec スペックフォルダ(例:コントローラスペックに絞る場合:spec/controllers) |
Railsを取り外す。
そもそもRails自体が重いので処理に時間がかかります。テストを実行するたびに毎回Railsが起動しているので遅くなります。そもそも、Rails自体を取り外して高速化するという手法も世の中には存在します。具体的な方法については別途ご紹介いたします。
Rails6デフォルトの並列テスト機能を使う。
Rails6から追加された機能のことで複数のプロセスを分岐させて実行することができテスト時間を短縮させることができます。
設定
デフォルトで有効になっています。
test/test_helper.rb
1 2 3 |
class ActiveSupport::TestCase parallelize(workers: :number_of_processors) end |
有効無効の切り替えは上記コードにて行います。「workers」に渡す値が2以上の場合は並列テストが有効になります。
:number_of_processors)
使用しているマシンのコア数が入ります。コア数を調べるには調べたいマシンで以下のコマンドを実行します。(開発などではdockerなどでシェルで入ってコマンドを実行するケースが多いと思います。)
1 |
nproc |
仕組み
プロセス数分だけDBが作成されます。「app_test-0」、「app_test-1」のような名前のDBがいくつか生成されます。
テストデータの準備
seedを投入したい場合
以下のように記述します。
1 2 3 |
parallelize_setup do |worker| load "#{Rails.root}/db/seeds.rb" end |
テストを並列化させる。
RSpecを並列に実行したい場合は「ParallelTests」というGemを使います。
ParallelTestsの仕組み
- テストスイートが複数のコアに分かれる。
タグを使う。
テストを実行する対象を絞ってテスト時間にかかる時間を減らします。
モックやスタブを使用する。
DBやネットワーク等の外部サービスとの連携にかかるコストを削減します。詳しくは下記の記事で解説しております。
この記事へのコメントはありません。