ソフトウェアテスト技法を学ぶ ～ 同値分割法と境界値分析

:::note info
この記事は筆者の学習をまとめたものです。
:::

# ソフトウェアテストテストを学ぼう

- 開発者も積極的にテストをしよう
- テスト専門家とコミュニケーションできるようになろう

という考えでソフトウェアテスト技法について学んでいきます。

- 同値分割法と境界値分析（本記事）
- [デシジョンテーブル](https://qiita.com/blue32a/items/add0dfdc24c447a5c15c)
- [状態遷移テスト](https://qiita.com/blue32a/items/ffa33b7e812b2d8d971e)
- [組み合わせテスト](https://qiita.com/blue32a/items/f6c4ee2db82be8ed8e5c)

# 同値分割法と境界値分析とは？

同値分割法と境界値分析はソフトウェアテスト技法の中でも基本的な技法です。
これらの技法はブラックボックステストに分類されます。

## ブラックボックステストとは？

> ”ブラックボックステストは、内部構造や動作を覗き見することなく、アプリケーションの機能を調べるソフトウェアテストの手法のこと。アプリケーションを見えない箱として扱い、入力と結果の整合性を確認する。”[^1]

[^1]:https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88

> ”テスト対象が処理を **どのように（how）** 行うべきか、ということではなく、 **何（what）** をすべきか、ということが検証される。”[^2]

[^2]:『単体テストの考え方/使い方』

つまりブラックボックステストはテスト対象の**振る舞い**をテストします。
逆にホワイトボックステストは内部構造に注目したテストで、それと比較すると、ブラックボックステストは**リファクタリングへの耐性**を備えることになります。内部構造に注目していないので、リファクタリングしてもテストが壊れにくい、というわけです。

# テスト技法：同値分割法

同値分割は、同じ結果となる入力値を**同値クラス**という部分集合に分割し、その同値クラスの値を等価とみなします。

例として次のようなプログラムをテストするとします。

:::note info
年齢を入力して、選挙権を持つかどうかを判定するプログラム。
年齢は整数以外は入力できないものとし、有効な範囲を0～150とする。
:::

選挙権を持つ年齢のテストケースを考えると、日本では18歳以上が選挙権を持つことになるので、入力値18, 19, 20, 21...と多くのテストケースが作られます。
ここで同値分割法を使うと、18以上の入力値が同値クラスとして等価（18でも50でも80でも同じ）になるので、代表値としてどれか１つのテストケースで済みます。選挙権を持たない年齢（18歳未満）のケースも同様です。

また、無効となる年齢の範囲（-1以下と151以上）があります。これも通常だと膨大な数のテストケースになりますが、２つの**無効同値クラス**とすることで、それぞれの代表値だけのテストケースで済みます。

まとめると、全部で４つのテストケースになります。

| No. | データ（年齢） | 期待する結果 | データを選択した理由 |
|:-:|:-:|:-:|:-:|
| 1 | 10 | 選挙権を持たない | 選挙権を持たない年齢の代表値 |
| 2 | 50 | 選挙権を持つ | 選挙権を持つ年齢の代表値 |
| 3 | -10 | 無効 | 無効になる年齢-1以下の代表値 |
| 4 | 160 | 無効 | 無効になる年齢150以上の代表値 |

しかし、同値分割法だけでは十分なテストケースが作成できないので、次の境界値分析と合わせてテストケースを作成します。

# テスト技法：境界値分析

境界値分析は「◯◯以上」や「◯◯未満」などの値の境界となるところをテストする技法です。前述の同値分割法と一緒に使い、同値クラスの境界についてテストケースを作成します。

先程と同じ「年齢（整数）を入力して、選挙権を持つかどうかを判定するプログラム」例で考えます。
同値クラス「選挙権を持たない年齢」と「選挙権を持つ年齢」の境界は17と18です。
また無効同値クラス「年齢-1以下」と「選挙権を持たない年齢」の境界、無効同値クラス「年齢150以上」と「選挙権を持つ年齢」の境界を合わせると次の６つのテストケースが作成できます。

| No. | データ（年齢） | 期待する結果 | データを選択した理由 |
|:-:|:-:|:-:|:-:|
| 1 | -1 | 無効 | 無効になる年齢-1以下の境界値 |
| 2 | 0 | 選挙権を持たない | 選挙権を持たない年齢の境界値（下限） |
| 3 | 17 | 選挙権を持たない | 選挙権を持たない年齢の境界値（上限） |
| 4 | 18 | 選挙権を持つ | 選挙権を持つ年齢の境界値（下限） |
| 5 | 150 | 選挙権を持つ | 選挙権を持つ年齢の境界値（上限） |
| 6 | 151 | 無効 | 選挙権を持つ年齢の境界値（下限） |

# 同値分割法と境界値分析を合わせたテストケース

それぞれで作成したテストケースを合わせてみましょう。

| No. | データ（年齢） | 期待する結果 | データを選択した理由 |
|:-:|:-:|:-:|:-:|
| 1 | -10 | 無効 | 無効になる年齢-1以下の代表値 |
| 2 | -1 | 無効 | 無効になる年齢-1以下の境界値 |
| 3 | 0 | 選挙権を持たない | 選挙権を持たない年齢の境界値（下限） |
| 4 | 10 | 選挙権を持たない | 選挙権を持たない年齢の代表値 |
| 5 | 17 | 選挙権を持たない | 選挙権を持たない年齢の境界値（上限） |
| 6 | 18 | 選挙権を持つ | 選挙権を持つ年齢の境界値（下限） |
| 7 | 50 | 選挙権を持つ | 選挙権を持つ年齢の代表値 |
| 8 | 150 | 選挙権を持つ | 選挙権を持つ年齢の境界値（上限） |
| 9 | 151 | 無効 | 選挙権を持つ年齢の境界値（下限） |
| 10 | 160 | 無効 | 無効になる年齢150以上の代表値 |

合わせて10のテストケースが作成されました。
このようにテスト技法を活用することで、可能な限り少なく、かつ効果的なテストケースを作成することができます。

# まとめ

- 同値分割法と境界値分析は基本的なソフトウェアテスト技法で、振る舞いをテストするブラックボックステストに分類される
- 同値分割法は、同じ結果となる入力値を等価とみなしてテストする技法
- 境界値分析は、値の境界となるところをテストする技法
- 同値分割法と境界値分析を合わせると効果的
- 最小限かつ効果的なテストケースを作成するために、テスト技法を活用する

# 参考

https://gihyo.jp/book/2020/978-4-297-11061-1

https://www.shoeisha.co.jp/book/detail/9784798130606