コードカバレッジとは?意味・種類・測定方法・目標値をわかりやすく解説

コードカバレッジとは、ソフトウェアのテストによってプログラムのコードがどの程度実行されたかを示す指標です。
「テストを十分に実施できているか」を数値で確認できるため、ソフトウェア開発や品質管理の現場で広く利用されています。
特に、ユニットテスト(単体テスト)を実施する際には、コードカバレッジを確認することで「テストされていないコード」がどこにあるのかを把握できます。
この記事では、コードカバレッジの意味から、代表的な種類、測定方法、目標値、注意点まで初心者にもわかりやすく解説します。
コードカバレッジとは
コードカバレッジ(Code Coverage)は、テストによってプログラムのコードがどれだけ実行されたかを割合で表したものです。
例えば、プログラム全体の100行のうち、テスト実行時に80行が実行された場合、単純な行カバレッジでは、
コードカバレッジ=80%
となります。
つまり、コードカバレッジを見ることで、
「作成したプログラムのうち、どの程度がテストによって確認されているのか」
を定量的に把握できます。
コードカバレッジの基本
| 項目 | 内容 |
|---|---|
| 英語 | Code Coverage |
| 日本語 | コードカバレッジ、コード網羅率 |
| 意味 | テストによって実行されたコードの割合 |
| 主な用途 | テスト品質の確認 |
| 表示方法 | %(パーセント) |
| 主な対象 | ユニットテストなど |
なぜコードカバレッジが重要なのか
ソフトウェア開発では、プログラムを書いただけでは品質を保証できません。
テストを実施して、想定どおり動作するか確認する必要があります。
しかし、テストケースが増えてくると、
-
どのコードをテストしたのか
-
どのコードをテストしていないのか
-
テストが十分なのか
を人間だけで把握するのが難しくなります。
そこで役立つのがコードカバレッジです。
例えば
次のようなプログラムがあったとします。
def calculate_price(price, member):
if member:
return price * 0.9
else:
return price
「会員」のケースだけテストした場合、
member = True
は実行されます。
しかし、
member = False
の処理は実行されません。
コードカバレッジを確認すると、テストされていない処理が存在することに気づけます。
コードカバレッジの代表的な種類
コードカバレッジには複数の種類があります。
代表的なのは次の4つです。
-
ステートメントカバレッジ
-
ブランチカバレッジ
-
条件カバレッジ
-
パスカバレッジ
それぞれ確認する範囲が異なります。
1. ステートメントカバレッジ
ステートメントカバレッジ(Statement Coverage)は、プログラム中の命令・文がどれだけ実行されたかを測定します。
「命令網羅」や「C0カバレッジ」と呼ばれることもあります。
例えば、
def check_age(age):
if age >= 18:
print("成人です")
print("処理終了")
このプログラムに対して、
check_age(20)
を実行すると、
成人です
処理終了
の両方が実行されます。
この場合、ステートメントカバレッジは高くなります。
ただし、age < 18 のケースをテストしているとは限りません。
そのため、ステートメントカバレッジが100%だからといって、十分なテストができているとは限らない点に注意が必要です。
2. ブランチカバレッジ
ブランチカバレッジ(Branch Coverage)は、条件分岐のそれぞれの経路が実行されたかを測定します。
「分岐網羅」や「C1カバレッジ」と呼ばれることもあります。
例えば、
if age >= 18:
print("成人")
else:
print("未成年")
というコードがあるとします。
この場合、
-
age >= 18→ True -
age >= 18→ False
の両方をテストする必要があります。
例えば、
check_age(20)
check_age(15)
とテストすれば、TrueとFalseの両方の分岐を通過できます。
ステートメントカバレッジとの違い
ブランチカバレッジは、ステートメントカバレッジよりも条件分岐を意識したテストになります。
そのため、実際のテスト設計では非常に重要な指標です。
3. 条件カバレッジ
条件カバレッジ(Condition Coverage)は、条件式のそれぞれの条件がTrueとFalseの両方になったかを確認します。
例えば、
if age >= 18 and member:
print("割引対象")
というコードがあるとします。
ここでは、
-
age >= 18 -
member
という2つの条件があります。
それぞれについて、
-
True
-
False
になるケースをテストします。
複数の条件が組み合わされたプログラムでは、条件カバレッジが重要になります。
4. パスカバレッジ
パスカバレッジ(Path Coverage)は、プログラム内に存在する実行経路をどの程度テストしたかを測定します。
例えば、条件分岐が複数存在すると、プログラムの実行経路は増えていきます。
開始
↓
条件A
↓
条件B
↓
処理
↓
終了
条件A・Bそれぞれに分岐がある場合、複数の経路が存在します。
すべての経路をテストすることで、より網羅的なテストになります。
ただし、プログラムが複雑になるほど経路数は急増します。
そのため、現実の開発で100%のパスカバレッジを目指すのは難しいケースがあります。
コードカバレッジの計算方法
基本的な考え方は、
カバレッジ率 = テストで実行された対象 ÷ 全対象 × 100
です。
例えば、100個のステートメントのうち80個がテストで実行された場合、
80 ÷ 100 × 100 = 80%
となります。
したがって、ステートメントカバレッジは80%です。
ただし、実際のツールではコメントや空行などを除外したり、対象となるコードの定義が異なったりするため、単純にソースコードの行数を数えるだけではありません。
コードカバレッジ100%なら品質は高い?
これは非常に重要なポイントです。
コードカバレッジ100%=バグがない、という意味ではありません。
例えば、
def divide(a, b):
return a / b
というコードがあったとします。
divide(10, 2)
をテストすればコードは実行されます。
しかし、
divide(10, 0)
というケースを考慮していなければ、実際の利用時にエラーが発生する可能性があります。
つまり、
コードカバレッジは「コードが実行されたか」を示す指標であって、「正しくテストできたか」を直接示す指標ではありません。
コードカバレッジを上げるメリット
コードカバレッジを測定することで、さまざまなメリットがあります。
テスト漏れを発見できる
最も大きなメリットです。
カバレッジが低い部分を見ることで、
「このコードはテストされていない」
という箇所を発見できます。
テスト品質を定量的に確認できる
「十分にテストしました」という感覚的な評価ではなく、
Statement Coverage:85%
Branch Coverage:72%
のように数値で確認できます。
チーム内でテスト状況を共有する場合にも便利です。
リファクタリングしやすくなる
十分なテストが用意されているコードでは、リファクタリングによる意図しない変更を発見しやすくなります。
特に大規模なシステムでは、コードカバレッジと自動テストを組み合わせることが有効です。
CI/CDに組み込める
コードカバレッジはCI/CD環境にも組み込めます。
例えば、
テスト実行
↓
カバレッジ測定
↓
カバレッジ80%未満
↓
ビルドを失敗
といったルールを設定できます。
これによって、開発が進むにつれてテスト品質が低下することを防ぎやすくなります。
コードカバレッジの目標値は何%?
「コードカバレッジは何%を目指せばいいのか?」という疑問もよくあります。
結論として、すべてのプロジェクトに共通する正解はありません。
一般的には、
| カバレッジ | 考え方 |
|---|---|
| 50%未満 | テスト不足の可能性が高い |
| 50~70% | 最低限のテストがある状態 |
| 70~80% | 一定のテストが実施されている |
| 80~90% | 比較的高いテスト網羅率 |
| 90%以上 | 高い網羅率。ただし費用対効果に注意 |
| 100% | 非常に高い網羅率。ただし品質保証とは別問題 |
ただし、これはあくまで目安です。
重要なのは「何%にするか」よりも、重要な処理やリスクの高い部分をきちんとテストできているかです。
コードカバレッジを測定するツール
コードカバレッジを測定するツールは、プログラミング言語ごとに存在します。
Python
Pythonでは、coverage.py が代表的なツールです。
例えば、
coverage run -m pytest
coverage report
のようにしてテストのカバレッジを測定できます。
HTML形式のレポートを生成することもできます。
coverage html
Java
Javaでは、JaCoCoが代表的なコードカバレッジツールです。
JUnitなどのテストフレームワークと組み合わせて利用できます。
JavaScript / TypeScript
JavaScriptやTypeScriptでは、Jestなどのテスト環境にカバレッジ機能を組み合わせて利用できます。
Ruby
Rubyでは、SimpleCovなどのツールが利用されています。
コードカバレッジを測定する基本的な流れ
コードカバレッジを導入する場合は、次のような流れになります。
STEP1:テストを書く
まずユニットテストなどを作成します。
STEP2:テストを実行する
作成したテストを実行します。
STEP3:カバレッジを測定する
カバレッジツールを使って、コードがどの程度実行されたかを確認します。
STEP4:未テスト部分を確認する
カバレッジレポートを確認し、テストされていないコードを探します。
STEP5:必要なテストを追加する
重要な未テスト部分についてテストケースを追加します。
STEP6:継続的に測定する
CI/CDなどに組み込み、継続的にカバレッジを確認します。
コードカバレッジを上げるときの注意点
カバレッジは高ければ高いほど良い、とは限りません。
カバレッジを上げること自体を目的にしない
例えば、
「カバレッジ80%を達成する」
ことだけを目的にすると、意味の薄いテストが増えてしまう可能性があります。
重要なのは、
「バグを発見できるテストになっているか」
です。
重要なコードを優先する
すべてのコードを均等にテストする必要はありません。
例えば、
-
決済処理
-
認証処理
-
個人情報を扱う処理
-
データベース更新
-
金額計算
などは、特に重点的にテストする価値があります。
カバレッジの種類にも注目する
「カバレッジ90%」という数字だけを見るのではなく、
-
ステートメントカバレッジ
-
ブランチカバレッジ
-
条件カバレッジ
など、何を対象に測定した90%なのかを確認することが重要です。
コードカバレッジとテストカバレッジの違い
「コードカバレッジ」と「テストカバレッジ」は似た言葉ですが、必ずしも同じ意味ではありません。
コードカバレッジは、主にプログラムのコードがどの程度テストによって実行されたかを表します。
一方、テストカバレッジはより広い意味で使われ、
-
機能
-
要件
-
コード
-
データ
-
ユースケース
などがどの程度テストされているかを指す場合があります。
そのため、コードカバレッジはテスト品質を評価するための一つの指標と考えると分かりやすいでしょう。
コードカバレッジとユニットテストの関係
コードカバレッジは、ユニットテストと非常に相性が良い指標です。
例えばPythonで、
def add(a, b):
return a + b
という関数があった場合、
def test_add():
assert add(1, 2) == 3
というテストを実行することで、この関数のコードが実行されたことをカバレッジとして確認できます。
つまり、
プログラム
↓
ユニットテスト
↓
コードを実行
↓
コードカバレッジを測定
↓
未テスト部分を発見
という関係になります。
AI時代にコードカバレッジが重要になる理由
生成AIやAIコーディングツールの普及によって、プログラムを作るスピードは大きく向上しています。
一方で、
コードを生成するスピードに対して、テストを書くスピードが追いつかない
という問題も起こり得ます。
AIにコードを書かせた場合でも、
-
本当に必要な処理なのか
-
エッジケースに対応しているか
-
例外処理は適切か
-
条件分岐をテストしているか
を確認する必要があります。
そのため、AIによるコード生成と自動テスト、コードカバレッジを組み合わせることは、これからのソフトウェア開発でも重要になっていくでしょう。
コードカバレッジについてよくある質問
コードカバレッジとは簡単にいうと?
「プログラムのうち、テストでどれだけ実行したか」を割合で表したものです。
例えば100行中80行がテストで実行された場合、行カバレッジは80%です。
コードカバレッジ100%なら安心ですか?
いいえ。
100%であっても、テスト内容が不十分であればバグを発見できない可能性があります。
コードカバレッジはあくまでテストの状況を確認するための指標です。
コードカバレッジは何%を目指せばいいですか?
一律の正解はありません。
まずは重要な処理を中心に十分なテストを用意し、そのうえでプロジェクトの性質に応じて目標値を設定することが重要です。
Pythonでコードカバレッジを測定できますか?
はい。
Pythonではcoverage.pyが代表的なツールです。
pytestなどのテストフレームワークと組み合わせて利用できます。
まとめ
コードカバレッジとは、テストによってプログラムのコードがどの程度実行されたかを示す指標です。
特に重要なポイントをまとめると、次のとおりです。
-
コードカバレッジはテストの網羅率を確認する指標
-
ステートメントカバレッジやブランチカバレッジなど複数の種類がある
-
未テストのコードを発見するのに役立つ
-
CI/CDに組み込んで継続的に測定できる
-
100%だからといってバグがないとは限らない
-
カバレッジの数値だけを追いかけないことが重要
-
重要な処理やリスクの高い処理を優先してテストする
-
Pythonでは
coverage.pyなどのツールを利用できる -
AIによるコード生成が普及する中で、テストとカバレッジ管理はさらに重要になる
コードカバレッジは「テストの品質そのもの」ではなく、「テストがコードのどこまで届いているか」を確認するための重要なメトリクスです。
そのため、カバレッジの数字だけを高めるのではなく、実際にバグを発見できるテストを設計することが重要です。




