Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

テストダブル

テストダブル(test double) はソフトウェアテストにおいて「本物の依存オブジェクトの代わりに使う偽物のオブジェクト」の総称。(名前の由来は「スタントダブル(代役、スタントマン)」から)

本来のコンポーネントを呼び出すとテストが難しくなったり、外部リソース(DB、API、ネットワーク、ファイルシステムなど)に依存して不安定になる場合に、それを置き換えて使う。

テストダブルの種類

Gerard Meszarosが書籍『xUnit Test Patterns: Refactoring Test Code』で示した分類(Webにも公開されている)

  • Stub(スタブ) :呼び出されたときに、あらかじめ決めた値を返す。「入力 → 出力」を固定することで外部依存を切り離す

  • Mock(モック) :期待される呼+び出し(回数や引数)をあらかじめ設定し、それを満たさないとテスト失敗にする。Stubを含むが間接的な出力も検証(assert)する

  • Dummy(ダミー) :渡さないとコンパイルや実行ができないので形だけ用意するもの。実際には使われない(使おうとすると壊れるようにする)。

  • Fake(フェイク) :本物に近いが、実装を簡略化した代替物 (例: 本物はRDBMSだが、テストではインメモリDBを使う)

  • Spy(スパイ) :呼び出し履歴や引数を記録して、後で検証できるようにするもの

スタブの例

WeatherService というクラスがあり、指定した都市の天気予報を返すとする。

WeatherAPIClient というクラスで天気予報を取得するとする。WebAPIの呼び出しが絡むので、テストのときは実際のAPIに依存しないようにしたい

WeatherAPIStubを作り、決め打ちの値を返すようにする

unittestのMagicMockでスタブを書く

MagicMock を使って既存の関数を上書きし、返り値を固定することができる

参考:unittest.mock - Python documentation

'Sunny'

unittest.mockでスタブを書く

モックの例

unittest.mock にはモックがどう呼び出されたのか検証するメソッドが用意されている

https://docs.python.org/ja/3/library/unittest.mock.html