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
が実行されないので、意図せずテストカバレッジが下がってしまいます。そのような時には、simplecov
のnocov_token
をカスタマイズすることで、テストカバレッジを100%に保つことが出来ます。
以下の例では、テストカバレッジの計測にはsimplecovとCoverallsを使用しており、テストには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
などの中に、simplecov
のnocov_token
を定義します。
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%に保つことが出来ます。