はじめに
ソフトウェアテストのテクニックについて紹介する本連載ですが、今回もテストケースの作成に使えるテクニックを紹介します。限られた時間、予算の中でテストを行う際には、パターンを漏れなくダブりなく分析し、網羅性を確保しつつ効率よくテストケースを作成できるかがポイントになります。今回は、前回(第3回)のホワイトボックステストに続き、もう1つの代表的なテストケース作成技法「ブラックボックステスト」について紹介します。
ブラックボックステストとは?
ブラックボックステストとは、テスト対象の「仕様」に基づいたテストケースの作成技法です。
前回紹介した「ホワイトボックステスト」が、テスト対象の内部の「構造」、たとえばソースコードのロジックに着目してテストケースを作成するのに対し、ブラックボックステストでは、テスト対象を「中の見えない箱(ブラックボックス)」としてとらえてテストケースを作成します。具体的には、テスト対象に対してある入力を与えた場合にどのような出力が返ってくるか(または状態が変化するか)という点に着目してテストケースを作成します。このとき、テスト対象の中がどのように実装され、どのように処理が実行されているかは気にしません。
ブラックボックステストで最もよく使われる技法には「同値分割法」と「境界値分析」があり、一般的にこれら2つの技法は組み合わせて使われます。以降では、これらの技法を使って、具体的にテストケースをどのように作成するかを見ていきましょう。
同値分割法
同値分割法とは、仕様からデータを“意味のあるグループ”(同値クラス)に分類し、各グループから代表値を選ぶ技法です。この技法により、同じような意味を持つデータばかりに偏ったテストケースになることが避けられます。つまり、冗長なテストケースを省くことができ、効率よくテストが実施できるのです。また、意味のあるデータに関するテスト漏れを防ぐことも可能です。
例として、画面上から日付(年月日)を入力するシステムで、年月日のうちの「月」の値の入力について考えてみましょう。このシステムでは、入力値は整数で与えられるものとし、1から12までの場合は「有効」な値、0以下もしくは13以上の場合は「無効」な値としてチェックされるものとします。この場合、月の入力値は次の同値クラス(同じ出力結果が得られる入力値のグループ)に分類できます。
- 無効同値クラス1:0以下の整数(有効範囲より小さく無効)
- 有効同値クラス :1から12までの整数
- 無効同値クラス2:13以上の整数(有効範囲より大きく無効)
また、入力として整数以外が考えられる場合は、小数や文字列、記号などもそれぞれ同値クラスとします。
このように同値クラスに分割した後、各同値クラスからテストで使う値を選択します。このとき、適当な個数の値を闇雲に選んだのでは、同値分割した意味がありません。テストの入力値としては各同値クラスの中から(少なくとも)1個の代表値を選びます。代表値の選び方には明確なルールはありませんが、「この値でテストが通ればその同値クラスは全部OK」と言えるような値を選ぶべきで、それは同値クラスの範囲内でも端のほうにある値よりは、真ん中付近にある値を使うのが確実でしょう。たとえば、先ほどの例での有効同値クラスの代表としては、真ん中あたりの6や7を選ぶとよいでしょう。
このように、同値分割法を使うことで、ある同値クラスのみに偏ったテストばかりをしてしまうことを防ぐことができるとともに、少ないテストケースで対象範囲を網羅することができます。
境界値分析
境界値分析とは、同値クラスの間の境界の値(境界値)をテストデータとして選択する技法です。一般的に、先ほどの同値分割を行った後に使います。先ほどの「月」の値の入力の例を用いて説明しましょう。この例では、次の2ヵ所の境界値があります。
- (1) 無効同値クラス1と有効同値クラスの境界
- 無効同値クラス1における境界値 … 0
- 有効同値クラスにおける境界値 … 1
- (2) 無効同値クラス2と有効同値クラスの境界
- 無効同値クラス2における境界値 … 13
- 有効同値クラスにおける境界値 … 12
こうして、境界値分析を適用することで、「0, 1, 12, 13」の4つのテストデータが抽出されました。
なぜ境界上の値を選択するかというと、経験的に設計や製造(コーディング)では、境界付近で間違い(判断ミスや記載ミスなど)が生じる可能性が高いため、境界付近をテストすることで、その間違いに基づくバグ(欠陥)を発見しやすいからです。
先ほどの例で、月の値の内部的なチェックロジックが、本来は
となるべきところを、
という条件文に間違えてしまった場合、入力値1と12は無効と判断されてしまいます。
このようにソースコード上の不等号の記述ミスや、設計書での「以上」「以下」「未満」などの記述ミスや解釈ミスなどが原因となって、境界付近にバグが発生するのです。
同値分割法と境界値分析の組み合わせ
境界値は同値クラス同士の境界部分に存在しますが、必ずどちらかの同値クラスの中に含まれます。先ほどの例では、有効同値クラスから選んだ値は、同値クラスの代表値と2つの境界値をあわせて3つになりました。
確実にテストをしたい場合や高い品質が要求される場合は、これらすべてを使うべきですが、テストの工数や期間の都合でテストケースをさらに減らさなければならない場合もあります。そのとき、「境界値を使ったテストがOKなら代表値を使ったテストもOKとみなせる」のであれば、代表値を使ったテストを省略しても構わないでしょう。少ないテストケースでバグを多く見つけるのがよいテストですから、その意味でも境界値のほうが優先度が高くなります。
ホワイトボックステストとブラックボックステストの組み合わせ
境界値分析の例で取り上げた不等号の記述ミスは、前回紹介したホワイトボックステストでは見つけることができません。なぜなら、ホワイトボックステストはソースコードのパスを追っていくので、不等号として「>」が正しいのか「≧」が正しいのかはソースコードからは判断できないからです。強いて言えば、ソースコードレビューで設計書とソースコードの対応関係を正確に見ていけば、見つけられないことはありませんが、細かい部分は見落とすこともあるでしょう。したがって、このようなバグの検出にはブラックボックステストが最適と言えます。
そもそもテストは、仕様に対して合っているか、間違っているかを確認する作業で、それができるのはブラックボックステストになります。したがって、確実かつ効率的にテストを実施するには、次のような手順で実施することをお勧めします。
(1) まず、ブラックボックステストの技法を使って「仕様」に基づいたテストケースを作成して、テストを実行する
(2) その後で「構造」に対してどれだけ網羅(実行)されているか、すなわちカバレッジを測ってみる
(3) 実行していない部分があれば、ホワイトボックステストの技法を使ってその部分に対するテストケースを作成して、テストを実行する
こうすることで、最適なテストケースを使って効率よくテストを実行できるでしょう。
まとめ
前回(第3回)のホワイトボックステストに続き、テスト対象の「仕様」に基づいたテストケースの作成技法「ブラックボックステスト」について紹介しました。今回紹介したテストケース作成技法を用いることで、より少ないテストケースで必要な網羅性をカバーできる効率的なテストが可能となります。実際の開発では、入力値が複数ある場合など、もっと複雑なケースも出てくると思いますが、今回紹介した技法が基本となりますので、まずは基本をしっかりとおさえておきましょう。