Tuesday 3 April 2012


Rails 3 + Rcov Test Coverage
For the first time in a long time I added a new category to the blog. The new category is "Ruby/Rails Test Coverage" .
Writing tests is simple, but I wanted to make sure I had good coverage. This led to me to rcov which does a good job of running my tests and showing me a nice HTML output of the coverage. It was still a pain to go and run rcov and hunt down the report .
So I did some searching and ran across a nice rake plugin called rails rcov that does it all for me. Now I can run rake test:test:rcov from TextMate and see all my tests run and view my coverage.
I created the following rake file in lib/tasks/coverage.rake:
namespace :coverage do
 
  task :clean do
    rm_f "test/coverage"
    rm_f "test/coverage.data"
    Rcov = "cd test && rcov --rails --aggregate coverage.data -Ilib \
                   --text-summary -x 'bundler/*,gems/*'"
  end
 
  def display_coverage
    system("sensible-browser test/coverage/index.html")
  end
 
  desc 'Measures unit test coverage'
  task :unit => :clean do
    system("#{Rcov} --html unit/*_test.rb")
    display_coverage
  end
 
  desc 'Measures functional test coverage'
  task :func => :clean do
    system("#{Rcov} --html functional/*_test.rb")
    display_coverage
  end
 
  desc 'All unit test coverage'
  task :all => :clean do
    system("#{Rcov} --html */*_test.rb")
    display_coverage
  end
 
end
 
task :coverage do
  Rake::Task["coverage:all"].invoke
end
This creates the following rake tasks you might be interested in:
coverage:unit – runs coverage on tests in test/unit
coverage:func – runs coverage on tests in test/functional
coverage:all – runs all unit tests
coverage – synonym for coverage:all
Note that the */*_test.rb syntax may not work depending on your shell.
Of course, you need rcov, so I added the following to my Gemfile:
gem 'rcov'
Do a bundle install, and you should be able to run rake coverage. After running coverage, this script will automatically open your web browser to look at your coverage; It should look something like this, hopefully with more green bars than my just-getting-started project:

Happy Coding.