テストダブル
テストダブル (Test Double) とは、ソフトウェアテストにおいて、テスト対象が依存しているコンポーネントを置き換える代用品のこと。ダブルは代役、影武者を意味する。
https://ja.wikipedia.org/wiki/テストダブル
事前に押さえておくべき用語:間接入力と間接出力
間接入力
「テストコード」から見えない「テスト対象」への入力
外部メソッドからの戻り値を指す
その戻り値によってテスト対象の振る舞いが変わる
外部メソッドがDBからデータを取得する処理だと考えるとわかりやすい
スタブ:「テスト対象」への間接入力を操作する
間接出力
「テストコード」から見えない「テスト対象」の出力
外部メソッドに引数を与えることを指す
スパイ:「テスト対象」の間接出力を記録する
「テストコード」は「テスト対象」をテストする
「テスト対象」に含まれる「外部メソッド」がテストダブルになりうる
なぜ「外部メソッド」をテストダブルに置き換えるのか
実行上の制約をもつから
DBの書き換えやスクレイピングする処理のような副作用がある処理は本番までしたくない
外部メソッドの処理結果を操作したいから
処理結果に応じて「テスト対象」の処理内容が変化するとき、その内容をテストする
分類として5つくらいある
ダミー(Dummy)
スタブ(Stub)
テスト対象への間接入力を操作する
例:Serviceクラスでのテスト。HTTPクライアントやRepositoryが返す値を制御
スパイ(Spy)
間接出力が正しいか検証する。テストコードで間接出力を参照可能しテストする
差し込んだオブジェクトは本物のふるまいをする
モック(Mock)
間接出力が正しいか検証する。
差し込んだオブジェクトは何もしない。スタブっぽい振る舞い
例:Mockitoのverify
フェイク(Fake)
テストの範囲内で本物と同じように動作する
例:インメモリデータベースでのテスト
スタブとモックの違い
スタブ:値を返すことでテストの条件を整える
モック:呼び出しがあったことを検証する
※多くのテストライブラリではモックにスタブ機能も含まれるためややこしい
テストダブルを挿入しやすくする設計技法がDependency InjectionやDependency Lookup?
参考・引用文献
xUnit Test PatternsのTest Doubleパターン(Mock、Stub、Fake、Dummy等の定義) - 千里霧中
これで迷わないテストダブルの分類(ダミー、スタブ、スパイ、モック、フェイク) - Qiita
xUTPによるテストダブルの定義とその図解 - NTT docomo Business Engineers' Blog
public.icon