車を例に考えるユニットテスト
さあ、車を作ることを想像してみてください。
まず、必要な部品を考えてみます。
- エンジン
- 車体
- シャーシ
- シャフト
- タイヤ
- などなど
はじめに、これらの部品の一つ一つを製造します。
そして、これらの部品を組み立てると、車が完成しました。
では、完成した車にのってドライブに行こうと、車に乗り込んでエンジンキーを回しました。
しかし、なにも起こりません。そう、エンジンが点かないのです。
さて、エンジンが点かない原因はどこにあるでしょうか。
車に使ったいずれかの部品が故障しているのか、もしくは、それぞれの部品を組み合わせた相性が悪かったのか。
組み立てる前に一つ一つの部品に不具合がないか確認をしてから組み立てておけば、少なくとも部品の故障ではないことが判明していました。
しかし、すでに組み立ててしまった後なので、原因の究明が困難になってしまいました。
車の製造に失敗してしまいました。
次から失敗しないために、まずは部品毎に検査を行い、不具合がなければ、部品を組み立てるようにします。
このように部品(モジュールやコンポーネント、プログラムではクラスやメソッドといった小さな単位)毎に行う検査(テスト)を単体テスト(ユニットテスト)といいます。
ということで、次は部品毎に検査することを想像してみてください。
ここでは、タイヤの検査をします。
タイヤの検査をするためには、タイヤを回す機構(エンジンやシャフト等)が必要になります。
しかし、部品単位で検査したいので、ほかの部品と組み合わせて検査するのはNGです。
そこで、検査のためにタイヤを回す機構をモーターを使って作りました。
そのモーターによって、タイヤを回し検査を行います。
このようにある部品(モジュール)をテストするために必要なほかの部品(モジュール)を、検査(テスト)用のものに置き換えて検査(テスト)を行います。
プログラムでは、このようなテストに利用するモジュールの代わりをモックやスタブと呼びます。
ここでは、モックやスタブについての説明は割愛します。
また、部品を組み立てたあとの検査(テスト)のことを、プログラムにおいては結合テストとよび、各モジュールを組み合わせた時の動作をテストします。
※私は車の製造に携わったことはありません。