Topiqlo ロゴ

コードカバレッジの高め方

公開日: 2025/06/03

コードカバレッジの高め方:品質と信頼性を可視化するテスト戦略

はじめに

テストを書いてはいるけれど、「どこまでカバーできているのか?」「何を優先して書くべきか?」と疑問に思ったことはありませんか?
そんな時に役立つのが「コードカバレッジ(Coverage)」です。本記事では、コードカバレッジの基本概念と、現実的に高めていく方法を具体的に解説します。

基本情報・概要

コードカバレッジとは、自動テストがソースコードのどの部分まで実行されているかを示す指標です。
一般的には以下のような種類があります:

  • ステートメントカバレッジ:実行された文の割合
  • ブランチカバレッジ:ifなどの分岐の通過率
  • 関数カバレッジ:呼び出された関数の割合
  • 条件式カバレッジ:複数条件を持つ文の評価パターン網羅

高ければ高いほど良いというわけではなく、「意味のある部分」をしっかりカバーすることが重要です。

比較・分類・特徴の表形式まとめ

カバレッジ種別内容目的
ステートメント実行されたコード行の割合テストの網羅状況を定量把握
ブランチtrue/falseなどの分岐ごとに通過したかを評価ロジックの安全性評価
関数カバレッジ関数が呼ばれたかどうか使用率と死んだコードの発見
条件式カバレッジif (a && b) の全パターンを通過したか異常系・境界ケースの網羅性

深掘り解説

  • Jestでカバレッジ測定する例

    npx jest --coverage

    coverage/lcov-report/index.html
    に視覚レポートが出力される。

    package.jsonでデフォルト設定:

      "scripts": {
        "test": "jest --coverage"
      }
    
  • 重要なのは“どこがカバーされていないか”の可視化

    • 条件分岐の抜け漏れ(elseが実行されていない)
    • 例外系(try/catchのcatch部分が未実行)
    • 無効値・境界値(空配列、null、0など)
  • 見落としやすいケースの例

    if (!items.length) { throw new Error("空です"); }

    → 通常のテストでは空配列を渡さないとcatch部分がカバーされない。

応用・発展的な使い方

  • E2Eテストと併用してカバレッジを補完(Cypress + nycなど)

  • CIで閾値を設定し、一定以下で失敗させる

      jest --coverage --coverageThreshold='{"global":{"branches":80,"functions":80,"lines":80}}'
    
  • 非同期・例外処理も丁寧にカバーする

    • Promise.reject()
      throw new Error()
      の挙動を必ずテストする
  • ビジネスロジック優先で書く

    • カバレッジを「上げること」ではなく「壊れてはいけない箇所を守ること」を目的にする

よくある誤解と注意点

  • カバレッジ100%=バグなし ではない:実行された=検証された、ではない
  • テストの質が重要:「何をチェックしているか」を明示的に
  • モックしすぎると実挙動と乖離する可能性あり:適度な統合テストも併用する

まとめ

コードカバレッジは「テストの量」ではなく、「テストの偏りや漏れを発見するためのツール」です。
数値だけを追うのではなく、重要なロジック・異常系・境界条件をしっかり押さえることで、現実的かつ安全な品質保証が可能になります。
チームでレポートを共有し、定期的に振り返る運用を取り入れてみましょう。