🛤️

[Rails] Coverbandを使ってコードカバレッジから総合テスト・システムテストの網羅性をチェックする

2024/09/13に公開

どうも僕です。

UnitTestを自動化し、コードカバレッジを計測することでテストの網羅性を確認できます。しかし、カバレッジの合格基準はシステムやチームによって異なり、適切な基準を決めるのは簡単ではありません。

さらに、UnitTestではシステムの一部しかテストできないことが多く、特に実機での挙動や複雑なユーザー操作など、実環境でしか確認できない部分が残ります。これにより、たとえUnitTestのカバレッジが高くても、現実の使用状況で起こりうる問題が見逃される可能性があります。

インヴェンティットでは、実機のモバイルデバイスを多く扱っているため、UnitTestで自動化できないテストが多くあります。そのため、手動で行う総合テストがシステム全体の品質保証において重要な役割を果たしています。

しかしながら、UnitTestのカバレッジだけでは、実機での動作や複雑なユーザー操作まで十分に網羅できないため、総合テストでもコードカバレッジを計測し、網羅性を確認する手法を導入しました。これにより、より包括的にシステム全体の品質を向上させることが可能になりました。その方法をご紹介します。

Railsのシステムにおいて、Coverbandというgemを導入しました。このgemを使うことで、production環境で実際に動作した範囲のコードカバレッジを計測することができます。

https://github.com/danmayer/coverband

導入は簡単です。詳しくはREADMEを参照してください。
今回は、テスト環境でのみCoverbandを有効にするため、以下のように環境変数で有効化するようにしました。

Gemfile

gem 'coverband', require: false

config/initializers/coverband.rb

if ENV['COVERBAND_ENABLED'] == 'true'
  require 'coverband'
end

Coverbandの計測結果は、お馴染みのUIで確認できます。

ルーティングに以下を追加します。

config/routes.rb

if defined?(Coverband)
  mount Coverband::Reporters::Web.new, at: '/coverage'
end

Basic認証をかけたかったので、設定で以下を追加。

config/coverband.rb

if defined?(Coverband)
  Coverband.configure do |config|
    # ユーザー名:空、パスワード:mypassword でBasic認証がかかります
    config.password = 'mypassword'
  end
end

画面上から検索結果のクリアをすることができ、特定の操作のみのカバレッジを計測することも可能です。

オーバーヘッドについては、実際に使用してみたところパフォーマンスに影響はなく、いつも通りの操作感でした。ただし、本番環境では無効にしておくのが良いでしょう。

実際の計測を通して、今まで検証できていなかったロジックを発見することができ、テストパターンの見直しを行う良い機会となりました。手軽に実現できるツールに感謝です。

Inventit Tech

Discussion