コラム

  • 2021.07.27
  • ソフトウェアテスト
  • #テスト技法
  • #基礎知識

テストケースを作成する手法「境界値分析」について解説

限られた時間や予算のなかでテストを行う際には、パターンに漏れなく、網羅性を確保しつつ効率よくテストケースを作成できるかがポイントになります。
例えば、ブラックボックステストで最もよく使われる技法には、「同値クラス分割」と「境界値分析」がありますが、一般的にこれら2つの技法は組み合わせて使われます。
仕様条件の境界付近は欠陥が潜む可能性が高いため、そこを効率良くテストするために「同値クラス分割」と「境界値分析」で絞り込み、不具合を発見しやすいテストケースを設計します。
今回は境界値分析の概要と、境界値テストでおさえておきたいポイントについてご紹介します。

境界値分析とは

境界値分析とは、仕様条件の境界となる値とその隣の値に対してテストする技法のことです。境界値とは、ある範囲の最小値または最大値などの同値分割した領域の端にあたる値です。具体的には「未満」や「以下」などが該当し、こういった境界部分は、間違いを引き起こしやすく、不具合が潜んでいる可能性が高いとされます。
境界値を狙ってテストすることで、仕様の認識ミスや実装ミスによる不具合を検出できます。

境界値テストのために知っておきたい「同値クラス分割」

境界値テストを理解するうえで知っておきたい同値クラス分割とは、出力が同等になると想定される入力値のグループ(同値クラスや同値パーティション)を識別し、各グループに対するテストケースを作成する技法のことです。
システムが正常に作動する値を「有効同値クラス」、エラーを検知する値を「無効同値クラス」といいます。それぞれのクラスの代表値を用いてシステムが正常に作動するか、エラーに作動するのかをテストします。

例えば、画面上から日付(年月日)を入力するシステムで、年月日のうちの「月」の値を入力する場合について考えてみましょう。

このシステムでは、入力値は整数で与えられるものとし、1から12までの場合は「有効」な値、0以下もしくは13以上の場合は「無効」な値としてチェックされるものとします。
この場合、月の入力値の同値クラスは以下の3つが抽出分類できます。
・無効同値クラス:0以下の整数
・有効同値クラス:1から12までの整数
・無効同値クラス:13以上の整数

このように同値クラスに分割したあとで、各同値クラスからテストで使う値を選択してテストをすることを同値クラステストとよびます。
このとき、適当な個数の値を選んだのでは、同値分割をした意味がありませんので、テストの入力値としては各同値クラスのなかから少なくとも1個の代表値を選ぶ必要があります。

この代表値を選ぶ際、「異なる同値クラスの境界にあたる値」と「その隣の値」の境界値を選び出すことを境界値分析、境界値を用いてテストすることを、境界値テストとよびます。

仕様書インスペクション 講座

境界値テストの流れ

境界値テストの手順は、大きく以下の3つにわかれます。
1.境界を見つける
2.境界値を決める
3.テストする値を決める

まず1つ目に同値クラス分割で、動作の変わり目となる仕様条件の境界を見つけます。
この時、境界をあらわす仕様の記述方法は、「~より大きい」、「~より小さい」、「~と同等」、「以上」、「以下」、「未満」といった、曖昧で誤解を生じやすい箇所を数直線などの図で表現し、具体的にどんな値をテストすべきか正確に把握する必要があります。

数直線のイメージ図

2つ目に境界値を決めます。境界と隣り合う条件や値を境界値とし、境界値は、有効同値クラスの最小値と最大値になります。

境界値の有効同値クラスの最小値と最大値のイメージ図

3つ目にテストする値を決めます。テストする値の候補となるのは、以下の3つの値です。
(i)境界値
(ii)境界値の1つ下
(iii)境界値の1つ上

境界値、境界値の1つ上、1つ下のイメージ図

境界値テストでおさえておきたい3つのポイント

境界値テストをするうえでおさえておきたいポイントが3つあります。

まず1つ目は「表現」です。境界を表す仕様の記述方法は、「~より大きい」、「~より小さい」、「~と同等」、「以上」、「以下」、「未満」などさまざまなものがあります。この境界をあらわす表現方法を注意深く定義しないと、意味の誤解が発生してしまう可能性があります。

2つ目は「複製や転記」です。コーディングの際、境界は「=、≠、<、>」といった等号・不等号であらわされ、プログラミング言語の仕様自体を正確に理解していたとしても、タイプミスやコピペのミスが生じる場合があります。それにより、開発仕様書に記載されていた条件とは異なる条件をコーディングしてしまう可能性があり、結果、コーディング時の条件の記述に誤りが発生してしまいます。

3つ目は「網羅性」です。少しわかりにくいかもしれませんので、例を用いて説明します。
例えば、「パスワードの文字数は5文字以上、16文字以下」といった仕様において、その文字数をチェックするプログラムを以下のようにコーディングしたとします。

例1
if 文字数>=5 and 文字数<=16 then
 message="登録が完了しました"
else
 message="文字数が正しくありません"
end if

このようにコーディングされていれば、以下の同値クラス分割とプログラム内部構造は一致し境界値分析で代表値を選んでテストすれば、テストの網羅性は確保できます。
・有効同値クラス:5文字以上、16文字以下
・無効同値クラス:0文字以上、4文字以下
・無効同値クラス:17文字以上

しかし、極端な例として以下のようにコーディングされていたとします。

例2
if 文字数=0 then
 message="文字数が正しくありません"
end if
if 文字数=1 then
 message="文字数が正しくありません"
end if
if 文字数=2 then
 message="文字数が正しくありません"
end if
if 文字数=3 then
 message="文字数が正しくありません"
end if
if 文字数=4 then
 message="文字数が正しくありません"
end if 
if 文字数=5 then
 message="登録が完了しました"
end if
if 文字数=6 then
 message="登録が完了しました"
end if
・・・・・(以下省略)7から16までつづきます。

このようなコーディングでは内部に同値クラスがいくつも存在するため、文字数が取りうるケースを全件テストしなければならなくなり、仕様上から読み取れる内容で同値クラス分割・境界値分析を行ってテストをしたとしても不十分ということになり、境界値テストをするうえで注意が必要だということになります。

仕様書インスペクション 講座

まとめ

同値クラス分割は、一定の根拠をもってテスト件数を少なくする技法で、境界値分析は不具合を検出しやすい値を選び出すための技法です。

仕様上の同値クラスとプログラムの内部構造が一致していない場合や仕様書の誤解や記述の誤りなどの注意点を踏まえ、いかに効率よく不具合を発見できるかが、より品質の高いプログラム開発につながるといえます。

みなさんも、テストケースを作成する際には、この記事でご紹介した境界値テストのポイントをおさえて設計してみてください。

資料ダウンロード/動画視聴

ソフトウェアテスト入門動画

テスト計画入門動画

SHIFTサービス資料

テストサービス導入事例集

関連サービス