スタブとは?
スタブ(Stub)は、テスト環境で依存する部分の動作をシミュレートするオブジェクトです。スタブは、外部リソース(APIやデータベース)などの実際の動作を模倣し、決められた返り値を返すように設定されます。スタブはモックと似ていますが、呼び出しの検証や挙動の追跡には焦点を置かず、主にシミュレーションに使われます。
スタブはテスト環境で特定の状況を再現したい場合に非常に有効で、リアルな外部環境を利用しなくてもテストが可能です。
スタブとモックの違い
スタブとモックは、どちらもテスト環境で使われるオブジェクトですが、使用目的に違いがあります。
スタブ | モック |
---|---|
特定のメソッドが呼び出された時、決められたデータを返す役割を持つ。 | メソッドの呼び出し回数や引数の検証などを行う。 |
実際の動作をシミュレーションするために使用。 | 呼び出しの検証や期待される振る舞いをチェックする。 |
呼び出しの追跡は行わない。 | メソッドが正しく呼び出されたか、引数を検証する。 |
スタブによる動作シミュレーションの使い方
スタブを使用すると、テスト環境で実際の外部サービスを使用せずに特定のシナリオを再現できます。以下に、スタブを使った動作シミュレーションの基本的な流れを説明します。
- スタブを作成する: スタブとなるオブジェクトを作成し、決められたデータを返すメソッドを定義します。
- スタブをテスト対象に渡す: テスト対象の関数やメソッドにスタブを渡し、実際の動作をシミュレートします。
- 結果を検証する: スタブが期待通りの動作をシミュレーションできたか、結果を検証します。
具体例: スタブを使用したJavaScriptのテスト
次に、API呼び出しをスタブでシミュレートする具体例を示します。
ステップ1: スタブを作成する
const getData = (api) => api.fetchData();
const stubApi = {
fetchData: () => 'stubbed data'
};
ここでは、stubApi
オブジェクトを作成し、その中のfetchData
メソッドが呼び出された際、常に'stubbed data'
を返すように設定します。
ステップ2: スタブをテストに渡す
test('getData returns stubbed data', () => {
const result = getData(stubApi);
expect(result).toBe('stubbed data');
});
このテストでは、スタブを使ってgetData
が'stubbed data'
を返すかどうかを検証します。
ステップ3: 結果を検証する
テストが実行されると、スタブがfetchData
メソッドをシミュレートし、決められた返り値'stubbed data'
が返されます。外部APIに依存せず、テストが完了します。
スタブを使用するメリット
スタブを使用することには多くのメリットがあります。
- 外部リソースを使用せずにテストが可能: APIやデータベースを実際に呼び出すことなくテストが行えます。
- テストの安定性向上: 外部の変更やネットワークの遅延に影響されず、テストを実行できます。
- 特定のシナリオを再現可能: スタブを使うことで、外部サービスのレスポンスを制御し、特定のテストケースを簡単に再現できます。
モックとスタブの使い分け
モックとスタブは、テストにおける役割が異なるため、適切に使い分けることが重要です。
スタブが適している状況 | モックが適している状況 |
---|---|
外部APIの結果やデータを制御して、特定の動作をシミュレートしたい場合。 | メソッドの呼び出し回数や引数を確認し、正確にメソッドが実行されているか検証したい場合。 |
テスト対象コードが、特定の条件下で動作することを確認する場合。 | 依存するメソッドやクラスの動作が正しいか、厳密に検証する必要がある場合。 |
まとめ
スタブは、外部依存を排除し、特定の動作をシミュレートするための便利なツールです。スタブを使うことで、外部サービスやリソースに依存せずにテストを行うことができ、テストの安定性と効率が向上します。
モックとスタブは似ているようで異なる役割を持っていますが、適切に使い分けることで、テストがより正確かつ効率的に行えます。状況に応じてこれらの技法を活用することが、テストの品質向上につながります。