テストカバレッジの基準

ソフトウェアテストでは、「テストの達成度」を客観的に示す指標としてテストカバレッジが一般的に利用されます。特に組み込みシステムにおいては、品質要求や安全規格への対応を背景に、C0・C1・MC/DCといったカバレッジ基準を理解し、適切に使い分けることが重要です。

一方、「カバレッジ100%=品質100%」ではないことに留意が必要です。カバレッジはあくまでテストが「どこまで到達したか」を可視化するための尺度であり、要件ベースのテストやレビューと組み合わせることによってはじめて効果を発揮します。

この記事では、C0・C1・MC/DCの違いを整理し、組み込み開発における適切な使い分けについて解説します。

テストカバレッジとは何か

テストカバレッジは、テストの実施状況を客観的に評価するための代表的な定量指標です。まず、カバレッジの基本的な考え方や組み込み開発で重視される理由について確認します。

テストカバレッジの概要と重要性

テストカバレッジとは、ソフトウェアのコードや仕様に対して、どの程度テストが実施されたかを数値で示す基準です。テスト漏れの有無を可視化できるため、品質の説明責任を果たす上でも重要な役割を担っています。

ただし、カバレッジが100%であってもすべての不具合を検出できるわけではありません。仕様の誤りやテストケース自体の不足は、カバレッジだけでは判断できないためです。

組み込み開発において必要とされる背景

近年では、自動車、産業機器、医療機器など、組み込みシステムに求められる信頼性の基準はより高まっています。そのため、テスト漏れを定量的に確認できるカバレッジ測定は、多くの開発現場で採用されています。

また、CI/CDパイプラインへの組み込みも一般的になりつつあります。

カバレッジの種類

代表的なコードカバレッジとして次のようなものがあります。

  • C0:命令(ステートメント)網羅 すべての実行可能命令を最低1回実行する
  • C1:分岐(判定)網羅 すべての分岐をtrue/falseの両方で実行する
  • C2:条件網羅 すべての条件をtrue/falseの両方で評価する
  • MC/DC:改良条件/判定網羅 各条件が判定結果へ独立して影響することを確認する

品質への要求が高まるほど、より高度なカバレッジ基準が求められます。

C0(命令網羅)とは:カバレッジの基本

C0(命令網羅)は最も基本的なカバレッジ基準であり、プロジェクトで最初に導入されることが多い基準です。その特徴や適した利用場面について理解することにより、他のカバレッジとの違いについても把握しやすくなります。

C0の定義と特徴

C0は、すべての命令を一度以上実行すれば達成可能な、最も基本的なカバレッジです。計測しやすくテスト工数も比較的少ないため、多くの開発現場では最初に導入されます。

ただし、C0はソース上の実行文(ステートメント)を1回以上実行する指標のため、実行パスの妥当性や条件式の評価結果までは保証できません。また、組み込み開発では計測方式(ソース計測/オブジェクト計測)により差が出ることがあり、デッドコードや初期化コードの扱いが課題になる場合もあります。

C0が有効なケース

C0は、開発初期や小規模プロジェクトなど、まずテスト漏れを防ぎたい場面に適しています。また、CI/CDによる回帰テストの監視指標としても有効です。

ただし、安全性が重視されるシステムでは、C0のみでの品質保証は困難であり、より高いカバレッジとの併用が望まれます。

C1(分岐網羅):実務において一般的

C1(分岐網羅)は、組み込みソフトウェア開発で広く採用されている実践的なカバレッジ基準です。C0との違いや実務で選ばれる理由について解説します。

C1の定義と特徴

C1では、すべての分岐についてtrue/falseの両方を実行します。そのため、C0では見逃される分岐処理やエラー経路についても確認できます。

たとえば、if (A) という条件であれば、「A = true」の場合と「A = false」の場合の双方をテストする必要があります。

C0との違い

C0は命令を実行することが目的ですが、C1では分岐のtrue/false双方を通過する必要があります。異常系や例外処理の確認も自然とおこなわれるため、品質向上につながります。

ただし、複合条件 if (A && B) のような場合、C1では「A = true, B = true」と「A = false, B = true」の2ケースだけで分岐網羅を満たせてしまうため、「B = false」の場合の挙動が確認できません。さらに、C/C++などの組み込み開発でよく用いられるプログラミング言語では短絡評価(ショートサーキット)がおこなわれるため、「A = false」の場合には「B = false」の場合の挙動が評価されないという特性があります。このため、条件式内部の評価を保証するには、より高度なカバレッジが必要です。

C1が有効なケース

一般的な組み込みソフトウェアにおいては、C1が最も費用対効果の高いカバレッジとされています。量産機器の単体テストやCI/CDの品質ゲート(一定水準未満ならマージ/リリースを止める判定基準)として採用されることも多いため、実務の標準的な基準として広く採用されています。

C1はテストケースの増加が比較的少なく、例外処理やフェールセーフ処理の欠陥検出に有効であるため、費用対効果が高い基準とされています。

MC/DC(改良条件/判定網羅):高品質が要求される領域

安全性が求められるシステムでは、C1よりも高い網羅性が必要になる場合があります。ここでは、MC/DCの特徴や採用される背景について紹介します。

MC/DCの定義と特徴

MC/DCは、各条件が判定結果へ独立して影響することを確認するカバレッジです。単に条件のtrue/falseを網羅するだけでなく、「他の条件を固定した状態で、対象条件だけを変化させたときに判定結果が変わること」をテストで示す必要があります。

例:A && B の場合

  • Aだけ変化させて結果が変わるケース
  • Bだけ変化させて結果が変わるケース

この「他条件固定」の考え方がMC/DCの本質であり、単なる条件網羅(true/falseを1回ずつ評価)とは明確に異なります。そのため、航空機ソフトウェアのDO-178Cでは最上位レベル(Level A/DAL A)でMC/DC相当の構造カバレッジが求められます。自動車分野のISO 26262ではASILが上がるほど高度なカバレッジ(分岐、MC/DCなど)が推奨され、特にASIL DではMC/DCの適用が実務上強く求められるケースが多くあります。

なお、DO-178C(レベルB)ではDecision Coverage(C1:分岐網羅)まで求められるとされるなど、規格レベルによって要求されるカバレッジが異なります。

C2(条件網羅)との違い

C2(条件網羅)は各条件のtrue/falseを1回ずつ評価するのに対し、MC/DCは各条件が判定結果に独立して影響することまで検証します。たとえば、A && B の場合、C2は(A, B) = (true, false), (false, true)の2ケースでも成立しますが、MC/DCは(true, true), (false, true), (true, false)のように「他条件固定で対象条件のみ変化させて判定結果が変わる」テストペアが必要です。

なお、C2が100%でもC1が100%になるとは限りません。

MC/DCが必要な理由と課題

MC/DCは、複雑な条件式に潜む不具合を検出しやすい点が最大のメリットです。また、完全な条件組み合わせを試験するよりは少ないテストケースで高い網羅性を実現できます。

その一方で、テスト設計は困難で対象コードも限定されることが一般的です。実務では、専用ツールを活用しながら安全性に関わる機能を中心に適用するケースがしばしば見られます。

C0・C1・MC/DCの使い分け:品質要求に応じて選択

C0・C1・MC/DCの3つのカバレッジ基準を比較した表。共通の条件式 if (A && B || C) を例に、中央に条件式の判定からif節とelse節へ分かれるフローチャートを示す。要求される網羅内容は、C0(命令網羅)が全命令を1回以上実行すること、C1(分岐網羅)が全分岐のTrueとFalseを実行すること、MC/DC(条件修正/決定網羅)が各条件が判定結果へ独立して影響することを確認することである。

どのカバレッジ基準を採用するかは、製品の品質要求やリスク、開発コストによって異なります。それぞれの特徴を踏まえた上で、適切なカバレッジを選択することが重要です。

要求される品質とカバレッジの関係

カバレッジは、製品に求められる品質に応じて選択します。

  • 小規模・低リスク製品:C0
  • 一般的な組み込み製品:C1
  • 機能安全規格対応製品:MC/DC(DO-178C、ISO 26262など)

ただし、すべての製品で最高レベルのカバレッジを目指す必要はなく、リスクに応じた選択が重要です。

コストと効果のバランス

一般的に、C0からC1、MC/DCへと進むほどテスト工数は増加します。そのため、必要以上に高いカバレッジを採用すると、開発コストが大きく膨らむ可能性があります。

実務においては「C1を標準とし、重要機能のみMC/DCを適用する」といったハイブリッド運用が多く、品質とコストのバランスを取りやすい方法としてよく採用されています。

カバレッジの目標値

カバレッジ100%は目標の一つですが、それ自体が品質を保証するわけではありません。未達箇所については (1)到達不能(防御コードなど) (2)テスト困難(ハード依存) (3)単純漏れ に分類し、(1)(2)は根拠とレビュー記録を残します。また、必要に応じて追加テストなどをおこなうことによって補完することが重要です。

カバレッジ測定を活かすポイント

カバレッジ測定は数値を高めること自体が目的ではありません。品質向上につなげるための考え方や、効率的な運用方法について解説します。

カバレッジだけに依存しない

カバレッジは品質を測る指標の一つであり、十分条件ではありません。要件ベースのテストや異常系テスト、設計レビューと組み合わせることによって、より高い品質を実現できます。

測定ツール活用による効率化

現在では、ほとんどのカバレッジ測定ツールでCI/CDと連携できます。自動測定やレポート生成機能を活用することにより、品質管理の効率化や証跡作成の負担軽減につながります。

まずはC1から始める

一般的な組み込み開発では、まずC1を品質基準として導入することが現実的です。前述のとおり、C1は費用対効果の高いカバレッジ基準であり、テストケースの増加が比較的少なく、分岐の網羅がバグ検出効率に優れています。また、C0→C1→MC/DCの段階的な導入が現場では現実的であり、特に例外処理・フェールセーフ処理の網羅においてC1が大きな効果を発揮します。

その上で、安全性が求められる機能に限定してMC/DCを適用することによって、品質と開発コストとのバランスを取りやすくなるでしょう。

組み込みソフトの世界 トップへ戻る