Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

コード カバレッジの種類

Embedded Coder® がある場合、Simulink® Coverage™ では、ソフトウェアインザループ (SIL) モードのモデル、プロセッサインザループ (PIL) モードのモデル、およびサポートされている S-Function ブロック内のコードに関していくつかの種類のコード カバレッジ解析を実行できます。

コード カバレッジのステートメント カバレッジ

ステートメント カバレッジは、コード実行時に実行されるソース コード ステートメントの数を特定します。この種類のカバレッジを使用して、プログラム内のすべてのステートメントが 1 回以上呼び出されているかどうかを特定します。

ステートカバレッジ = (実行されたステートメントの数 / ステートメントの総数) * 100

ステートメント カバレッジの例

このコード スニペットには 5 つのステートメントが含まれています。100% のステートメント カバレッジを達成するには、少なくとも 3 つのテスト ケースが必要です。具体的には、正の x 値、負の x 値、x 値 0 のテストです。

if (x > 0)
  printf( "x is positive" );
else if (x < 0)
  printf( "x is negative" );
else
  printf( "x is 0" );

コード カバレッジの条件カバレッジ

条件カバレッジは、ソース コードに条件が含まれているステートメントを解析します。条件は、関係演算子 (<><= または >=)、等号 (!= または ==)、論理否定演算子 (!) のいずれかを含み、論理演算子 (&& または ||) を含まない C/C++ 論理式です。この種類のカバレッジは、起こり得るすべての結果に対してすべての条件が少なくとも 1 回評価されているかどうかを特定します。

条件カバレッジ = (実行された条件結果の数 / 条件結果の総数) * 100

条件カバレッジの例

次の式

y = x<=5 && x!=7;

には、次の条件が含まれています。

x<=5
x!=7

コード カバレッジの判定カバレッジ

判定カバレッジは、ソース コード内の判定を表すステートメントを解析します。判定は、論理 C/C++ 演算子 && または || のうち 1 つ以上と条件で構成される論理式です。分岐構造 (if/else、while、do-while) 内の条件は判定です。判定カバレッジは、実行中にコードが実行する判定結果の総数の割合を特定します。この種類のカバレッジを使用して、コード内の分岐を含むすべての判定がテストされるかどうかを特定します。

メモ

DO-178C 準拠の判定カバレッジの定義は、Simulink Coverage の定義とは異なっています。判定カバレッジを DO-178C に準拠させるには、演算子 && または || を含まない論理式に対し [条件判定] 構造カバレッジ レベルを選択してください。

判定カバレッジ = (実行された判定結果の数 / 判定結果の総数) * 100

判定カバレッジの例

このコード スニペットには 3 つの判定が含まれています。

y = x<=5 && x!=7;				// decision #1

if( x > 0 )					// decision #2
  printf( "decision #2 is true" );
else if( x < 0 && y )				// decision #3
  printf( "decision #3 is true" ); 
else
  printf( "decisions #2 and #3 are false" );

コード カバレッジの改良条件判定カバレッジ (MCDC)

改良条件判定カバレッジ (MCDC) は、コード実行時に判定内の条件が個々に実行される範囲です。

  • 起こり得るすべての結果に対して、判定内のすべての条件が少なくとも 1 回評価されている。

  • 判定内のすべての条件が、判定の結果に個々に影響する。

MCDC カバレッジ = (判定の結果に影響する、起こり得るすべての結果に対して評価された条件の数 / 判定内の条件の総数) * 100

改良条件判定カバレッジの例

次の判定

X || ( Y && Z )

では、次のテスト ケースのセットによって、100% の MCDC カバレッジが達成されます。

 XYZ

テスト ケース #1

001

テスト ケース #2

010

テスト ケース #3

011

テスト ケース #4

101

コード カバレッジの循環的複雑度

循環的複雑度とは、McCabe の複雑度の測定を使用した、コードの構造的複雑度の測定値です。コードの循環的複雑度を計算する際、コード カバレッジでは次の式を使用します。

c=1N(on1)

N はコード内の判定の数、on は n 番目の判定点に対する結果の数です。コード カバレッジは、C/C++ 関数ごとに、複雑度の数値に 1 を加算します。

カバレッジの例

次のコード スニペットでは、循環的複雑度は 3 です。

void evalNum(int x)
{
  if (x > 0)                          // decision #1
    printf( "x is positive" );
  else if (x < 0)                     // decision #2
    printf( "x is negative" );
  else
    printf( "x is 0" );
}

コードには 2 つの判定点をもつ 1 つの関数が含まれます。各判定点には 2 つの結果があります。前の式を使用すると、N は 2、o1 は 2、o2 は 2 です。コード カバレッジでは、これらの判定と結果をもつ式を使用し、関数に 1 を追加します。このコード スニペットの循環的複雑度は次のようになります。

c = (o1 − 1) + (o2 − 1) + 1 = (2 − 1) + (2 − 1) + 1 = 3

コード カバレッジの関係演算子の境界

関係演算子の境界のコード カバレッジでは、関係演算を含むコードを検証します。関係演算子の境界のコード カバレッジのメトリクスは、関係演算子の境界カバレッジで説明しているように、モデル カバレッジのメトリクスと一致します。モデル内の固定小数点値は、コード カバレッジの際には整数となります。

関数カバレッジ

関数カバレッジは、シミュレーション時にコードのすべての関数が呼び出されたかどうかを判定します。たとえば、コード内に一意の関数が 10 個ある場合、関数カバレッジは、シミュレーション時に 10 個すべての関数が少なくとも 1 回実行されたかどうかをチェックします。

関数呼び出しカバレッジ

関数呼び出しカバレッジは、シミュレーション時にコード内のすべての関数呼び出しサイトが実行されたかどうかを判定します。たとえば、コード内で関数が 20 回呼び出される場合、関数呼び出しカバレッジは、シミュレーション時に 20 回の関数呼び出しがすべて実行されたかどうかをチェックします。