Googleのソフトウェアエンジニアリング ―持続可能なプログラミングを支える技術、文化、プロセス
by Titus Winters, Tom Manshreck, Hyrum Wright, 竹辺 靖昭, 久富木 隆一
13章テストダブル
Andrew Trenk, Dillon Bly 著
Tom Manshreck 編
ユニットテストは、開発者の生産性を保ちつつコードの欠陥を減らすために、決定的に重要なツールである。ユニットテストは単純なコード向けに書く分には簡単なこともあるが、コードの複雑性が増すにつれて書くのが難しくなっていく。
例えば、外部のサーバーへリクエストを送信し、それからレスポンスをデータベースに保存するという関数に対し、テストを書こうとしていると想像してみよう。ある程度努力すれば、テストをいくつか書くくらいのことはできるかもしれない。しかしそうしたテストを何百何千と書かなければならないとすれば、テストスイートは実行に何時間もかかる可能性があるだろう。またランダムなネットワーク障害や、別のテストのデータを上書きするテストといった問題のせいで、信頼不能テストになってしまいかねないだろう。
そのような場合には、テストダブルがおあつらえ向きである。テストダブル(test double)(https://oreil.ly/vbpiU)は、映画内でスタントマン(stunt double)が俳優の代役を務めるのと同じように、テスト内で本物の実装の代役を務めることのできるオブジェクトまたは関数である。テストダブルの利用はしばしばモッキング(mocking)と呼ばれるが、これから見ていくように、その用語はテストダブルのさらに個別具体的な側面を指す場合にも使われるために、本章ではモッキングという用語をテストダブル全般の利用を指すために使うのは避けている。
テストダブルの最もわかりやすい類型はおそらく、メモリー内データベースのように、オブジェクトの単純化した実装で本物の実装同様に振る舞うものだ。テストダブルの別の類型として、稀なエラー条件を引き起こすのを簡単にしたり、重量級の関数の呼び出しが実際にその関数の実装を実行することなく確実に行われるようにしたりすることで、システムの特定の詳細部分を検証できるようにするものもある。 ...