How to speed up your rspec workflow
Unit testing with rails might get slow, but there are tools that improve the speed and the comfort of running tests quite dramatically. Today I’m going to show you how to make your rspec experience super smooth.
Spring
The slowest part of running rspec tests is the initial task of loading of rails into memory. You have to do it every time you make a small change to your code and even for small projects it takes seconds.
Spring is a rails preloader that comes with Rails 4.1 by default, but you can use it with older versions (3.2+) as well, and it solves the loading time problem for you.
Installation is very easy, just add the following gems into your Gemfile
.
group :development do
gem 'spring'
gem 'spring-commands-rspec'
end
Now, you can run bundle exec spring rspec
and it keeps rails running in the background, so it won’t be necessary to load it every time.
~/projects/hubert [master] $ be rspec spec/models/group_randomizer_spec.rb
....
Finished in 0.53948 seconds (files took 7.03 seconds to load)
4 examples, 0 failures
~/projects/hubert [master] $ be spring rspec spec/models/group_randomizer_spec.rb
....
Finished in 0.57448 seconds (files took 0.71926 seconds to load)
4 examples, 0 failures
The benefit is amazing and on my underpowered netbook I’m now running tests nearly 10x faster.
Guard
The second tool that makes running rspec a joy is a tool called guard-rspec. Guard is a file watcher that runs certain actions when you change a file and guard-rspec is the one tailored for coping with rspec.
Installation is easy as well. Firstly, add it to your Gemfile
.
group :development do
gem 'guard-rspec'
end
After that, run initialization task to create a Guardfile
by running this.
bundle exec guard init
Last step is to combine spring and guard together by modifying the Guardfile
. Change the first line of guard :rspec
command to look like the following.
guard :rspec, cmd: "bundle exec spring rspec" do
...
end
From now on, you can run it by executing
bundle exec guard
and every time you change your code it will run related tests. And it will do it blazingly fast thanks to the speed boost from spring.