【メモ】ホワイトボックステストの網羅基準をいい加減覚える

# サマリ
ホワイトボックステストの４つの網羅基準について理解があいまいなので整理しました。

# 背景
IPAの情報処理試験の勉強をしているのですが、午前問題で出るホワイトボックステストの網羅基準がぼや～っとしたまま理解できていないので、
この機に整理することにしました。

:::note warn
**お断り**
個人的に調べ、理解した内容なので誤りが含まれている可能性があります。。
（その際はご指摘いただけると幸いです）
:::


# 対象読者
- IPAの試験受験をしている方
- ホワイトボックステストをする方

# ホワイトボックステストとは

[Wiki先生](https://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88)によると以下です。

> ホワイトボックステスト (英: white-box testing)は、アプリケーションの機能（ブラックボックス）ではなく、アプリケーションの内部構造をテストするソフトウェアテストの手法である。構造テストとも呼ばれる。開発したソフトウェアを中身が見える箱として扱い、内部論理を網羅的にテストする。プログラムが辿る経路をどれだけ実行したかを基準とする。

ソースコードレベルでのテストで、実装したプログラムが想定通りに動作するかという観点でのテストということですね。

[Wiki先生](https://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88)によるとホワイトボックステスト自体の設計手法には下記があるとのことです。
（今回はそれぞれを深堀はしないこととします）

> 制御フローテスト
> データフローテスト
> ブランチテスト
> ステートメントカバレッジ
> 決定範囲
> 変更された条件/決定範囲
> プライムパステスト
> パステスト

今回触れる網羅基準は、主に制御フローテスト（プログラムの処理フローが正しく実行されているか）の中で、
どこまで網羅的にチェックするかという観点で使用される基準で
主だったものとして４つあります。

# ４つの網羅基準について（本題）
というわけで前置きが長くなりましたが、それぞれについて整理したいと思います。




### 命令網羅（C0：ステートメント・カバレッジ）
すべての命令（処理）が実行されるようにテストケースを用意する考え方です。
分岐は意識せず、命令（処理）がすべて実行されることを意識するので
シンプルですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/16b75c4b-2bb2-6516-fa3d-b61471a483e4.png)


### 判定条件網羅（分岐網羅）（C1：ブランチ・カバレッジ）

今度は命令ではなく、分岐に関しての網羅性です。
各ひし形の分岐（ひし形から出ているルート）をすべて試せればOKです。
すべての分岐を通るので、分岐網羅が100%の時、命令網羅も100%になりますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/add9cbb8-03d2-4bfb-f42c-fa6ab2660378.png)


### 条件網羅（C2：コンディション・カバレッジ）
ひし形の条件部分の網羅性ですね。
ひし形の**各条件**が**少なくとも１回**は<font color="blue">true</font>, <font color="red">false</font>となるパターンを試します。（説明下手）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/131f65ce-93f0-497a-1df1-af6adf51fe7d.png)


例えば、
画像の条件A or 条件Bが
x >=1 or y >= 0

だとすると、

(x, y) = (0, 0)なら条件A:<font color="red">false</font>, 条件B:<font color="blue">true</font>
(x, y) = (1, 1)なら条件A:<font color="blue">true</font>, 条件B:<font color="red">false</font>
という二つのテストケースを用意すれば、条件Aについて<font color="blue">true</font>, <font color="red">false</font>を1回は試せていますし、条件Bも同様です。
少なくとも１回なので、例えば条件Aと条件Bが両方<font color="red">false</font>となるパターンや両方<font color="blue">true</font>となるパターンがなくても条件網羅の観点としてはOKです。
それゆえに、**条件網羅が100%→判定条件網羅や命令網羅が100%とは限らないことに注意**が必要です。

### 複合条件網羅（MCC：マルチコンディション・カバレッジ）
先ほどの条件網羅と考え方は近いですが、さらに厳しくパターンを試す考え方です。
先ほどは各条件式で少なくとも1回は<font color="blue">true</font>, <font color="red">false</font> となるケースを実行できればよかったのに対し、
こちらは条件式の組み合わせすべてを試す網羅基準です。
（単体の条件だけでなく複合的な条件を網羅するということですね）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/fe9af0d1-d70e-6e3d-18d4-dee1733813d1.png)


先ほどと同様に
条件A or 条件Bが
x >=1 or y >= 0

だとすると、

(x, y) = (0, 0)なら条件A:<font color="red">false</font>, 条件B:<font color="blue">true</font>
(x, y) = (1, 1)なら条件A:<font color="blue">true</font>, 条件B:<font color="red">false</font>
(x, y) = (1, 0)なら条件A:<font color="blue">true</font>, 条件B:<font color="blue">true</font>
(x, y) = (-1, -1)なら条件A:<font color="red">false</font>, 条件B:<font color="red">false</font>

と、true, falseの組み合わせすべてを試します。
全パターンなので、これを100%にすれば他の網羅基準はすべて100%になりますね。
ただ今回は条件式が2つだったので2×2の4パターンですが、
3つだと2×2×2の8パターン、と指数関数的に増加するのでかなりコストがかかることが予想できます。
（さらに判定条件（ひし形）の数が増えればさらに組み合わせ数は増えますね）

# まとめ
- 命令網羅は命令（処理）に着目しすべての処理を実行
- 判定条件網羅（分岐網羅）は分岐に着目しすべての分岐を実行
- 条件網羅は判定の条件式に着目し、各条件で少なくとも1回は<font color="blue">true</font>,<font color="red">false</font>を実行
- 複合条件網羅も判定の条件式に着目するが、条件の組み合わせをすべて実行

試験における各カテゴリに対してこれぐらい丁寧に整理したいのが理想ですが、
時間の制約上そうもいかないのが現実…（泣
ある程度割り切りながらも、理解がボヤっとしている内容については今後もこうやって整理したいと思います。

# 参考
参考にさせていただいたサイトです。（ありがとうございます）

https://gihyo.jp/dev/serial/01/tech_station/0003?page=2

https://tech.nri-net.com/entry/coverage_c0_c1_c2_mcc