[quads id=1]
今回はカバレッジを簡単に計測できるツールSimpleCovについて簡単にまとめたので紹介したいと思います。SimpleCovは無料で使用することができ、html形式のレポートも出力してくれるためRails(Ruby)プロジェクトのカバレッジツールとしては一番使われているツールになります。
カバレッジとは
カバレッジとはテスト対象のプログラムコードの内、テストがどれだけ網羅されているかを%(パーセント)で表したものです。ざっくり言うと、どれだけテストコードが網羅されているかを表す指標になります。
カバレッジは、所定の網羅条件がテストによってどれだけ実行されたかを割合で表したものです。網羅条件が命令であれば、命令網羅と呼ばれ(またはステートメントカバレッジ、C0とも呼ばれます)、すべての実行可能な命令のうち、テストで実行された命令の割合を意味します。そのほかに、すべての判定条件(if文による分岐など)のうち、テストで実行された判定条件を意味する判定条件網羅(ブランチカバレッジ、C1とも呼ばれます)などがあります。
参考: カバレッジ(網羅率)分析とは
カバレッジを計測する目的
カバレッジを計測する目的はプロダクトコードを網羅して品質を保つためです。
カバレッジを高めることでバグを減らし、プロダクトコードの品質を担保することができます。反対にカバレッジが十分でない場合はプロダクトコードの品質が担保できず、バグが潜んでいる可能性が高くなってしまいます。
こういった理由からカバレッジを常に計測することで、高品質のプロダクトを維持することが可能になります。
SimpleCovとは
SimpleCovとはRuby用のカバレッジ計測ツールです。
SimpleCovは無料で使用することができ、html形式のレポートも出力してくれるためRails(Ruby)プロジェクトでは一番使われているカバレッジ計測ツールだと思います。
SimpleCovのGithubはこちら
↓ ↓ ↓
SimpleCovの使い方
新規アプリケーションの作成
% rails new simplecov-app -d mysql
% cd simplecov-app
% rails db:create
- アプリケーション名: simplecov-app
- Ruby: 3.1.2
- Rails: 7.0.3
- DB: MySQL
RSpecの導入
# Gemfile
group :development, :test do
# 省略
gem 'rspec-rails'
end
% bundle install
% rails g rspec:install
# .rspec
--require spec_helper
--format documentation
# config/application.rb
require_relative "boot"
require "rails/all"
Bundler.require(*Rails.groups)
module SimplecovApp
class Application < Rails::Application
config.load_defaults 7.0
config.generators do |g|
g.assets false
g.skip_routes false
g.test_framework :rspec,
controller_specs: false,
view_specs: false,
helper_specs: false,
routing_specs: false
end
end
end
rspecを実行し、以下のような結果が表示されれば成功です。
% rspec
No examples found.
Finished in 0.00082 seconds (files took 0.39987 seconds to load)
0 examples, 0 failures

SimpleCovの導入
SimpleCovはGemとして導入することができるため、Gemfileにgem 'simplecov'
と記載するだけで使用可能になります。
group :test do
gem 'simplecov'
end
% bundle install
SimpleCoveの読み込みと起動を行う記述をspec_helper.rb
の最上部に記載します。
require 'simplecov'
SimpleCov.start
ここまでの実装で、% rspec
実行時にカバレッジレポートがcoverage/index.htmlに
出力され、カバレッジ結果を確認することができるようになります。
% rspec

ここまでがSimpleCovの基本的な使い方になります。
SimpleCovのオプション
1. カバレッジファイルをGitで追跡しない
以下の記述を.gitignore
に追加することで、カバレッジ結果がGitで追跡されないようになります。追加しておくべきオプションの1つになります。
echo coverage >> .gitignore
2. Branchカバレッジの計測
enable_coverage :branch
を追記することで、Branchカバレッジを計測することができるようになります。追加しておくべきオプションの1つになります。
require 'simplecov'
SimpleCov.start do
enable_coverage :branch
end
3. 終了動作のカスタマイズ
最低カバレッジ・最大カバレッジを設定することで、それらを満たさなかった場合に動作を終了することができます。
minimum_coverage
# spec/spec_helper.rb
require 'simplecov'
SimpleCov.start
# Lineカバレッジが90%未満の場合に終了する
SimpleCov.minimum_coverage 90
# Lineカバレッジが90%未満の場合に終了する(上記と同じ)
SimpleCov.minimum_coverage line: 90
# Lineカバレッジが90%未満、Branchカバレッジが80%未満の場合に終了する
SimpleCov.minimum_coverage line: 90, branch: 80
minimum_coverage_by_file
require 'simplecov'
SimpleCov.start
# Lineカバレッジが90%未満の場合に終了する
SimpleCov.minimum_coverage_by_file 80
# Lineカバレッジが90%未満の場合に終了する(上記と同じ)
SimpleCov.minimum_coverage_by_file line: 80
# Lineカバレッジが90%未満、Branchカバレッジが80%未満の場合に終了する
SimpleCov.minimum_coverage_by_file line: 90, branch: 80
maximum_coverage_drop
require 'simplecov'
SimpleCov.start
# Lineカバレッジが5%を上回った場合に終了する
SimpleCov.maximum_coverage_drop 5
# Lineカバレッジが5%を上回った場合に終了する(上記と同じ)
SimpleCov.maximum_coverage_drop line: 5
# Lineカバレッジが5%より上、Branchカバレッジが10%を上回った場合に終了する
SimpleCov.maximum_coverage_drop line: 5, branch: 10
4. カバレッジ計測対象の除外(ファイル毎)
add_filter
を使用することでカバレッジ対象から除外することができます。
require 'simplecov'
SimpleCov.start do
# /spec/ が含まれるファイルは除外する
add_filter '/spec/'
# /spec/ が含まれるファイルは除外(上記と同じ)
add_filter %r{^/spec/}
# 行数が5行未満のファイルは除外する
add_filter do |source_file|
source_file.lines.count < 5
end
end
5. カバレッジ計測対象の除外(コード毎)
上記ではファイル毎でカバレッジ計測対象を除外していましたが、:nocov:
を設定することでコード毎に計測対象から除外することも可能です。
# :nocov:
def skip_this_method
never_reached
end
# :nocov:
6. 計測結果のグループ化
add_group
を使用することで、指定した内容計測結果をグループ化しタブに分けて表示することが可能になります。グループ化されていないファイルに関してはUngrouped
というタブに分類されます。
require 'simplecov'
SimpleCov.start do
add_group 'Models', 'app/models'
add_group 'Services', 'app/services'
add_group 'Controllers (api)', 'app/controllers/api'
add_group 'Controllers', 'app/controllers'
add_group 'Helpers', 'app/helpers'
end

参考設定
最後にSimpleCovの参考設定を載せておきます。
# frozen_string_literal: true
require 'simplecov'
SimpleCov.minimum_coverage_by_file 90
SimpleCov.start do
add_filter '/spec/'
add_filter '/config/'
add_filter do |source_file|
source_file.lines.count < 5
end
enable_coverage :branch
add_group 'Models', 'app/models'
add_group 'Services', 'app/services'
add_group 'Controllers (api)', 'app/controllers/api'
add_group 'Controllers', 'app/controllers'
add_group 'Helpers', 'app/helpers'
end
まとめ
- カバレッジとはテスト対象のプログラムコードの内、テストがどれだけ網羅されているかを%(パーセント)で表したもの
- カバレッジを計測する目的はプロダクトコードを網羅して品質を保つため
- SimpleCovとはRuby用のカバレッジ計測ツール
参考
今回はカバレッジを簡単に計測できるツールSimpleCovについて紹介しました。これを機にSimpleCovを用いてカバレッジを計測し、プロダクトの品質を担保しながら開発を進めていただけたらと思います。