モックとスタブの違いとは?初心者向けにテストでの役割・使い分け・ダミーとの違いをわかりやすく解説
結論
モックとスタブは、どちらもソフトウェアテストで本物のシステムの代わりに利用する「テストダブル」の一種ですが、目的が異なります。スタブ(Stub)は決められた値を返す代用品、モック(Mock)は戻り値だけでなく「期待どおりに呼び出されたか」まで確認できる代用品です。
初心者は「どちらも本物の代わり」と覚えがちですが、スタブはテストを進めるための代用品、モックは動作を検証するための代用品という違いを理解すると区別しやすくなります。
- モックとは
- スタブとは
- モックとスタブの違い
- モックとスタブの使い分け
- イメージで理解する
- テストダブルとは
- どんな場面で使われるのか
- なぜ重要なのか
- 初心者が混乱しやすいポイント
- 実際のIT現場での利用例
- 筆者が現場で経験した失敗談
- 業務でよくあるトラブル
- 原因の切り分け
- 確認する順番
- GUIで確認する方法
- コマンドプロンプトで確認する方法
- PowerShellで確認する方法
- ログの確認方法
- イベントビューアーの確認方法
- 確認結果の見方
- 影響範囲を考える
- ユーザー側・サーバー側の切り分け
- 初心者がやりがちなミス
- 業務で上司へ報告するポイント
- エスカレーションするタイミング
- モック・スタブ・ダミー・フェイクの違い
- 関連するIT用語
- よくある質問(FAQ)
- まとめ
モックとは
モック(Mock)とは、テスト対象のプログラムが外部システムや別のクラスを正しく利用しているかを確認するための代用品です。
戻り値を返すだけでなく、「何回呼び出されたか」「どの引数で呼び出されたか」なども検証できます。
例えば、メール送信機能では実際にメールを送らず、「送信処理が1回だけ呼ばれたか」を確認するためにモックを利用します。
スタブとは
スタブ(Stub)とは、あらかじめ決められた値やデータを返すだけの代用品です。
本物のデータベースやAPIを利用せず、テストしやすいように固定のデータを返します。
例えば、「ユーザー名は必ず『山田太郎』を返す」といったように、毎回同じ結果を返す役割を持ちます。
モックとスタブの違い
| 項目 | モック | スタブ |
|---|---|---|
| 目的 | 呼び出しを検証する | 決められた値を返す |
| 戻り値 | 返せる | 返せる |
| 呼び出し回数の確認 | できる | 基本的にできない |
| 引数の確認 | できる | 基本的にできない |
| 利用場面 | 動作確認・単体テスト | 単体テスト・開発 |
モックとスタブの使い分け
| 利用したいこと | 使うもの |
|---|---|
| 固定データを返したい | スタブ |
| APIの代わりを作りたい | スタブ |
| メール送信を実行したか確認したい | モック |
| ログ出力が呼ばれたか確認したい | モック |
イメージで理解する
レストランに例えると理解しやすくなります。
| 例え | 意味 |
|---|---|
| スタブ | 毎回同じ料理を出す見本 |
| モック | 注文を受けたかまで記録する店員 |
スタブは料理を提供するだけですが、モックは「誰が注文したか」「何回注文したか」まで記録できます。
テストダブルとは
モックやスタブは、テストダブル(Test Double)と呼ばれる仕組みの一種です。
テストダブルとは、本物のオブジェクトの代わりに利用する部品の総称で、代表的なものには次のような種類があります。
| 種類 | 役割 |
|---|---|
| ダミー(Dummy) | 引数を埋めるだけで利用する |
| スタブ(Stub) | 固定値を返す |
| モック(Mock) | 呼び出しを検証する |
| スパイ(Spy) | 実際の呼び出し内容を記録する |
| フェイク(Fake) | 簡易的な本物を実装する |
どんな場面で使われるのか
- 単体テスト
- API開発
- Webアプリケーション開発
- クラウドサービス連携
- データベースを利用する処理
- 外部システム連携
なぜ重要なのか
本物のAPIやデータベースを毎回利用すると、テストが遅くなったり、外部サービスが停止しているとテストできなくなったりします。
スタブやモックを利用すると、外部環境に依存せず、安定して高速にテストを実行できます。
初心者が混乱しやすいポイント
モックもスタブも戻り値を返せる
両方とも戻り値を返せますが、モックは「呼び出し方を確認する」ことが主な目的です。
モックを使いすぎるとテストが複雑になる
すべてをモックにすると、実装変更の影響を受けやすくなるため、必要な場面だけ利用することが大切です。
実際のIT現場での利用例
- 外部APIをスタブ化して開発を進める
- 決済APIの代わりにスタブを利用する
- メール送信処理をモック化する
- ログ出力の確認にモックを利用する
- データベースアクセスをスタブ化する
- クラウドサービス連携のテスト
実際の開発現場では、APIが完成する前にスタブを作成し、並行して画面開発を進めることも珍しくありません。
筆者が現場で経験した失敗談
以前、すべての外部サービスをモック化してテストしていたため、本番環境でAPI仕様が変更されていることに気付かず障害が発生したことがありました。
その経験から、単体テストではモックやスタブを利用しつつ、結合テストでは実際のAPIとも接続して確認する運用へ変更しました。
業務でよくあるトラブル
- スタブの戻り値が実際のAPIと異なる
- モックの期待値が古い
- API仕様変更に追従していない
- 呼び出し回数が一致しない
- テストだけ成功して本番で失敗する
原因の切り分け
| 確認項目 | 内容 |
|---|---|
| スタブ | 戻り値が最新仕様か |
| モック | 期待値が正しいか |
| API仕様 | 変更されていないか |
| テストデータ | 本番に近い内容か |
| ログ | 実際の呼び出し内容 |
確認する順番
- API仕様書を確認する
- スタブの戻り値を確認する
- モックの期待値を確認する
- テストログを確認する
- 実環境でも動作確認する
GUIで確認する方法
モックやスタブそのものをGUIで確認することは少ないですが、Webアプリケーションではブラウザの開発者ツール(F12)のNetworkタブを利用して、実際にAPI通信が行われているか、スタブが利用されているかを確認できます。
コマンドプロンプトで確認する方法
スタブが返すデータと実際のAPIを比較する場合は、curlコマンドでAPIを直接呼び出して確認します。
例
curl https://api.example.com/users
返却されるJSONデータがスタブと一致しているか確認できます。
PowerShellで確認する方法
PowerShellではInvoke-RestMethodを利用してAPIを呼び出し、スタブのデータと比較できます。
単体テストだけでなく、運用時のAPI疎通確認にも活用されています。
ログの確認方法
- テスト実行ログ
- アプリケーションログ
- APIアクセスログ
- CI/CDの実行ログ
- ユニットテスト結果
モックの呼び出し回数やスタブの利用状況、エラー内容を確認できます。
イベントビューアーの確認方法
モックやスタブ自体はイベントビューアーへ記録されません。
Windows上でテストツールやアプリケーションがエラーを出力している場合は、イベントビューアーのアプリケーションログを確認することがあります。
- Windows+Rキーを押す
- eventvwr.msc と入力する
- Windowsログ
- アプリケーションを開く
- 対象アプリケーションのエラーを確認する
確認結果の見方
| 結果 | 意味 |
|---|---|
| テスト成功 | 期待どおりに動作している |
| モック検証失敗 | 呼び出し回数や引数が期待と異なる |
| スタブエラー | 戻り値や設定に問題がある |
| APIエラー | 実際のAPI仕様を確認する |
影響範囲を考える
- 単体テストだけか
- 結合テストにも影響するか
- 本番環境でも発生するか
- 外部API連携全体に影響するか
- CI/CDパイプラインにも影響するか
ユーザー側・サーバー側の切り分け
| 確認対象 | 例 |
|---|---|
| テストコード | モック・スタブの設定 |
| API | 仕様変更、レスポンス |
| アプリケーション | 実装変更 |
| CI/CD | テスト環境や実行条件 |
初心者がやりがちなミス
- モックとスタブを同じものだと思う
- すべてのテストをモックだけで実施する
- スタブのデータを更新しない
- 本番環境との動作確認を行わない
- API仕様変更を見落とす
業務で上司へ報告するポイント
- 発生したテスト名
- 利用しているモックまたはスタブ
- 期待値と実際の結果
- 発生日時
- 影響範囲
- API仕様との差異
- 実施した確認内容
エスカレーションするタイミング
- 実環境とテスト結果が一致しない
- API仕様変更が疑われる
- 複数のテストで同じエラーが発生する
- CI/CD全体でテストが失敗する
- 原因がテストコードか実装か判断できない
モック・スタブ・ダミー・フェイクの違い
| 種類 | 役割 | 利用例 |
|---|---|---|
| ダミー(Dummy) | 値を渡すだけ | 未使用の引数 |
| スタブ(Stub) | 固定値を返す | API・データベースの代用品 |
| モック(Mock) | 呼び出しを検証する | メール送信・ログ出力 |
| フェイク(Fake) | 簡易実装を提供する | インメモリデータベース |
関連するIT用語
- 単体テスト
- 結合テスト
- テストダブル
- ダミー(Dummy)
- スパイ(Spy)
- フェイク(Fake)
- API
- REST API
- CI/CD
- 自動テスト
よくある質問(FAQ)
モックとスタブはどちらを使えばよいですか?
固定のデータを返したい場合はスタブ、呼び出し回数や引数まで確認したい場合はモックを利用します。
モックでも戻り値を返せますか?
はい。モックも戻り値を返せますが、主な目的は「期待どおりに呼び出されたか」を検証することです。
スタブだけでテストしても問題ありませんか?
単体テストでは有効ですが、本番環境との差異を防ぐためには、結合テストや実際のAPIとの接続テストも実施することが重要です。
テストダブルとは何ですか?
本物のオブジェクトの代わりに利用する部品の総称です。モックやスタブ、ダミー、フェイク、スパイなどが含まれます。
まとめ
モックとスタブはどちらもテストダブルですが、スタブは決められたデータを返す代用品、モックは呼び出し方法まで検証する代用品という違いがあります。
実際のIT現場では、単体テストではスタブやモックを活用して効率的に開発を進め、結合テストや本番環境では実際のAPIやデータベースと接続して動作を確認することが一般的です。それぞれの役割を理解し、適切に使い分けることで、品質の高いシステム開発につながります。
