ソフトウェア テストでは、モックとスタブは、依存関係をシミュレートするために使用される 2 つの一般的なタイプのテスト ダブルです。これらは、テスト中に実際の依存関係を制御された代替物に置き換えることにより、コンポーネントの動作を分離するのに役立ちます。モックとスタブはどちらも同様の目的を果たしますが、テスト シナリオのタイプに基づいて使用方法が異なります。
この記事では、モックとスタブの主な違い、その使用例、テスト戦略でそれぞれをいつ使用するかについて詳しく説明します。
テストダブルとは何ですか?
テスト ダブルは、テスト中に実際の依存関係の代わりに使用されるオブジェクトまたはコンポーネントの総称です。目標は、テスト対象のコンポーネントを分離し、テストの結果に影響を与える可能性のある外部要因を除去することです。モックとスタブは 2 種類のテスト ダブルであり、単体テストや統合テストでよく使用されます。
スタブとは何ですか?
スタブは、テスト対象のコンポーネントによって呼び出されたときに事前定義されたデータを返すテスト ダブルです。これは通常、テスト対象のコンポーネントが依存関係からの入力を必要とする場合に使用されますが、依存関係の実際の動作はテスト結果とは無関係です。スタブは制御された応答を提供するため、コンポーネント内のロジックのみに集中できます。
スタブの例:
支払い処理機能をテストしているとします。実際の支払いゲートウェイを呼び出す代わりに、常に「支払い成功」応答を返すスタブを使用して、関数内のロジックを独立してテストできるようにします。
const paymentGatewayStub = { processPayment: () => "payment successful" }; function processOrder(paymentService) { const result = paymentService.processPayment(); return result === "payment successful" ? "Order Complete" : "Order Failed"; } // Test console.log(processOrder(paymentGatewayStub)); // Output: "Order Complete"
この場合、スタブにより外部サービスが常に予期した出力を返すことが保証され、内部ロジックのテストが容易になります。
モックとは何ですか?
モックは、偽のデータを提供するだけでなく、コンポーネント間の相互作用も検証するテスト ダブルです。モックは、正しいメソッドが正しいパラメータで呼び出され、実行中に望ましいシーケンスが発生することを確認するのに役立ちます。これらは通常、コンポーネントの動作や相互作用がテストにとって重要な場合に使用されます。
モックの例:
同じ支払いの例を使用して、注文処理中に processPayment() メソッドが 1 回だけ呼び出されることを確認したいとします。
const paymentGatewayMock = { processPayment: jest.fn().mockReturnValue("payment successful") }; function processOrder(paymentService) { paymentService.processPayment(); } // Test processOrder(paymentGatewayMock); expect(paymentGatewayMock.processPayment).toHaveBeenCalledTimes(1);
この場合、モックはメソッドが呼び出されたかどうかをチェックすることで対話を検証し、実行中にコンポーネントが正しく動作することを確認します。
モックとスタブの主な違い
アスペクトモックスタブ
目的 コンポーネント間の対話を検証する 事前定義された応答を提供する
動作 メソッド呼び出しとパラメータを検証します 静的データのみを返します
使用シナリオ インタラクションが重要な場合に使用 データ出力が十分な場合に使用
複雑さ 実装がより複雑になる 作成がより簡単になる
テスト例 メソッド呼び出しの検証 固定応答によるロジックのテスト
スタブを使用する場合
• 単純なロジックのテスト: 依存関係の出力を制御する必要がある場合のみスタブを使用します。
• データ駆動型テスト: コンポーネントが特定のデータでどのように動作するかをテストすることに重点を置く場合は、スタブの方が適しています。
• 使用例: データベースからのユーザー データを必要とするログイン機能をテストしている場合は、スタブを使用して、実際のデータベースを呼び出さずにダミー ユーザーを返します。
モックを使用する場合
• インタラクションベースのテスト: 正しいメソッドが正しいパラメータで呼び出されることを確認することに重点を置く場合は、モックを使用します。
• 複雑な相互作用のテスト: モックは、複数のサービスまたは API と相互作用するコンポーネントに最適です。
• ユースケースの例: 電子メール送信サービスをテストしている場合は、モックを使用して、sendEmail() 関数が予想される受信者とメッセージで呼び出されたことを検証します。
モックとスタブは一緒に使用できますか?
はい、場合によっては、相互作用の検証と制御された応答の両方を達成するために、同じテスト内でモックとスタブが一緒に使用されます。たとえば、スタブを使用して特定のデータを返し、モックを使用して特定のサービスが呼び出されたことを確認できます。
モックとスタブの長所と短所
スタブの長所:
• シンプルで実装が簡単
• コンポーネントロジックを単独でテストするのに便利
スタブの短所:
• メソッド呼び出しまたはパラメータを検証できません
• 静的応答に限定される
モックの長所:
• 動作、相互作用、シーケンスを検証する
• 複数の依存関係がある複雑なシナリオに役立ちます
モックの短所:
• より多くのセットアップが必要となり、テストが読みにくくなる可能性があります
• 慎重に使用しないと、脆弱なテストが発生する可能性があります
モックとスタブ: どちらを使用するべきですか?
• テストが依存関係の出力に依存しており、その出力を制御したい場合は、スタブを使用します。
• メソッドが呼び出されたことを確認する必要がある場合、またはコンポーネント間の相互作用を検証する必要がある場合は、モックを使用します。
• 単体テストでは、内部ロジックのテストに重点が置かれているため、スタブがより一般的に使用されます。
• 統合テストの場合、システムのさまざまな部分がどのように相互作用するかを検証する場合、モックはより便利です。
結論
モックとスタブは両方ともテスト戦略において重要な役割を果たしますが、それぞれ異なる目的を果たします。スタブは依存関係が返すデータを制御しますが、モックはコンポーネント間で正しい対話が行われることを保証します。それぞれをいつどのように使用するかを理解すると、テストの品質が向上し、ソフトウェアの信頼性が高まります。モックとスタブを正しく適用することで、チームはバグを減らし、開発をスピードアップし、単体テストと統合テストの両方でより良いテスト戦略を作成できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3