コードカバレッジの高め方
公開日: 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%=バグなし ではない:実行された=検証された、ではない
- テストの質が重要:「何をチェックしているか」を明示的に
- モックしすぎると実挙動と乖離する可能性あり:適度な統合テストも併用する
まとめ
コードカバレッジは「テストの量」ではなく、「テストの偏りや漏れを発見するためのツール」です。
数値だけを追うのではなく、重要なロジック・異常系・境界条件をしっかり押さえることで、現実的かつ安全な品質保証が可能になります。
チームでレポートを共有し、定期的に振り返る運用を取り入れてみましょう。