undercover 提醒您注意那些在没有进行测试的情况下进行更改的方法、类和代码块,帮助您轻松找到未经测试的代码,并减少错误的数量。它能
undercover 提醒您注意那些在没有进行测试的情况下进行更改的方法、类和代码块,帮助您轻松找到未经测试的代码,并减少错误的数量。它能
undercover warns about methods, classes and blocks that were changed without tests, to help you easily find untested code and reduce the number of bugs. It does so by analysing data from git diffs, code structure and SimpleCov coverage reports.
Works with any Ruby CI pipeline as well as locally as a CLI.
A sample output of undercover ran before a commit may look like this:
And like this, given that specs were added:
Add this line to your application's Gemfile:
gem 'undercover'
And then execute:
$ bundle
Or install it yourself as:
$ gem install undercover
To make your specs or tests compatible with undercover, please add undercover to your gemfile to use the undercover formatter the test helper.
# Gemfile
group :test do
gem 'undercover'
end
# the very top of spec_helper.rb
require 'simplecov'
require 'undercover/simplecov_formatter'
# optional, the filename defaults to `coverage.json` and is automatically recognised by the gem
# SimpleCov::Formatter::Undercover.output_filename = 'my_project_coverage.json'
SimpleCov.formatter = SimpleCov::Formatter::Undercover
SimpleCov.start do
add_filter(/^\/spec\//) # For RSpec
add_filter(/^\/test\//) # For Minitest
enable_coverage(:branch) # Report branch coverage to trigger branch-level undercover warnings
end
# ...
Then run your test suite once through to generate the initial coverage file before you can run the undercover command.
If you're upgrading from an older version of undercover that used LCOV, you can migrate to the new SimpleCov formatter:
gem 'undercover' to your test group# Gemfile
group :test do
gem 'undercover'
end
# spec_helper.rb
require 'simplecov'
require 'undercover/simplecov_formatter'
SimpleCov.formatter = SimpleCov::Formatter::Undercover
--simplecov flag instead of --lcov, or rely on auto-detection of coverage/coverage.jsonNote: LCOV support will be deprecated in a future release, but remains fully functional for existing projects.
Invoked with no arguments, Undercover will flag all untested methods and classes from the current diff:
undercover
Use the -c --compare ref flag to specify a git ref (commit hash, branch name, tag) to compare against. This is a recommended usage for CI/CD build environments, as undercover will exit 1 if there are any warnings.
undercover --compare origin/master
Check out docs/ for CI configuration examples:
Merging coverage results (sample gist) is required for parallel tests before processing with undercover.
A few options exist to provide automated comments from undercover in Pull Request reviews, which is the most streamlined way to add Undercover to your development workflow.
undercover Pull Request feedback delivered natively with GitHub ChecksOptions can be passed when running the command from the command line:
…
Use --format json to get machine-readable output, useful for CI integrations and tooling:
undercover --compare origin/main --format json
Output structure:
…
Each warning includes:
uncovered_lines — line numbers with zero execution countuncovered_branches — branch entries that were never taken, each with line, block, and branch identifiers. The optional description field names the branch from the source (e.g. "if user.admin?", "else", "when :active"). For same-line branches such as ternaries, the arm type is appended after → (e.g. "? role == :admin → else").Branch-level entries require enable_coverage(:branch) in your SimpleCov configuration (see Setting up coverage reporting).
A configuration file named .undercover can be created at the top level of a project's directory containing the same set of options for the CLI.
Example file:
-l path/to/different.lcov
-c origin/master
The options set in the file can be overriden by passing arguments when invoking the executable.
Options assume that the program is run from the top level of the project directory.
Projects with low or nonexistent test coverage are likely to generate large numbers of warnings. While the default workflow would be to address them before the PR approval, your strategy might be different.
In order to acknowledge an untested change and remove the UndercoverCI warning with the intention to improve later (or never), you can wrap the code block with the :nocov: syntax, e.g.
# :nocov:
def skip_this_method
never_reached
end
# :nocov:
Read more about the :nocov: syntax in SimpleCov's readme.
I wanted to create a tool to help others and myself ensure that tests are written for all the recent code changes. This should be useful for any ruby project, but especially those large or legacy codebases that lack testing (and we can't or don't want to invest in full test coverage).
The goal was to provide automated warnings, that are:
For more background, please read the blog post.
After checking out the repo, run bundle to install dependencies. Then, run rake to run the tests and RuboCop. You can also run pry -r 'undercover' for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.
Bug reports and pull requests are welcome on GitHub at https://github.com/grodowski/undercover.
The gem is available as open source under the terms of the MIT License.
暂无开放 Issues,或尚未同步最近议题。