I find it really useful to use a coverage tool when writing code. I don’t depend on it, but I do like to see what percentage of lines are covered, so I can at least catch any glaring misses.
In Ruby 1.8, we had rcov, which was (and is) a really great tool. In Ruby 1.9, I’ve been depending on SimpleCov. I really enjoy their reporter interface, and the usage is very similar to rcov. In your
spec_helper, before you include the thing you’re testing, just start up SimpleCov. I prefer to write it like:
begin require 'simplecov' SimpleCov.start rescue LoadError puts 'Coverage disabled, enable by installing simplecov' end require 'your_library' # your library require 'config/environment.rb' # rails?
Some features I really like:
- Filtering is super easy
- Grouping is a powerful way to segment files like models, controllers, into their own groups.
- Merging results over time so that when you run a subset, you can merge them into the overall set from other subsets (so you don’t end up with that weird situation where things look uncovered because they’re covered in specs you’re not currently running).
Most times, I want to be able to see coverage for one test really clearly. For the past few weeks, I’ve been using something like this to accomplish it in my Rails projects:
filter = if ENV['COV'] == '*' lambda do |source| source.filename.start_with? File.join(Rails.root, 'spec/') end else paths = ENV['COV'].split(',').map do |rel| File.join(Rails.root, rel) end lambda do |source| !paths.include?(source.filename) end end # Apply SimpleCov.start do add_filter(&filter) end
That way, when starting
rspec (or spork, which I highly recommend), I can say what files I want to see coverage for. Another way to accomplish this which may suite you better is to create groups for things specified in COV.
If you’re not currently using SimpleCov, try it out!