MC/DCカバレッジを詳しく見ていく

# はじめに
MC/DCについて触れる機会があり、備忘録のため記事にしました。
間違いがあれば指摘していただけると嬉しいです。

# カバレッジの違い
以下に代表的なカバレッジ3つと、MC/DCカバレッジについて簡単なサンプルコードやフローチャート、真理値表を用いて説明します。
``` c:サンプルコード
//判定文①
if ( A == 0 ) {
    //判定文②
    if ( B == 0 && C == 0 ) {
        process_D;
    } else {
        process_E;
    }
}
```
フローチャート：
![フローチャート.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/d43612df-7a21-41ce-b502-22356f321b49.jpeg)


***
### C0カバレッジ -命令網羅-
以下の基準を満たすようにテストを行います。
* **それぞれの命令文を少なくとも1回は実行**

![C0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/ebc7bbcd-cf8b-43f5-82ae-d8d66508bead.jpeg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/76515dd2-1e19-427f-aa5c-60abc2c6acd1.png)

フローチャート、真理値表は上記のようになります。
C0カバレッジは**命令網羅**です。
そのため、判定文①の「偽(False)」のルートは**命令**がないためテスト対象外となります。


***
### C1カバレッジ -分岐網羅-
以下の基準を満たすようにテストを行います。
* **それぞれの判定文の真偽を少なくとも1回は実行**

![C1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/f36e0859-5c12-4322-8844-47af2a026493.jpeg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/d8ca66de-f648-4ff8-a008-9c7ea3fc619f.png)

フロチャート、真理値表は上記のようになります。
C1カバレッジは**判定文(分岐)網羅**です。
そのため、すべての**判定文**をテスト対象とします。


***
### C2カバレッジ -条件網羅-
以下の基準を満たすようにテストを行います。
* **それぞれの判定文の内の各条件の真偽が、少なくとも1回は実行**

![C1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/1246bffc-efef-4fd2-bfb5-4043a2c224ae.jpeg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/8919b90b-ef0f-46d8-89aa-d844f968fa60.png)

フローチャート、真理値表は上記のようになります。
C2カバレッジは**判定文内の条件の網羅**です。
そのため、判定文①内と判定文②内の**3つの条件それぞれが「真(True)」「偽(False)」になるようにテストケースを用意する必要がある**ということです。
ちなみに今回の判定文内の条件は以下の3つになります。
```
//判定文①
A == 0

//判定文②
B == 0
C == 0
```


***
### MC/DCカバレッジ -改良条件判定網羅-
以下の基準を満たすようにテストを行います。
* 1.それぞれの判定文の真偽を少なくとも1回は実行 ⇒ **C1カバレッジ**
* 2.それぞれの判定文内の各条件の真偽が、少なくとも1回は実行 ⇒ **C2カバレッジ**
* 3.それぞれの判定文の各条件が単独で全体の判定文の結果を左右する

![MC_DC.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/10ba614d-182b-4ff4-a342-e39a85475578.jpeg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/2d9a53da-b355-4fd0-b00f-4874631c5b2f.png)

フローチャート、真理値表は上記のようになります。
上で述べた基準の**1.はC1カバレッジ**、**2.はC2カバレッジ**の内容です。
3.は条件を見るという部分ではC2カバレッジと同様ですが、条件式②に当てはめると以下のような違いがあります。
* C2：**B == 0、C == のTrue/Falseをすべて試す**
* MC/DC(Bの確認)：**Cの値を固定 → BのTrue/Falseによって結果が変わることを確認する。**
* MC/DC(Cの確認)：**Bの値を固定 → CのTrue/Falseによって結果が変わることを確認する。**

また、真理値表でTC4が不要となるのは、判定文②でどちらもFalseのパターンだからです。
**一方がFalseのテストケースで判定文への影響が保証されるため、テストを実施する必要がありません。**


***
# いろいろな判定条件で試してみる
ここから下の例は以下サイトを参考にしています。
そちらのサイト内では詳しく解説していますので、そちらをご覧いただければと思います。
https://www.gaio.co.jp/gaioclub/mc-dc/

以下に例を4つ出します。

### 比較演算( ==, =!, >=, <= )
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/cf869334-6d61-4a0c-b56f-45c715f59527.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/e6e57a45-7d32-40c9-a673-b70631be4ef9.png)

***
### OR演算
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/da6d7cd8-dc8d-4cf9-9809-bec1439d8701.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/d02dd758-dd44-41eb-b15b-de3038b923ff.png)
AとBがどちらもTrueの場合のテストケースが不要な理由は、
**単独で結果に影響を与えることが証明できない**ためです。

***

### AND演算
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/94b0a211-dff3-44a3-807b-f78b14e6f222.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/760f45b0-44c3-4e7f-bfae-a793c051569c.png)
OR演算とかぶってしまいますが、AとBがどちらもFalseの場合のテストケースが不要な理由は、**単独で結果に影響を与えることが証明できない**ためです。
***

# (A && B) || (C || D) 場合の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/90f8a5af-3cd4-464b-9675-dd099ecd2166.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4112780/18da70cf-8a0a-4f2e-bd7d-d750834f3acf.png)
テストケースは上記のようにTC2～TC5となります。
上記のテストケースでA/B/C/Dの各条件の影響を確認することができます。


# 最後に
私自身、まだMC/DCについて勉強を始めたばかりですが、
他のカバレッジと比べて「良いとこ取りをしたバランスの良いカバレッジ」だと感じています。
実際の業務では、これまでMC/DCを求められる場面に遭遇したことはありませんが、
今後もし実務で扱うことがあれば、そのときに改めて気づいたことや学びを更新していこうと思います。

最後までお読みいただき、ありがとうございました。

# 参考サイト
https://www.gaio.co.jp/gaioclub/mc-dc/
https://note.com/hashi_kazu/n/nbfea22eb9a6a
https://qiita.com/odekekepeanuts/items/8b6542467d2a0066e5af
https://dlrecord.hatenablog.com/entry/2020/04/29/201223
https://tech.nri-net.com/entry/coverage_c0_c1_c2_mcc