FEATUREわかったつもりの、その先へ
開発記録

テストカバレッジとは?C0・C1・C2の違いを例で解説

テストカバレッジは、テスト実行時にコードのどこを通ったかを示す指標です。C0・C1・C2の違い、複合条件で注意する点、100%でも安心できない理由を例とともに整理します。

CONTENTSこの記事の目次7項目

Appli Parkの開発では、機能を作るだけでなく、テストで動作を確かめる作業も行っています。そこで考えたいのが、「テストが通ったとしても、まだ確かめていない場所はないだろうか」という疑問です。その手がかりになるのが「テストカバレッジ」。何を数えた割合なのか、100%なら安心してよいのかまで理解して使いたいところです。今回は、アプリの動作確認を出発点に、カバレッジの意味とC0・C1・C2の違いを整理します。

青はテストが通った部分、灰色はまだ通っていない部分です。75%は正しさではなく通過した割合です。

カバレッジは何を数えている?

代表的なのは、文が実行された割合を見るステートメント、関数が呼ばれた割合を見るファンクション、if文などの分岐を通った割合を見るブランチ、行単位で見るラインです。同じコードでも種類ごとに数字は変わります。

100%でも「正しい」とは限らない

カバレッジは、コードを通ったことは教えてくれますが、期待した結果を正しく確認したかまでは教えてくれません。100%でも検証内容が弱ければ不具合は残り、低くても重要な動作を丁寧に確かめている場合があります。

数字ではなく地図として使う

大切なのは数字を競うことではなく、未実行の場所を見つけて理由を考えることです。変更が多い場所や、失敗したときの影響が大きい分岐からテストを足すと、数字が実際の安心につながります。

カバレッジは何%を目指せばよいですか?

全プロジェクト共通の正解はありません。重要な処理を十分に確かめられているかを先に考え、割合は継続的な変化や見落としを見つける補助として使います。

C0・C1・C2は何が違う?

命令網羅は文、分岐網羅は判定の分かれ道、条件網羅は個々の条件の真偽を見ます。全組み合わせを見る複合条件網羅(MCC)は本文で分けて説明します。

C0は命令網羅、C1は分岐網羅、C2は条件網羅を指す呼び方として使われます。ただし、記号の用法は資料やツールによって異なるため、実務では指標の説明も確認します。 ここでは「各条件が真と偽になること」を条件網羅、「条件の真偽の全組み合わせを確認すること」を複合条件網羅(MCC)として分けます。名前の近さより、何を数えるかに注目してください。

C0:命令網羅(ステートメントカバレッジ)

命令網羅は、対象となる実行可能な文のうち、テストで実行した文の割合です。100%なら、対象範囲の全ての文を少なくとも一度実行しています。 割引処理を一度動かせば、その中の文は実行済みになります。ただし、通常価格にする別の文があれば、そちらを実行しない限り対象全体の命令網羅は100%にはなりません。

C1:分岐網羅(ブランチカバレッジ)

C1は、if文などの判定結果が真になった経路と、偽になった経路の両方を通ったかを見る指標です。 C0で命令を一度通しただけでは見落としやすい「条件を満たさなかったとき」の動作も確認します。エラー処理や代替処理など、分かれ道の先にある挙動を確かめるために重要です。

C2:条件網羅(コンディションカバレッジ)

条件網羅は、一つの判定式を構成する個々の条件が、真と偽の両方に評価されたかを見ます。 「会員である」かつ「合計5,000円以上」なら、会員の条件と金額の条件を別々に見ます。各条件の真偽を確認することと、全組み合わせを試すことは同じではありません。一般には、条件網羅だけで判定全体の真偽も網羅できたとは限らないため、分岐網羅と併せて確認します。

同じif文で比べてみる

例として、「会員であり、合計金額が5,000円以上なら割引する」という処理を考えます。この判定には「会員か」と「金額が基準以上か」という二つの条件があります。

CODEdiscount-condition.jsjavascript
isMember && total >= 5000
会員であり、合計金額が5,000円以上かを確認する判定式です。
四つの入力と評価結果
入力会員条件金額条件判定・結果
1. 会員・5,000円真・割引あり
2. 会員・4,999円偽・割引なし
3. 非会員・5,000円未評価(短絡評価)偽・割引なし
4. 非会員・4,999円未評価(短絡評価)偽・割引なし

1番と3番では、判定全体の真と偽を確認できます。しかし金額の条件が偽になるケースは確認できていません。そこで2番も試し、5,000円を境に割引の有無が変わることを確かめます。 JavaScriptやJavaの && は、左側が偽なら右側を評価しません。3番と4番では金額の条件が実行されないため、「金額を二種類入力した」ことと「金額条件の真偽を評価した」ことを混同しないようにします。 1〜4番は入力の四つの組み合わせです。実行時に何が評価されたかは、使う計測ツールのレポートと照合します。いずれのテストでも、処理を通すだけでなく、割引の有無や計算結果をアサーションで確認します。

どこまで細かく見るべき?

全組み合わせを増やす前に、そのテストで何を確かめたいかを決めます。たとえば今回なら、会員かどうかに加え、4,999円・5,000円という境界と、期待する割引結果が確認対象です。 決済や権限など、失敗したときの影響が大きい処理では、分岐・条件・境界値・エラー時の動作を組み合わせて確認します。カバレッジだけで必要なテストが全て決まるわけではありません。

  • 変更したコードと、その周辺の分岐を優先する
  • 境界値やエラー時の経路を確認する
  • 自動生成コードや到達不能な防御処理は理由を記録する
  • 全体の割合だけでなく、重要な処理の未実行箇所を見る
  • カバレッジが上がっても、期待結果を確かめるアサーションを省かない

次に足すテストを一つ決める

レポートを開いたら、変更した処理の未実行部分から一つ選んでみます。金額条件の偽側が抜けていたら、境界直前の入力と期待結果を追加する。そんな使い方なら、数値の変化と確認した内容を結び付けられます。 定義の整理には、IPAの資料、JSTQBのシラバス案内、ISTQB「Automotive Software Tester Syllabus v2.1.1」4.2.1を参照しました。

出典・参考資料ソフトウェアテスト見積りガイドブック情報処理推進機構(IPA)ipa.go.jp出典・参考資料定量的品質予測のススメ情報処理推進機構(IPA)ipa.go.jp出典・参考資料Foundation Level シラバスJSTQB認定テスト技術者資格jstqb.jp