Using SimpleCov with Multiple Test Suites
It can be helpful to generate coverage reports when testing software. While coverage reports do not guarantee well tested software, they can highlight were test coverage is lacking. This is especially true for legacy, or un-tested projects.
Recently I ran into a situation where I wanted to generate a coverage report, but the project used multiple test frameworks. One framework is used for unit testing, the other for integration testing. Fortunately, SimpleCov makes it easy to merge coverage reports.
Basic SimpleCov Usage
To use SimpleCov, you normally require simplecov and then call Simplecov.start with configuration options. Here is a typical configuration from an RSpec test helper:
require 'simplecov' SimpleCov.start do # configure SimpleCov end require 'rspec' require 'my-library'
With multiple test frameworks, you might find yourself wanting to duplicate this configuration code. Instead, move the shared SimpleCov configuration to a .simplecov file. This file is parsed by Ruby. I like to conditionally run SimpleCov when testing based on an environment variable. Here is an example:
# in .simplecov if ENV['COVERAGE'] SimpleCov.start do # configure SimpleCov end end
With this file, my test helpers are reduced to:
require 'simplecov' require 'rspec' require 'my-library'
Lastly, when using Rake, I like to make it possible to generate coverage reports for unit tests, integration tests, or both. I accomplish this by grouping my test tasks:
task 'test:unit' do # ... end desc 'Runs integration tests' task 'test:integration' do # ... end desc 'Runs unit and integration tests' task 'test' => ['test:unit', 'test:integration'] desc 'Generate coverage report' task 'coverage' do ENV['COVERAGE'] = true rm_rf "coverage/" task = Rake::Task['test'] task.reenable task.invoke end
Good luck and have fun testing!