こんにちは、鈴木です。
テストコードのカバレッジ(網羅率)を求めることができるライブラリ SimpleCov をご紹介します。
- SimpleCov (https://github.com/colszowka/simplecov)
SimpleCov の導入
Gemfile に以下の行を追加します。
1 |
gem 'simplecov', :require => false, :group => :test |
テスト実行時のみ必要なので :group => :test を付けています。
bundle install します。
1 |
bundle install |
TestUnit を使用する場合は test/test_helper.rb、RSpec を使用する場合は spec_helper.rb に以下の内容を追加します。
ここで注意事項があります。SimpleCov はアプリケーションコードよりも先にロードする必要があるので、test/test_helper.rb の先頭に追加するようにしてください。
1 2 3 4 5 6 7 8 9 |
# 次の 2 行を追加します. require 'simplecov' SimpleCov.start 'rails' # 元々書かれていたコード. ENV["RAILS_ENV"] = "test" require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' ... |
それではテストを実行してみましょう。
1 |
rake test |
テストの実行が終わると、coverage ディレクトリに結果が HTML ファイルで出力されていることが分かると思います。
coverage/index.html を開くと以下のように確認することができます。
カバレッジに関する注意点
「テストカバレッジ 100% 達成!」や「テストコードではカバレッジを 100% にすること!」と言われることがありますが、カバレッジにもいくつか種類があります。
ホワイトボックステストでのカバレッジでは、以下に挙げる C0, C1, C2 という基準が一般的です。
- C0 命令網羅
- C1 分岐網羅
- C2 条件網羅
simplecov で取得できるのは C0、つまり命令網羅(ラインカバレッジ)と呼ばれるものです。
カバレッジの取得はツールで行なうことができますが、何を取得するのか決めることや、何を取得しているのか知っていることはツールを使う人の役割です。
単純にカバレッジのパーセントだけ見るのではなく、本当に意味のあるテストを行なえているのか考えつづけることが大切です。
ありがちなこととして、モデルのバリデーションのテストがあります。
バリデーションは以下のように記述しますので、クラスがロードされるだけで「validates ...」の部分が全て実行されます。つまりテストコードを 1 行も書いていないにも関わらず C0 のカバレッジは 100% となってしまいます。
1 2 3 4 5 6 7 8 9 10 11 |
class User < ActiveRecord::Base validates :name, :presence => true, :length => {:maximum => 20} validates :birthday, :presence => true validates :email, :presence => true ... end |
カバレッジを 100% にすることが大切なのではなく、意味のあるテストコードを書くことが大切です。
まとめ
SimpleCov の紹介と、カバレッジに関する注意点についてお話ししました。
今回は紹介しませんでしたが、SimpleCov には設定項目がいくつもありますので、興味をもたれた方は SimpleCov のサイトもぜひチェックしてみてください。