1. ホーム
  2. unit-testing

[解決済み] フェイク、モッキング、スタビングの違いとは?

2022-03-21 21:53:44

質問

これらの用語の使い方はわかっているのですが、次のような定義があるのでしょうか? 改ざん , モッキング そして スタブ ユニットテストのための? これらのテストはどのように定義されますか? また、それぞれをどのような場面で使用するのかを説明してください。

私の使い方を紹介します。

フェイク インターフェースは実装しているが、データは固定でロジックを持たないクラス。 単純に、実装によって良いデータか悪いデータを返します。

モック あるインターフェースを実装し、特定のメソッドから返す値や投げる例外を動的に設定したり、特定のメソッドが呼ばれたかどうかをチェックする機能を提供するクラスです。

スタブ : モッククラスのようなものですが、メソッドが呼ばれたか呼ばれなかったかを検証する機能は備えていません。

モックとスタブは手動で生成することも、モッキングフレームワークで生成することもできます。 偽のクラスは手作業で生成されます。 私はモックを主に自分のクラスと依存するクラスとの間の相互作用を検証するために使用します。 スタブは、相互作用を確認した後に、自分のコードの別の経路をテストするために使用します。 フェイククラスは、主にデータの依存関係を抽象化するため、あるいはモックやスタブを毎回セットアップするのが面倒な場合に使用します。

解決するには?

いくつかの情報を得ることができます。

から マーティン・ファウラー モックとスタブについて

フェイク オブジェクトには実際に動作する実装がありますが、通常は何らかのショートカットを使っているため、実運用には適していません。

スタブ は、テスト中に行われたコールに対して定型的な回答を提供し、通常、テスト用にプログラムされた内容以外のものには全く反応しません。例えば、メールゲートウェイのスタブでは、「送信」したメッセージや、「送信」したメッセージの数だけを記憶しています。

モック というのは、期待値があらかじめプログラムされたオブジェクトで、それが受け取るべき呼び出しの仕様を形成しているからです。

から xunitpattern :

フェイク : SUTが依存するコンポーネントが提供するのと同じ機能の非常に軽量な実装を取得または構築し、本物の代わりにそれを使用するようSUTに指示します。

スタブ : この実装は、SUT 内の未試験コード(X ページの製品バグを参照)を実行する値(または例外)で、SUT からの呼び出しに応答するように構成されている。テストスタブを使用する重要な指標は、SUT の間接入力を制御できないことによる未テストコードがあることである。

モックオブジェクト SUT (System Under Test) が依存するオブジェクトと同じインターフェイスを実装しているもの。モック・オブジェクトを観察ポイントとして使用することで、SUT上のメソッド呼び出しの副作用を観察できないことによる「未テスト要件」(Xページの「プロダクション・バグ」を参照)を回避するために動作検証を行う必要がある場合に使用することができます。

個人的に

モックとスタブを使って、シンプルにすることを心がけています。モックは、テストするクラスに設定された値を返すようなオブジェクトの場合に使っています。Stubは、InterfaceやAbstractクラスを模倣してテストするときに使う。実際、呼び方はどうでもよくて、どれも本番では使われないクラスで、テスト用のユーティリティクラスとして使っています。