Rails

【Rails】カバレッジを簡単に計測できるツールSimpleCovについて初心者向けにまとめてみる

Rails



 

今回はカバレッジを簡単に計測できるツール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
RSpec
【RSpec導入】RubyのテスティングフレームワークRSpecについて初心者向けにまとめてみたプログラミングにおけるテストについて、RSpecと呼ばれるテスト独自の言語を用いながら解説しています。作成したwebサービスが正しく動くかどうかを試験することで、事前にエラーになり得る箇所を発見できたり、要件漏れを防ぐことができます。ぜひマスターしましょう。...

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
カバレッジレポート
カバレッジレポートはcoverage/index.htmlに出力されています。% open coverage/index.htmlをターミナルで実行しカバレッジを確認してください。

 

ここまでが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
BranchカバレッジはRuby2.5から導入された機能です。

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用のカバレッジ計測ツール

参考

Github SimpleCov

 

今回はカバレッジを簡単に計測できるツールSimpleCovについて紹介しました。これを機にSimpleCovを用いてカバレッジを計測し、プロダクトの品質を担保しながら開発を進めていただけたらと思います。