はじめに
規則性と不規則性が共存しているのが、世の中の面白い所です。例えば、米国の北東部の気候では、冬は寒く、夏は暑くなります。毎日の気温は不規則に変化しつつも、季節が全体として寒いか暑いかという傾向は変わりません。
従って、例えば不凍液など、気温の影響を受ける製品をテストするときには、特定の決まった温度だけで行うよりも、一定の範囲内のランダムな温度で行う方が、正確度は高まります。
ソフトウェアも同じです。通常、ソフトウェアはさまざまに変化する条件の下で動作します。従って、単体テストを作成するときには、所定の範囲内のランダムなデータを使用する方が賢明です。しかし実際には、基本的な単体テストでは、テストデータをハードコーディングしてしまうことが多いのではないでしょうか。基本的な単体テストであれば、ハードコーディングの方が時間を大きく節約できるし、リスクもさほどないとの思いからです。
しかし私は異を唱えたいと思います。単体テストにランダム性を取り入れるのは簡単ですし、時間も特にかかりません。しかも、短期的にも長期的にも、テストの価値が高まります。そこで紹介したいのが、私が作成したJavaベースのツール「QaRandomizer」です。一定のパターンとデータ構造にのっとったランダムな値を、すばやく簡単に生成できます。
QaRandomizerでは次のデータを生成できます。
- 米国のランダムな郵便番号と、その番号に対応する州および市
- ファーストネーム(名)、ラストネーム(姓)、フルネーム(氏名)、またはメールアドレス
- 文字構成と長さがランダムな文字列
QaRandomizerには、同じ型のオブジェクトを集めたリストからランダムな項目を抽出するヘルパーメソッドもあります。
この記事では、QaRandomizerが生成するランダムなデータを使った基本的な単体テストや、モックオブジェクトを使用した単体テストの方法について説明します。この記事で説明する考え方は広く応用できるものですが、記事内の例はJavaで作成し、用意したサンプルコードはMavenの親プロジェクトと子プロジェクトという形となっています。従って、例やサンプルコードを実際に試してみる場合には、オブジェクト指向プログラミング、Java、Maven、テスティングフレームワークTestNGについての知識が必要です。
postal-serviceプロジェクトの説明
この記事のサンプルプロジェクトはpostal-serviceというものです(記事上部のリンクからpostal-serviceとQaRandomizerのMavenプロジェクトのソースコードをダウンロードできます)。postal-serviceは、郵便物の送付に利用するアイテムとサービスを表すオブジェクトで構成されており、各オブジェクトは次のように使用します(図1を参照)。
- Letter(郵便物)オブジェクトを作成し、PostOffice(郵便局)オブジェクトを使用して切手の貼付と送付を行う
- Stamp(切手)オブジェクトはPostOfficeオブジェクトから購入する
- Letterオブジェクトの差出人と受取人の指定にはAddress(住所)オブジェクトを使用する
- PostOfficeが行うサービスには、Letterの送信に加えて、Email(電子メール)の送信もある
- PostOfficeオブジェクトは、LetterオブジェクトとEmailオブジェクトの転送を容易にするために、PostalDispatcherインターフェースを使用する