xUTPによるテストダブルの定義とその図解

この記事は、NTT docomo Business Advent Calendar 2025 8日目の記事です。

自動テストの文脈で、モックやスタブという用語を目にすることがあるかと思います。この用語は、人やテストフレームワークごとに異なった意味で使われることがあり、しばしば混乱を招いています。そして、そのような指摘をした上で概念の整理を図ったものとしてGerard Meszarosの書籍『xUnit Test Patterns』(xUTP)1とウェブサイト2があります。

xUTPでは、テスト対象(SUT)の依存コンポーネント(DOC)を置き換えるものを総称して「テストダブル」と呼び、その目的に応じて以下の種類に分類しています。

  • モック
  • スタブ
  • フェイク
  • スパイ
  • (ダミー)

このxUTPによるテストダブルの分類については、日本語での素晴らしい解説記事がすでにいくつか存在しますが、私が社内でテストダブルの分類について説明するときは、それらの記事を紹介しつつも個人的に以下の図を利用しています。

この記事では、その図に簡単な説明を添えて紹介したいと思います。

用語の導入

テストダブルについて詳細な議論をするために、いくつかの用語を整理する必要があり、xUTPで定義されているいくつかの用語を導入します。

テスト対象(SUT; System Under Test)は、文字通りテストの対象を意味します。クラスやメソッド、関数などの他、システム全体を指すこともあります。文脈によって指し示す対象が異なるので、それらを抽象化したものです。

依存コンポーネント(DOC; Depended-on Component)とは、テスト対象が依存するものです。テスト対象と同様にクラスやメソッド、関数などの他、データベースや認証サービスなどを指すこともあります。

テスト対象と依存コンポーネントという概念が抽象化されているので、関数の入出力などの概念も抽象化をする必要があります。

テスト対象がテストから受け取る入力のことを直接入力、テスト対象からテストコードへの出力を直接出力といいます。テスト対象が関数であれば、典型的には、関数の引数が直接入力、返り値が直接出力にあたります。テスト対象がHTTPベースのWeb APIを提供するバックエンドサービスであれば、典型的には、HTTP Requestが直接入力、HTTP Responseが直接出力にあたります。

一方、テスト対象が依存コンポーネントから受け取る入力のことを間接入力、テスト対象から依存コンポーネントへの出力を間接出力といいます。テスト対象と依存コンポーネントが関数であれば、典型的には、依存される関数の引数がテスト対象の間接出力、依存される関数の返り値が間接入力にあたります。

テスト対象を中心として入出力の関係が整理されているため、(直接/間接)入力が関数の引数、(直接/間接)出力が関数の返り値、のような対応付けとはならないことに注意してください。

この節で導入したこれらの用語(テスト対象、依存コンポーネント、直接入出力、間接入出力)を図にまとめると、次のようになります。

テストダブルとその分類

xUTPでは、モックやスタブなどの依存コンポーネントを置き換えるものを総称してテストダブルと呼んでいました。そして、それらの概念をその目的によって以下の通り再整理しています。

モック

モックとは、テスト対象が依存するコンポーネントへの間接出力を検証することを目的としたテストダブルです。間接出力の検証の例には、依存するリレーショナルデータベースに渡すSQL文の検証やWebフロントエンドからバックエンドへのリクエストの検証などがあります。

スパイ

スパイとは、テスト対象が依存するコンポーネントへの間接出力を記録することを目的としたテストダブルです。間接出力に関心があるという意味でモックと似ていますが、スパイは間接出力を記録するもので、依存コンポーネントが実行された後に間接出力の検証ができます。

スタブ

スタブとは、テスト対象が依存するコンポーネントからの間接入力を操作することを目的としたテストダブルのことです。間接入力の操作の例には、現在時刻を返す関数を常に指定した時刻で返すようにする操作などがあります。

フェイク

フェイクとは、テスト対象が依存するコンポーネントの実装を置換することを目的としたテストダブルのことです。実装の置換の例には、リレーショナルデータベースに依存するコンポーネントのオンメモリ実装への置換やクラウドサービスのプロバイダーが提供するローカルで動作するエミュレーターなどが挙げられます。 フェイクは、依存するコンポーネントの実行速度が遅い場合やテスト環境で本物の依存するコンポーネントが利用できない場合などに利用されます。

ダミー

xUTPではダミーと呼ばれる分類も導入されていますが、厳密にはダミーはテストダブルではなく値パターンの一部であるという議論も同時になされています。ダミーは今回紹介する図では整理しにくいこともあり、この記事では分類から除外します。

これらのテストダブルの分類のうち、モックとスパイは間接出力に、スタブは間接入力に、フェイクはそのどちらでもなく依存コンポーネントの実装に関心があります。

  • モック:間接出力の検証
  • スパイ:間接出力の記録
  • スタブ:間接入力の操作
  • フェイク:依存コンポーネントの実装の置換

したがって、これらの関心の違いを元に、次のように図(再掲)にまとめることができます。

おわりに

この記事では、xUTPによるテストダブルの分類の図解を紹介しました。 この図が、少しでも理解の助けとなれば幸いです。

NTT docomo Business Advent Calendar 2025 を、明日もお楽しみに!

参考文献


  1. Meszaros, Gerard. xUnit test patterns: Refactoring test code. Pearson Education, 2007.
  2. Meszaros, Gerard. xUnit Patterns.com, xunitpatterns.com. Accessed 8 Dec. 2025.