テストダブル完全分類ガイド — Mock, Stub, Spy, Fake, Dummy の違いを図解で理解する
テストダブル完全分類ガイド — Mock, Stub, Spy, Fake, Dummy の違いを図解で理解する t_wada 氏(和田卓人氏)のポストが、テストダブルの分類について「混乱しがちなテストダブルの分類については、この図がおすすめです」と NTT の解説記事を紹介しています。テストダブルという用語は現場でよく使われますが、「全部モックと呼んでしまう」「Stub と Mock の違いが曖昧」という混乱が起きがちです。この記事では、xUnit Test Patterns に基づく正確な分類を整理します。 テストダブルとは テストダブルは、映画のスタントダブル(代役)から名付けられた用語です。テスト対象のコード(SUT: System Under Test)が依存するコンポーネント(DOC: Depended-on Component)の「身代わり」として使うオブジェクトの総称です。 Gerard Meszaros が著書 xUnit Test Patterns で体系化し、Martin Fowler が “Mocks Aren’t Stubs” で広めました。 なぜテストダブルが必要か 外部依存の排除: データベース、外部 API、ファイルシステムなどの影響を受けずにテストできる 再現困難な条件のテスト: ネットワーク障害、ディスクエラーなどの例外条件を再現できる テスト速度の向上: メモリ上で動作するため高速に実行でき、並列動作も容易 決定性の確保: 外部環境に左右されない安定したテスト結果を得られる SUT と DOC の関係 テストダブルの分類を理解するには、まず情報の流れを整理する必要があります。 テスト → [直接入力] → SUT → [直接出力] → テスト ↕ [間接入力/間接出力] ↕ DOC 用語 意味 例 SUT (System Under Test) テスト対象 テストしたいクラス・関数 DOC (Depended-on Component) SUT が依存するもの DB、外部 API、時刻関数 直接入力 テストから SUT に渡す値 関数の引数 直接出力 SUT からテストに返る値 関数の戻り値 間接入力 DOC から SUT に渡される値 DB のクエリ結果、API のレスポンス 間接出力 SUT から DOC に渡す値 DB への書き込み、API へのリクエスト テストダブルは、間接入力と間接出力のどちらを制御するかで分類されます。 ...