I like Autotest because it allows me to stay within my code editor and let my test suite run automatically in the background. After each run I get a nice, unobtrusive, growl notification informing me whether my most recent change caused the tests to fail or pass.
It used to be that setting up and configuring Autotest for the OS X with pretty growl notifications was a nontrivial task. I remember that I spent several hours getting it working a year ago. However, there has been several developments with Autotest in recent months that greatly simplify the process. One of those enhancements is that Autotest can now use FSEvent introduced in OS X Leopard so that it no longer has to continuously poll the filesystem. This has the advantage of vastly reducing Autotest’s CPU usage when idle.
Install Autotest
To setup Autotest on a Mac I recommend following this nice, up-to-date, walkthrough on the Viget Labs Blog.
Using Autotest with RSpec
Complete instructions for Autotest integration with RSpec are described on the RSpec wiki. The gist of it is this:
Add an initialize hook to Autotest
Place the following code snippet in a file called .autotest
in the root of your Rails project:
Autotest.add_hook(:initialize) {|at|
at.add_exception %r{^.git} # ignore Version Control System
at.add_exception %r{^./tmp} # ignore temp files, lest autotest will run again, and again...
# at.clear_mappings # take out the default (test/test*rb)
at.add_mapping(%r{^lib/.*.rb$}) {|f, _|
Dir['spec/**/*.rb']
}
nil
}
Start Autospec in Terminal
RUBYLIB=./lib RUBYOPT=-rubygems AUTOFEATURE=true autospec
To avoid typing or remembering this cumbersome set of options to start autospec, I added it as an alias to my bash environment.
alias autospec='RUBYLIB=./lib RUBYOPT=-rubygems AUTOFEATURE=true autospec'
Autotest Alternative
For using Autotest with RSpec there is also the RSpactor gem which touts advantages homogeneous to those provided by the new autotest-fsevent. I have not tried RSpactor yet. If you do be sure to check out the RSpactor wiki as there is no README on Github.
Notes
- I do not recommend using Autotest/Autospec with RubyMine. The auto save feature of RubyMine would cause Autotest to run incessantly.
- Sometimes autospec seems to hang after running for a while and stops detecting that a file has changed. When this happens I send a SIGINT to the process by pressing CTRL+C. This causes autospec to reload and run the entire test suite.
- To kill autospec press CTRL+C twice.
About the Author