単体テストが行える設計とは

NUnitなどを使って単体テストを行うためには、インターフェイスと実装を分け、依存関係を逆転させた設計が必要だと筆者は考える。この設計にしておけば、テストケースからテスト対象のクラスを呼び出し、モックオブジェクトのダミーデータでテスト対象のロジックを検証することができる。

ビジネスロジックを格納した納期回答クラスと、生産管理DBにアクセスするクラスがあったとする。納期回答クラスは納期回答の依頼を受けると、生産管理DBクラスから商品の生産完了日を取得して、業務ルールを加えて呼び出し元に納期回答日を返すとする。
下図(左)は、インターフェイスと実装を分けて作った場合のクラス図である。納期回答クラスは生産管理DBアクセスインターフェイスに依存しており、生産管理DBアクセスクラスに直接依存していない。このクラス関係であれば、下図(左)のようにテストケースクラスとモッククラスを用意してテストができる。テスト時はテストクラスが納期回答クラスのインスタンスを生成しメソッドを呼び出し、生産管理DBアクセスクラスはモッククラスに差し替えておくのである。モッククラスが正常(または異常)のデータを返すことで、納期回答クラスのロジックが検証できる。


一方、下図は、インターフェイスと実装を分けずに作ったシステムの場合である。
納期回答クラスを単体テストしたいが、、納期回答クラスは直接生産管理DBアクセスクラスに依存している。このため納期回答クラスの単体テストができない。2つのクラスの結合テストになってしまうのである。

トラックバック

トラックバックURL:
http://www.apricot-jp.com/cgi/mt/mt-tb.cgi/281

関連情報

Copyright(C) 2007 アーキテクト360 Allrights reserved.