テストダブルとは、ソフトウェアテスト自動化において、テストが本番コードに依存しないように依存関係を満たすために使用されるソフトウェアのことです。テストダブルは、テスト対象のソフトウェアが本番コードと区別できないインターフェースを介して機能を提供します。
プログラマーは通常、テストダブルを使用して、使用するコードの動作をコードベースの他の部分から分離します。
テストダブルは通常、本番コードを簡略化したものであり、テストに特化した機能が含まれている場合がある。
テストダブルは、テストハーネスを構築するために使用されます。
テストダブルは、テストを簡素化したり、実行速度を向上させたり、アクションの結果を確定的にするために使用できます。
例えば、データベースサーバーを使用するプログラムは比較的動作が遅く、システムリソースを大量に消費するため、テストの生産性を阻害します。テストでは、通常のシステム動作下では定期的に変化するデータベースからのデータが必要になる場合があり、そのため、特定のクエリに対して非決定的な出力が得られます。テストダブルを使用すれば、実際のデータベースにアクセスする代わりに静的な値を提供できるため、ネットワーク呼び出しやシステム呼び出し、データの変更を回避できます。
テストダブルは、依存関係がテスト可能でなくても、テスト準備が整ったシステムの一部をテストするためにも使用できます。
例えば、Login、Home、Userというモジュールを持つシステムにおいて、Loginモジュールはテスト準備が整っているが、他の2つのモジュールは準備が整っていないとします。HomeモジュールとUserモジュールで利用される関数をテストダブルとして実装することで、Loginモジュールをテストできるようになります。
テストダブルは単体テストを容易にするためによく使用されますが、テストダブルの使用には制限があります。最も重要な制限は、実際のデータベース接続やその他の外部アクセスが正しく機能することがテストでは証明されないことです。これによって見落とされる可能性のあるエラーを回避するには、上記で説明したインターフェースの「実際の」実装を使用してコードをインスタンス化する別のテストが必要です。これらの統合リスクは通常、統合テスト、システムテスト、またはシステム統合テストによってカバーされます。
テストダブルを実装する際の一般的なアプローチは、次の2つの重要なステップから成ります。
このアプローチは、単体テスト可能な分離を強制し、よりモジュール化され、テスト可能で、再利用可能なコード設計を促進します。[ 1 ]
テストダブルは、さまざまな方法で分類されます。
広く受け入れられているわけではないが、ジェラール・メザロス[ 2 ]はテストダブルを次のように分類している。
カテゴリに関するオープンスタンダードはありませんが、 Martin Fowler はMeszaros の著書を参照しながら、記事「Mocks Aren't Stubs」[ 3 ]でこれらの用語を使用しました。Microsoft も「Exploring The Continuum Of Test Doubles」[ 4 ]というタイトルの記事で同じ用語と定義を使用しました。
サービス指向アーキテクチャ(SOA)システムやマイクロサービスの場合、テスターはネットワーク プロトコルを介してテスト対象システムと通信するテスト ダブルを使用します。 [ 5 ] [ 6 ]これらのテスト ダブルは、ツール ベンダーによって異なる名前で呼ばれています。一般的に使用される用語はサービス仮想化です。その他の名前には、API シミュレーション、API モック、[ 7 ] HTTP スタブ、HTTP モック、オーバー ザ ワイヤ テスト ダブルなどがあります。[ 8 ] [ 9 ]
検証済みフェイクとは、検証済みフェイクと実際の実装の両方に対して実行される一連のテストを使用して、その動作が実際のオブジェクトの動作と一致することが検証されたフェイクオブジェクトのことです。 [ 10 ]
ジェラール・メサロス:
マーティン・ファウラー:
オープンソース: