テストを実行するときは,ブラックボックス・テストを行ってから,ホワイトボックス・テストを行うようにすると効率的です。単体テスト・ツールとカバレッジ計測ツールは特に活用すべきでしょう。

 それではテストの実行を実践してみましょう。テスト実行の進め方としては,次の二通りの進め方が考えられます。

(1)ホワイトボックス・テストを行ってからブラックボックス・テストを行う
(2)ブラックボックス・テストを行ってからホワイトボックス・テストを行う

 今回は,(2)の進め方を説明していきます。

ブラックボックス・テストを先に行うメリット

 ブラックボックス・テストをホワイトボックス・テストに先駆けて実施するメリットは次の三つです。

◆効率が良い
 ブラックボックス・テストは仕様からテスト設計をしていくので,実装したコードからテスト設計をしていくホワイトボックス・テストよりも早い段階でテスト・ケースを作成できます。XP(エクストリーム・プログラミング)のプラクティスである「テスト・ファースト」のような実装前にテストのコードを作成する手法も,ブラックボックスでテスト設計を行ったテスト・ケースを元にテスト・コードを作成してから,仕様をプログラムとして実装していきます。

◆ムダを防げる
 カバレッジ測定ツールを使うと,ブラックボックスで設計したテストを実行した結果から,カバレッジを自動的に測定できます。ブラックボックスでは実行しなかったステートメントやブランチに対してパスが通るようにテスト・ケースを追加していけば,ブラックボックスとホワイトボックス両方のテストでテスト・ケースが重複するようなムダを防ぐことができます。

◆重要なテストを先に実施できる
 そもそもソフトウエアは,仕様(もっというと顧客の要求)通りに動かなければ意味がありません。ホワイトボックスは,あくまで構造を網羅しているかを確認するものであり,仕様通りの動作を確認するには不十分です。カバレッジを満たしただけでは,実装上の間違いは見つかりますが,仕様に漏れがあった場合や,仕様そのものに不備があった場合の問題を見つけることはできません。「ブランチ・カバレッジ100%なのでテストは完璧だ」とはならないのです。

JUnit+djUnitでテストを実行する

 テストの実行順を決めて,いよいよ実行準備→実行となっていくのですが,テストの実行を効率的に行うには,テスト・ツールをどれだけ使いこなせるかも非常に重要な技術になります。今回はブラックボックス,ホワイトボックスのテスト・ケース設計技法にてメソッド(関数)・レベルのテストを題材にしたので,単体テストの自動テスト・ツールとしてJUnit*1,カバレッジ計測ツールとしてdjUnit*2を使った際の進め方を説明します。

 JUnitとは,Java用の単体テスト・フレームワークです。他にもC++にはcppUnit,.NETにはNUnitなど,プログラミング言語ごとに単体テスト・フレームワークが用意されています。これらを総称してxUnitと呼びます。xUnitは,テスト・コード記述のためのライブラリとテスト実行ツールをセットにしたフレームワークです。オープンソースで提供されているので,誰でも気軽に利用できます。

 単体テスト・フレームワークなどを使って単体テストを自動化する機能の利用は,近年の短納期かつ仕様変更が多い開発では必須といえるでしょう。なぜなら,仕様変更が多いということはそれだけ回帰テストを何回も行わなければならないからであり,自動化は同じテストを繰り替えし実行するときに効果を発揮するからです。また,単体テストを自動化する際に,各自で独自のテスト・コードを書いてテストするのではなく,共通の単体テスト・フレームワークを使うことは,テスト・コードの作成が容易になるうえに,テスト・コードの可読性が高まるので他の人が作ったテスト・コードを流用しやすくなるなど,多くのメリットがあります。

 まず,Eclipseに付属しているJUnitを使って,テスト・コードを作成してみましょう。Part3のブラックボックス技法でテスト設計した「メソッド仕様3」のテスト・ケースを使います。

◆メソッド仕様3
引数1:商品群A(パソコン)購入額,型:整数
引数2:商品群B(プリンタ)購入額,型:整数
引数3:その他商品購入額,型:整数
戻り値:判定結果
仕様:
 ・量販店でのポイントカードへのボーナス・ポイント付与(ポイントを3倍にして付与)を判定する
 ・購入金額が10万円以上で,かつ商品群A(パソコン)と商品群B(プリンタ)の両方を3万円以上購入していると,ポイント付与OK(true)を返す

 テスト・コードの記載方法は図1のように行います。

図1●テスト・コードの書き方
図1●テスト・コードの書き方
[画像のクリックで拡大表示]

 このようにJUnitのテスト・コードは,実装用のプログラム・コードとは別に作っていくことができるため,実装用コードを汚すことなくテストを行うことができることもメリットだと言えます。

 テスト・コードに書いてある内容を要約すると

(1)テスト対象クラスを指定
(2)テストの入力値を指定
(3)テスト対象の呼び出し
(4)期待結果との比較

四つになります。これは,テスト・ケースの書き方そのものなので非常にわかりやすいはずです*3