ステートメントカバレッジについてのご質問に対する回答

ステートメントカバレッジについて、質問をいただいたので、解説しておきます。

問題の中で、ステートメントカバレッジが、
if文のすべてのルートを通る(true・false)パターンが正解という
問題が何点かありました。
ステートメントカバレッジは、if文のtrueのルートをすべて
通れば100%になるのでは無かったのでしょうか。

ステートメントカバレッジの認識を誤解されているようです。ステートメントカバレッジの「ステートメント」とはコードの「行」のことです。物理的な行と論理的な行がありますが、プログラム言語に依存しないように論理的な行で考えましょう。ステートメントカバレッジでは「分岐」を考えてはいけません。「分岐」を忘れてください。ifがtrueであろうが、falseであろうが、とにかくその行が実行されればいいのです。

if (A){     // (1)
 B;
} else {
 C;
}

(1)の例では、実行ステートメントは、A,B,Cの3行あります。論理的な行を考えているので、elseや}の行は除外します。ステートメントカバレッジはtrue側のみ、つまりA,Bの2行を通過すればいいとお考えでしょうか。それは間違いです。A,B,Cの3行を通過する必要があります。ステートメントカバレッジを網羅するためにはテストケースは2つが必要です。AがtrueとなるテストケースとAがfalseになるテストケースの2つです。

if (A){     // (2)
 ;
} else {
 C;
}

(2)の例ではどうでしょうか。論理的な行は、A,Cの2行のみです。この場合、Aがfalseになるテストケースが1つのみでステートメントカバレッジを網羅できます。

ではブランチカバレッジはどうなるでしょうか。(1)の場合には、AがtrueとなるテストケースとAがfalseになるテストケースの2つ必要です。ステートメントカバレッジと同じですね。

しかし、(2)の場合、ブランチカバレッジは、(1)の場合と同様に、AがtrueとなるテストケースとAがfalseになるテストケースの2つが必要です。ブランチカバレッジでは「行」を忘れてください。実行される行ではなく、1つの「分岐」をtrueとfalseでそれぞれ実行する必要があります。分岐の先に実行される行があるかないかは考えません。分岐の先に実行される行がなくても、そこに進むためのテストケースを必要とします。

if (A){     // (3)
 B;
}

では(3)の例ではどうでしょうか。ステートメントカバレッジを網羅できるテストケース数とブランチカバレッジを網羅できるテストケース数はお分かりですね。A,Bの実行ステートメントを通過するためには、Aがtrueとなる1つのテストケースで十分です。一方、分岐をテストするためには、必ずtrueとfalseの2つが必要ですから、テストケースは2つが必要となります。分岐の先にBなどの実行行があるかないかは見ないようにしてください。(3)は、ステートメントカバレッジを網羅するためには1つ、ブランチカバレッジを網羅するためには2つのテストケースが必要となります。

理解いただけましたでしょうか。