// the find
simplecov-ruby/simplecov
Code coverage for Ruby with a powerful configuration library and automatic merging of coverage across test suites
SimpleCov is the standard code coverage tool for Ruby, wrapping Ruby's built-in Coverage library with a much more usable API for filtering, grouping, merging results across test suites, and generating HTML reports. It's been the default choice in Rails projects for over a decade and has grown to support branch, method, and eval coverage in addition to the original line tracking. If you're writing Ruby tests and want to know what you're missing, this is the tool.
Branch coverage support is genuinely useful — line coverage on one-liner conditionals is almost meaningless, and the branch annotation in the HTML report (showing hit counts per branch arm) makes the gaps obvious. The multi-suite merging via `.resultset.json` is well thought out: results from RSpec, Cucumber, and Test::Unit accumulate across runs with configurable timeouts, and the new `finalize_merge false` / `SimpleCov.collate` path gives CI setups with parallel workers a clean way to separate per-worker collection from final reporting. The pluggable parallel adapter interface (with built-in handlers for `parallel_tests` and generic `TEST_ENV_NUMBER` runners) is something most projects in this space don't bother with. TypeScript frontend for the HTML report (with its own build toolchain) is a reasonable call — the report is actually interactive rather than static HTML string soup.
Template coverage (ERB, Haml, Slim) is explicitly unsupported except through the `eval` path with `ERB#filename=` set manually — which requires you to instrument your own templates and only works on CRuby 3.2+. The `# simplecov:disable` directive deprecating `:nocov:` is the right call, but the migration surface is large: any project that standardized on `:nocov:` now has a CI warning on every affected file. The implicit-else branch noise (synthetically missed branches from `||=`, `case/when` without else, exhaustive pattern matches) is handled by `ignore_branches :implicit_else`, but this opt-in means most projects will see inflated missed-branch counts until they discover the option. The HTML formatter bundles a full frontend build pipeline with Bun/TypeScript, which is fine for maintainers but means anyone who wants to fork or extend the formatter has a non-trivial toolchain to set up.