Rails

spring を使ってテスト高速化

More than 3 years have passed since last update.

rails の Gemfile に記載されている spring の使い方

rails new するとこっそり起動されているようだ。


springについて


  • develop環境での実行を高速化する仕組み

  • springサーバが起動される。
    設定を監視し、必要に応じて再ロードする

  • rails console/runner/generate/destroy と rake タスクが対象

  • 自動起動/終了されるので何も考えなくてもよい


設定

デフォルトではspringは使われないので、有効にする必要がある。


有効にする

rails new したプロジェクト以下で実行する

$ bundle exec spring binstub --all

bin/spring が新規追加され、bin/rails, bin/rake にspringをloadするコードが追加される。

これだけ。

railsコマンドまたはrakeタスクを実行するとブーストされる。

$ time bin/rails runner 'puts "hello"'

hello

real 0m2.335s
user 0m0.155s
sys 0m0.071s
BB-no-MacBook-Air:testrails2 babiy$ time bin/rails runner 'puts "hello"'
hello

real 0m0.376s
user 0m0.151s
sys 0m0.063s

確かに早くなっている。

サーバの状況は status コマンドを使う。

$ bin/spring status

27536 spring server | testrails2 | started 1 min ago
27537 spring app | testrails2 | started 1 min ago | development mode

2種類のプロセスがバックグラウンドで実行される。

spring app で、起動時の状態をキャッシュしている。

spring server で spring appのプロセスを管理している。

なお、development環境とtest環境で別のappプロセスが立ち上がる。

config 以下のファイルが変更されるとappプロセスが再起動される。

$ touch config/database.yml

$ bin/spring status
Spring is running:

27739 spring server | testrails2 | started 8 mins ago
28226 spring app | testrails2 | started 3 secs ago | development mode


サーバを停止する

シェルからexitすると自動的にサーバも終了されるが停止コマンドもある。

$ bin/spring stop

spring自体を無効にしない限り、railsやrakeコマンドを実行したタイミングでspringプロセスは再度起動される。

変更したのに反映されないなど謎なことが起きた場合は一度とめてみるのもよいのかもしれない。


spring自体を無効にする

$ bin/spring binstub --remove --all

binstub --all での変更が削除される。

springプロセスは自動的には停止されないが、ターミナルを終了させるとプロセスは消える。