spring を使ってテスト高速化

  • 42
    Like
  • 0
    Comment
More than 1 year has 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プロセスは自動的には停止されないが、ターミナルを終了させるとプロセスは消える。