仕様条件の境界付近は、仕様書の誤りや条件の記述ミスといった「人的ミス」などにより、欠陥が潜む可能性が高いことが経験的に分かっています。そこで、境界値を効率良くテストするために同値分割法と境界値分析でテストケースを絞り込むとともに、バグが発見しやすいテストケースを設計します。
今回はブラックボックステスト技法の一つである「境界値分析(限界値分析)」の概要と、境界付近に欠陥が潜む可能性が高い理由についてご紹介します。
また記事の後半では、境界値テストの手順と注意点についても解説しますのでぜひ最後までご覧ください。
境界値分析・同値クラス分割の基本の「き」
テスト技法「境界値分析」と「同値クラス分割」について解説しているミニ冊子です。技法の概要から使い方とポイントなど、初心者にもわかりやすく解説しております。
- もくじ
1.境界値分析(限界値分析)とは
境界値分析とは、仕様条件の境界となる値とその隣の値に対してテストする技法のことです。ソフトウェアの動作が変わる条件の境目に注目してテストを行います。
境界値に着目する理由は、境界値に欠陥が潜んでいる可能性が高いからです。
ソフトウェアでは、入力値や条件の組合せは膨大になることが多く、すべての値をテストすることはできません。
そのため、この技法を用いることで効率的に欠陥を検出することができます。主に、単体テストや結合テスト、機能確認テスト、負荷テストなどで使用される技法です。
2.境界値分析を行う前に知っておくべき「同値分割法」
同値分割法とは、対象のデータから同じ動作を行う条件の集まり(同値パーティション=同値クラス)に分類するものです。
システムが正常に作動する値を「有効同値パーティション」、エラーを検知する値を「無効同値パーティション」と言います。
それぞれのパーティションの代表値を用いてシステムが正常に作動するか、エラー作動となるのかをテストします。
例えば「パスワードの文字数は4文字以上、15文字以下」といった仕様があった場合、その同値パーティションは以下の3つが抽出できます。
・有効同値パーティション:4文字以上、15文字以下
・無効同値パーティション:0文字以上、 3文字以下
・無効同値パーティション:16文字以上
このように、テスト対象を同値パーティションに分割し、各々の同値パーティションから代表値を選び出してテストするのを、同値分割テストと呼びます。
同値分割テストの考え方は、
「代表値でテストをした場合、欠陥が見つかれば、同値パーティション内の他の値でも同じ欠陥が見つかるだろう。欠陥が見つからなければ、同値パーティション内の他の値でも同じ欠陥は見つからないだろう。」
という考え方に立ったものであり、より少ないテストケースでより広く対象範囲を網羅するという狙いがあります。
この代表値を選ぶ際、「異なる同値パーティションの境界にあたる値」と「その隣の値」の境界値を選び出すのを、境界値分析と呼びます。
また、境界値を用いてテストするのを、境界値テストと呼びます。
境界値テストを行うのは、境界値にはバグが潜在していることが多いためです。
それではなぜ、境界値にはバグが多いのか、次節でご説明いたします。
3.境界付近には欠陥が潜む可能性が高い!2つの理由
境界値とは、前章の同値分割法「異なる同値パーティションの境界にあたる値」と「その隣の値」のことを言います。
なぜ境界付近では欠陥が潜む可能性が高いのでしょうか。主な理由として以下の2点が挙げられます。
境界を表す条件に誤解が発生しやすいから
1つ目の理由は、境界を表す条件に誤解が発生しやすいからです。
境界を表す仕様の記述方法は、「~より大きい」「~より小さい」「~と同等」「以上」「以下」「未満」などさまざまなものがあります。
これにより誤解が発生しやすく、仕様にはない動作をするソフトウェアが作られてしまうことがあります。
コーディング時の条件の記述に誤りが発生しやすいから
2つ目の理由は、コーディング時の条件の記述に誤りが発生しやすいからです。
コーディングの際、境界は「=、≠、<、>」といった等号・不等号で表されます。
プログラミング言語の仕様自体を正確に理解していたとしても、タイプミスやコピペのミスにより、開発仕様書に記載されていた条件とは異なる条件をコーディングしてしまう可能性があります。
このように、境界では誤解や記述誤りが発生しやすく、それが原因で欠陥が作り込まれてしまうことが多いのです。
4.境界値テスト3つの手順
境界値テストの手順は、大きく分けて3つに分かれます。
①境界を見つける
同値クラス分割などで、動作の変わり目となる仕様条件の境界を見つけます。
この時、自然言語で表されている仕様を数直線などで図にすることが重要です。
前述しているように、境界を表す仕様の記述方法は、「~より大きい」「~より小さい」「~と同等」「以上」「以下」「未満」といった、曖昧で誤解を生じやすいものがあります。
テストする際にはその曖昧な点をしっかり整理するために、多少の手間がかかっても数直線などの図で表現し、具体的にどんな値をテストすべきか正確に把握する必要があります。
②境界値を決める
境界と隣り合う条件や値を境界値とします。
境界値は、有効同値パーティションの最小値と最大値になります。
③テストする値を決める
テストする値の候補となるのは、以下の3つです。
(i)境界値
(ii)境界値の1つ下
(iii)境界値の1つ上
上記(ii)と(iii)を省略せずにテストすれば、バグを抽出する確率は高くなりますが、効率的なテストを優先する場合には省略することもあります。
5.「隠された境界値」に注意!
前掲と同じく「パスワードの文字数は4文字以上、15文字以下」といった仕様において、その文字数をチェックするプログラムが、例えば以下のようにコーディングされたとします。
if 文字数>=4 and 文字数<=15 then
message="設定完了しました"
else
message="文字数が正しくありません"
end if
- このようにコーディングされていれば、以下の同値分割法とプログラム内部構造は一致しています。
有効同値パーティション:4文字以上、15文字以下
無効同値パーティション:0文字以上、 3文字以下
無効同値パーティション:16文字以上
このような場合では、境界値分析で代表値を選んでテストすれば、テストの網羅性は確保できます。
しかし、極端な例として以下のようにコーディングされていたらどうでしょうか。
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="登録が完了しました"
....(以下、15まで続く)
前述の説明の繰り返しになりますが、同値分割法の考え方は「代表値でテストをした場合、欠陥が見つかれば、同値パーティション内の他の値でも同じ欠陥が見つかるだろう。欠陥が見つからなければ、同値パーティション内の他の値でも同じ欠陥は見つからないだろう。」というものです。
しかし、上掲のようなコーディングでは内部に同値パーティションがいくつも存在するため、この場合は文字数が取りえるケースを全件テストしなければならないことになります。
同値分割法は、一定の根拠を持ってテスト件数を少なくするための技法で、境界値分析はバグを検出しやすい値を選び出すための技法です。
しかし、プログラムの内部構造によっては、仕様上から読み取れる内容で同値分割法・境界値分析を行ってテストしても不十分ということになります。
そのようにならないためにも、同値分割法の考え方は、テストエンジニアだけでなく、開発エンジニアにも確認してもらう必要がある、非常に重要なものなのです。
まとめ
境界値分析とは、仕様条件の境界となる値とその隣の値に対してテストする技法のことです。ソフトウェアの動作が変わる条件の境目に注目してテストを行います。
境界値分析を行う上で知っておきたい「同値分割法」は、「代表値でテストをした場合、欠陥が見つかれば、同値パーティション内の他の値でも同じ欠陥が見つかるだろう。欠陥が見つからなければ、同値パーティション内の他の値でも同じ欠陥は見つからないだろう。」という考え方に立ったものです。
仕様上の同値クラスとプログラムの内部構造が一致していない場合には、注意が必要です。
境界付近では、仕様書の誤解や記述誤りなどが発生しやすく、それが原因で欠陥が作り込まれてしまいます。
そのため、境界値分析を行うことにより、境界付近の欠陥を効率的に検出する必要があります。
図:ソフトウェアテストの教科書(著 石原一宏・田中英和)より引用