このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
コード カバレッジの種類
Embedded Coder® がある場合、Simulink® Coverage™ では、ソフトウェアインザループ (SIL) モードのモデル、プロセッサインザループ (PIL) モードのモデル、およびサポートされているカスタム コード ブロック内のコードに関していくつかの種類のコード カバレッジ解析を実行できます。
ステートメント カバレッジ
ステートメント カバレッジは、コード実行時に実行されるソース コード ステートメントの数を測定します。この種類のカバレッジを使用して、プログラム内のすべてのステートメントが 1 回以上呼び出されているかどうかを特定します。
ステートメント カバレッジの割合は次の方程式で表されます。
ステートカバレッジ = (実行されたステートメントの数 / ステートメントの総数) * 100
ステートメント カバレッジの例
このコード スニペットには 5 つのステートメントが含まれています。100% のステートメント カバレッジを達成するには、正の x 値のテスト、負の x 値のテスト、x 値 0 のテストが少なくとも 1 つずつ必要です。
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;
には、次の 2 つの条件が含まれています。
x<=5 x!=7
100% の条件カバレッジを達成するには、テスト ケースが両方の条件について真と偽の結果を示す必要があります。たとえば、x が 4
に等しいテスト ケースは両方の条件について真のケースを示し、x が 7 に等しいケースは両方の条件について偽のケースを示します。
boolean 代入ステートメント
コード カバレッジでは、ブール値が含まれている代入ステートメントが解析され、そのステートメントが条件としてレポートされます。モデル カバレッジでは、代入ステートメント内の論理式、つまり logical AND
(&&
) や logical OR
(||
) などの論理演算子が含まれている式のみが解析されます。この違いのため、モデルとコード カバレッジの結果に不一致が生じることがあり、場合によってはコード カバレッジ解析で達成されない条件結果が得られることがあります。
たとえば、以下のようなステートメントについて考えてみます。
bool A = true;
コード カバレッジ解析時に、Simulink Coverage は条件カバレッジでこのステートメントを解析します。このステートメントはすべてのタイム ステップで真であり、偽のケースが発生することがないため、結果としてこのステートメントでは 50% の条件カバレッジが得られます。モデル カバレッジではこのステートメントを解析しないため、モデル カバレッジの結果とコード カバレッジの結果に不一致が生じることにもなります。
判定カバレッジ
判定カバレッジは、ソース コード内の判定を表すステートメントを解析します。判定は、論理 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" );
100% の判定カバレッジを達成するには、テスト ケースが各判定について真と偽の結果を示す必要があります。
改良条件判定カバレッジ (MCDC)
改良条件判定カバレッジ (MCDC) は、実行時に判定内の条件が判定結果に個々に影響するかどうかを解析します。100% の MCDC を達成するには、テスト ケースが以下を示す必要があります。
起こり得るすべての結果に対して、判定内のすべての条件が少なくとも 1 回評価されている。
判定内のすべての条件が、判定の結果に個々に影響する。
MCDC の割合は次の方程式で表されます。
MCDC カバレッジ = (判定の結果に影響する、起こり得るすべての結果に対して評価された条件の数 / 判定内の条件の総数) * 100
改良条件判定カバレッジの例
次の判定
X || ( Y && Z )
では、次のテスト ケースのセットによって、100% の MCDC カバレッジが達成されます。
X | Y | Z | |
---|---|---|---|
テスト ケース #1 | 0 | 0 | 1 |
テスト ケース #2 | 0 | 1 | 0 |
テスト ケース #3 | 0 | 1 | 1 |
テスト ケース #4 | 1 | 0 | 1 |
条件 Y
および Z
が判定結果に個々に影響できることを示すには、条件 X
がこれらのテスト ケースについて偽でなければなりません。条件 X
が真である場合、判定は真であることが既知です。したがって、条件 Y
および Z
は判定結果に影響しません。
循環的複雑度
循環的複雑度は、McCabe の複雑度の測定を使用して、コードの構造的複雑度を測定します。コードの循環的複雑度を計算する際、コード カバレッジでは次の式を使用します。
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 回の関数呼び出しがすべて実行されたかどうかをチェックします。