LoginSignup
3
4

More than 5 years have passed since last update.

Railsのバージョンに依存する条件分岐でテストカバレッジを100%に保つ

Posted at

RailsプラグインをGemとして公開するときなど、複数バージョンのRailsをサポートしたいことがあります。
Travis CIを使用すると、依存Gemのバージョンを組み合わせて、複数環境でのテストを自動化することが出来ます。また、Coverallsなどを使用すると、複数環境でのテストカバレッジを可視化して管理することが出来ます。

複数バージョンのRailsをサポートするGemの開発時には、互換性のためにRailsバージョンに依存する処理の分岐を迫られることがあります。

if Rails::VERSION::MAJOR >= 5
  # Code for Rails5
  hogehoge
else
  # Code for Rails4
  foobar
end

このような条件分岐が存在すると、Rails5環境下では# Code for Rails4は実行されず、Rails4環境下では# Code for Rails5が実行されないので、意図せずテストカバレッジが下がってしまいます。そのような時には、simplecovnocov_tokenをカスタマイズすることで、テストカバレッジを100%に保つことが出来ます。
以下の例では、テストカバレッジの計測にはsimplecovCoverallsを使用しており、テストにはRSpecを使用しています。Minitestなど他のテストフレームワークをお使いの場合には、適宜読み替えて下さい。
simplecovのnocov_token

手順

Railsのバージョンに応じて処理を分岐している箇所に、任意のアノテーションをコメントとして記述します。

# :skip-rails4:
if Rails::VERSION::MAJOR >= 5
  # Code for Rails5
  hogehoge
# :skip-rails4:
# :skip-rails5:
else
  # Code for Rails4
  foobar
end
# :skip-rails5:

そして、spec_helper.rbなどの中に、simplecovnocov_tokenを定義します。

spec/spec_helper.rb
SimpleCov.start('rails') do
  add_filter '/spec/'
  # Railsのバージョンに応じてコードカバレッジの対象外とするアノテーションを定義する
  if Rails::VERSION::MAJOR == 5
    nocov_token 'skip-rails5'
  elsif Rails::VERSION::MAJOR == 4
    nocov_token 'skip-rails4'
  end
end

こうして、めでたくテストカバレッジを100%に保つことが出来ます。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4