同値分割・境界値分析の解説

<h2 class="cegtest">同値分割とは</h2>
同値分割は、さまざまなテストフェーズで利用できるブラックボックステスト技法の一つです。テスト結果（ソフトウェアの振る舞い）をグループ分けし、それぞれのテスト結果になる代表的なテスト条件を選択してテストします。言い換えれば、すべてのテストをするのではなく代表的なテストをすればよい、という考え方です。一般的にはテスト技法の基礎といわれています。

本来はテスト結果（数学的な表現をすると値域）に着目するテスト技法ですが、ここではテスト条件（数学的な表現をすると定義域）に着目する方法を解説します。

同値分割は大きく5つの作業に分けられます。
<ol>
 	<li style="font-weight: bold;">同値クラスを作る</li>
 	<li style="font-weight: bold;">同値クラスを分類する</li>
 	<li style="font-weight: bold;">代表値を決定する</li>
 	<li style="font-weight: bold;">テスト条件を決定する</li>
 	<li style="font-weight: bold;">テスト条件を見直す</li>
</ol>
5つの作業を解説するために、以下のような入力フォームのテストを考えてみましょう。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/795316b92fc766b0181f6fef074f03fa.jpg"><img class="aligncenter size-full wp-image-181" src="https://softest.jp/docs/wp-content/uploads/2017/05/795316b92fc766b0181f6fef074f03fa.jpg" alt="" width="576" height="116" /></a>

メールアドレスは「ローカルパート@ドメインパート」で構成される。
ローカルパートは2文字以上50文字以下の半角英数字と記号。
使用可能な記号は-_.のみとする。
ドメインパートはローカルパートと同様の文字で有無のみ確認する。
メールアドレスが仕様に合致し、2つの入力文字列が一致した場合は正常とする。
<h2 class="cegtest">同値クラスを作る</h2>
テスト結果をグループ分けすることをここでは「同値クラスを作る」といいます。通常、グループ分けの基準は一通りではなく複数あります。その基準をここでは「観点」といいます。上記のメールアドレスについては、例えば「アットマークの数」「文字種別」「文字数」「記号の有無」「メールアドレスの一致性」などの観点を挙げることができます。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/2b530e80c7d0de90885e285c5d798063.jpg"><img class="aligncenter size-full wp-image-185" src="https://softest.jp/docs/wp-content/uploads/2017/05/2b530e80c7d0de90885e285c5d798063.jpg" alt="" width="529" height="203" /></a>
<h2 class="cegtest">同値クラスを分類する</h2>
同値クラスには、それらが影響を及ぼすテスト結果によって「有効同値クラス」「無効同値クラス」に分類できます。有効同値クラスは、そのテスト結果を正常系にするであろう同値クラスをいいます。一方で、無効同値クラスは、そのテスト結果を準正常系・異常系にするであろう同値クラスをいいます。なお、正常系・準正常系・異常系は<a href="http://softest.jp/?p=120" target="_blank" rel="noopener noreferrer">以下</a>のような使い方をしています。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/c8856789ec11ab8b1013037cef6929f9.jpg"><img class="aligncenter size-full wp-image-188" src="https://softest.jp/docs/wp-content/uploads/2017/05/c8856789ec11ab8b1013037cef6929f9.jpg" alt="" width="442" height="207" /></a>
<h2 class="cegtest">代表値を決定する</h2>
それぞれの観点に対して、有効同値クラスと無効同値クラスが何であるかを考えた後は、実際にテストする時をイメージして、テスト条件を決定します。具体的には数値であったり、文字列であったり、選択肢であったりします。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/3a4f695a458cb0ac0aceaa2eb13ac2dd-1.jpg"><img class="aligncenter size-full wp-image-193" src="https://softest.jp/docs/wp-content/uploads/2017/05/3a4f695a458cb0ac0aceaa2eb13ac2dd-1.jpg" alt="" width="627" height="248" /></a>
<h2 class="cegtest">テスト条件を決定する</h2>
観点が一つの場合は、決定した代表値をそのままテスト条件とします。観点が複数ある場合は、<strong>無効同値クラスが重ならないように</strong>テスト条件を組み合わせてテスト条件とします。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/f96d9b4281f6d16b3c7589aed5a17be5-1.jpg"><img class="aligncenter size-full wp-image-195" src="https://softest.jp/docs/wp-content/uploads/2017/05/f96d9b4281f6d16b3c7589aed5a17be5-1.jpg" alt="" width="775" height="331" /></a>

テスト番号1はすべての観点で有効同値クラスの代表値を選択しています。テスト番号2～3はアットマークという観点で無効同値クラスの代表値を選択し、テスト番号4～5はローカルパート文字列という観点で無効同値クラスの代表値を選択しています。以下、同じようにそれぞれの観点で代表値を選択しながら、テスト条件を並べていきます。
<h2 class="cegtest">テスト条件を見直す</h2>
前述の4つの作業、テスト実施するための情報はほとんど揃っています。最後に、これらの情報を整理したり、修正したり、追加したりします。ここではこの作業を「見直し」といいます。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/94ed160662be198949535a112047e9b4.jpg"><img class="aligncenter size-full wp-image-196" src="https://softest.jp/docs/wp-content/uploads/2017/05/94ed160662be198949535a112047e9b4.jpg" alt="" width="778" height="131" /></a>

例えば、ローカルパート文字列が1文字であって、文字列として「test」を含むことは不可能です。そこで、このテスト条件では何を確認したいのかを思い出してみます。確認したいのは「<strong>ローカルパートが1文字ではいけないので、エラー処理となるかどうか</strong>」です。従って、ローカルパートが1文字であることは維持しながら、文字を「_」であったり「t」といった条件に修正します。あるいは、文字列を「_」の場合と「t」の場合の2回分に追加するのもよいです。

例えば、「ドメインパートがない」という無効同値クラスを参考にして「ローカルパートがない」という無効同値クラスが気になるかもしれません。その場合は、ローカルパート文字数にもう一つ無効同値クラスを追加します。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/f4a1b0aed5dc02442c433030ff24c031.jpg"><img class="aligncenter size-full wp-image-197" src="https://softest.jp/docs/wp-content/uploads/2017/05/f4a1b0aed5dc02442c433030ff24c031.jpg" alt="" width="629" height="132" /></a>

このように4つの作業で作成したテスト条件を見直し、必要であれば1～4の作業を繰り返します。見直しの方法としては、セルフレビューやピアレビューの他、テスト実施と並行する場合もあります。特にテスト実施が自動化されている場合は、テスト実施と並行しやすいです。

また、同値クラスの分け方の粒度を変えたり（ズームイン・ズームアウト）、二つ以上の観点を複合的にとらえて新しい観点としたり、メールアドレスに関するドメイン知識を活用した観点を追加したり、プロジェクトに合わせた工夫をするとよいでしょう。

<hr />

繰り返しになりますが、同値分割の結果から得られるテスト条件は一通りではありません。参考までに上記の解説に沿った手順で作成したテスト条件を以下に示します。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/8aa09ea6d7822fbb10331635d428d488.jpg"><img class="aligncenter size-full wp-image-198" src="https://softest.jp/docs/wp-content/uploads/2017/05/8aa09ea6d7822fbb10331635d428d488.jpg" alt="" width="923" height="414" /></a>

<hr />

<h2 class="cegtest">境界値分析とは</h2>
境界値分析は、前述の同値分割と関わりが深いテスト技法です。同値分割で得られた同値クラスの境界や端、その近くに注目してテスト条件を考えるブラックボックステスト技法の一つです。テスト設計で同値分割を活用する大きな理由は、効率的にバグを見つけるためですが、境界値分析を活用する大きな理由は、効果的にバグを見つけるためです。

一般的には「境界値にバグが多く存在する」と言われていますが、境界値のそばにもバグは多く存在し、未知の境界や余分な境界が引き起こすバグも少なくありません。ここでは、これら3つの注目ポイントに沿って解説します。

繰り返しになりますが、同値分割と境界値分析は関わりが深いテスト技法のため、前述の入力フォームを例に解説します。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/795316b92fc766b0181f6fef074f03fa.jpg"><img class="aligncenter size-full wp-image-181" src="https://softest.jp/docs/wp-content/uploads/2017/05/795316b92fc766b0181f6fef074f03fa.jpg" alt="" width="576" height="116" /></a>

メールアドレスは「ローカルパート@ドメインパート」で構成される。
ローカルパートは2文字以上50文字以下の半角英数字と記号。
使用可能な記号は-_.のみとする。
ドメインパートはローカルパートと同様の文字で有無のみ確認する。
メールアドレスが仕様に合致し、2つの入力文字列が一致した場合は正常とする。
<h2 class="cegtest">境界値のバグ</h2>
ローカルパートの文字数という観点で「2文字以上50文字以下の半角英数字と記号」という仕様から、同値クラスを4つ作りました。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/f36fc0458607842cbf0775516687491b.jpg"><img class="aligncenter size-full wp-image-200" src="https://softest.jp/docs/wp-content/uploads/2017/05/f36fc0458607842cbf0775516687491b.jpg" alt="" width="630" height="49" /></a>

文字数のような連続性を持つ同値クラスの場合は、「数直線」のようなモデルを描くとわかりやすいです。2文字は有効同値クラスに最小値として属し、50文字も有効同値クラスに最大値として属します。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/e99cc3808964d9e08ec8fb27d43842de.jpg"><img class="aligncenter size-full wp-image-201" src="https://softest.jp/docs/wp-content/uploads/2017/05/e99cc3808964d9e08ec8fb27d43842de.jpg" alt="" width="527" height="82" /></a>

有効同値クラスの最大値および最小値が存在する場合、それらを「<strong>onポイント</strong>」と呼び、テストすべきです。数学的には最大値（あるいは最小値）が存在しない場合もありますが、その場合は上界（あるいは下界）の最小値（あるいは最大値）をonポイントと考えて、テストするとよいでしょう。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/b1db37a1df6c6332fc8bdf704e9d1e49.jpg"><img class="aligncenter size-full wp-image-202" src="https://softest.jp/docs/wp-content/uploads/2017/05/b1db37a1df6c6332fc8bdf704e9d1e49.jpg" alt="" width="528" height="86" /></a>
<h2 class="cegtest">境界値近くのバグ</h2>
境界地近くのバグについても、同様にローカルパート文字数という観点で解説します。有効同値クラス（2文字以上50文字以下）と無効同値クラス（51文字以上）はonポイント（50文字）で接しています。無効同値クラスの中でonポイントに最も近い値を「<strong>offポイント</strong>」と呼び、テストすべきです。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/1249f2682be7181f6a6266c99ee5cae6.jpg"><img class="aligncenter size-full wp-image-203" src="https://softest.jp/docs/wp-content/uploads/2017/05/1249f2682be7181f6a6266c99ee5cae6.jpg" alt="" width="526" height="107" /></a>
<h2 class="cegtest">未知の境界と余分な境界</h2>
onポイントとoffポイントをテストすることで、同値クラスの境界値とその近くに存在するバグを見つける手助けになります。
境界が含まれるか含まれないかの誤り（閉包バグ, closure bug）は、onポイントのテストで見つけられます。境界が仕様よりもずれてしまう誤り（境界移動, boundary shifted right / left）は、onポイントあるいはoffポイントのテストで見つけられます。想定していた境界が存在しないという誤り（境界抜け, missing boundary）は、onポイントとoffポイントのテスト結果によって発見できます。

ボーリス・バイザーは著書の中で、境界値テストとして「<strong>inポイント</strong>（内部点）」「<strong>outポイント</strong>（外部点）」を推奨しています。これらは、有効同値クラスの内側にある任意の点をinポイント、外側にある任意の点をoutポイントとしており、余分な境界を見つける効果があると記されています。同値分割の代表値としてこれらのinポイントとoutポイントを追加するとよいでしょう。

https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%83%86%E3%82%B9%E3%83%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%BC%E3%83%AA%E3%82%B9-%E3%83%90%E3%82%A4%E3%82%B6%E3%83%BC/dp/4822280179?SubscriptionId=AKIAIOM2CPSJ242Q4GRA&tag=softest-22&linkCode=xm2&camp=2025&creative=165953&creativeASIN=4822280179

<hr />

参考までに上記の解説に沿った手順で作成したテスト条件を以下に示します。

<a href="https://softest.jp/docs/wp-content/uploads/2017/05/ad328257df3c27d0237be29c2f1fd87c.jpg"><img class="aligncenter size-full wp-image-204" src="https://softest.jp/docs/wp-content/uploads/2017/05/ad328257df3c27d0237be29c2f1fd87c.jpg" alt="" width="831" height="463" /></a>

※この記事は <a href="http://wacate.jp/2009/winter/program.html" target="_blank" rel="noopener noreferrer">WACATE2009 冬のテスト技法セッション</a>を参考にしています。
※この記事は<a href="https://softest.jp/?p=178" target="_blank">「同値分割・境界値分析の解説」</a>を複製して作成しています。