web-dev-qa-db-ja.com

モッキングとは何ですか?

モッキングとは何ですか? 。

458
masoud ramezani

プロローグ:辞書で名詞のモックを調べると、Wordの定義の1つがであることがわかります。 )偽物として作られたもの


モッキングは主に単体テストで使用されます。テスト中のオブジェクトは、他の(複雑な)オブジェクトに依存している可能性があります。オブジェクトの動作を分離するには、他のオブジェクトを実際のオブジェクトの動作をシミュレートするモックで置き換えます。これは、実際のオブジェクトが単体テストに組み込むのに実用的でない場合に役立ちます。

つまり、モッキングは、実際のオブジェクトの動作をシミュレートするオブジェクトを作成することです。


時には、スタブとは対照的に、モッキングを区別したいことがあります。この話題については意見の相違があるかもしれませんが、スタブの定義は「最小限の」模擬オブジェクトです。スタブは、テスト中のオブジェクトにテストの実行を許可するのに十分な動作を実装します。

モックはスタブのようなものですが、テストでは、テスト対象のオブジェクトが期待通りにモックを呼び出すことも確認します。テストの一環として、モックが正しく使用されたことを確認しています。

例を挙げますと、レコードを格納するための単純なメモリー内構造を実装することでデータベースをスタブ化できます。テスト中のオブジェクトは、データベーススタブに対してレコードを読み書きしてテストを実行できるようにします。これはデータベースに関係のないオブジェクトの振る舞いをテストすることができ、テストを実行させるためだけにデータベーススタブが含まれます。

代わりに、テスト中のオブジェクトがデータベースに特定のデータを書き込んでいることを確認したい場合は、データベースをモックする必要があります。それからあなたのテストはデータベースモックに書かれたものについての主張を組み入れるでしょう。

524

他の答えは、m笑が何であるかを説明します。 exampleで説明します。そして、私を信じてください、それはあなたが思っているより実際にははるかに簡単です。

tl; drこれは元のクラスのサブクラスです。他のデータが注入されているため、注入された部分のテストを避け、残りのコードのテストのみにfocusを使用します。


IOSアプリケーションを作成していて、ネットワーク呼び出しがあるとします。あなたの仕事は、yourアプリケーションをテストすることです。ネットワークコールが期待どおりに機能するかどうかをテスト/識別することは、あなたの責任ではありません。それをテストするのは、別の関係者(サーバーチーム)の責任です。この(ネットワーク)依存関係を削除し、動作するすべてのコードを引き続きテストする必要がありますaround

ネットワークコールは、JSON応答でさまざまなステータスコード404、500、200、303などを返すことができます。

あなたのアプリはそれらのallで動作するはずです(エラーが発生した場合、アプリは期待されるエラーをスローするはずです)。モックで行うことは、「JSONファイルを使用した200コードのような」実際のネットワーク応答に似た「想像上の」を作成し、コードをテストするなしで「実際のネットワーク呼び出しを行う」ネットワークの応答を待っています」。すべての種類のネットワーク応答のネットワーク応答を手動でハードコーディング/返送し、アプリが期待どおりに動作するかどうかを確認します。 (あなたはnever間違ったデータで200を想定/テストします、それはあなたの責任ではないので、あなたの責任はyourアプリをテストすることです正しい200で、または400、500の場合、アプリが正しいエラーをスローするかどうかをテストします)

この創造的な想像力-本物に似たものは、m笑として知られています。

これを行うには、元のコードを使用できません(元のコードには事前に挿入された応答がありませんよね?)。あなたはmustに何かを追加し、通常は必要ないダミーデータ(またはクラスの一部)を挿入/挿入します。

したがって、subclass元のクラスを追加し、何でも追加します(ここでは、ネットワークHTTPResponse、データORが失敗した場合、正しいerrorString、HTTPResponseを渡します)それが必要で、「サブクラスをテストする」、つまりmockedクラスです。
元のクラスをテストしなくなりました。モック/サブクラスは、元のクラスに代わってテストされます

簡単に言えば、モックとは、テスト対象をsimplifyおよびlimitにし、クラスが依存するものをフィードすることです。この例では、テストを回避しますネットワーク呼び出し自体、代わりにtestアプリが期待どおりに動作するかどうか挿入された出力/応答で-bymockingクラス

言うまでもなく、各ネットワーク応答を個別にテストします。


今、私がいつも頭に置いていた質問は、契約/エンドポイント、および基本的に私のAPIのJSON応答が絶えず更新されるということでした。これを考慮した単体テストを作成するにはどうすればよいですか?

これについて詳しく説明するには、モデルにusernameという名前のキー/フィールドが必要だとしましょう。これをテストすると、テストに合格します。 2週間後、バックエンドはキーの名前をidに変更します。テストは引き続きパスします。右?か否か?

モックを更新するのはバックエンド開発者の責任ですか?更新されたモックを提供することは合意の一部でしょうか?

上記の問題に対する答えは、ユニットテスト+クライアント側の開発者としての開発プロセスが、時代遅れのモックされた応答をキャッチする/すべきだということです。どうやって聞いたら?答えは次のとおりです。

実際のアプリは、更新されたAPIを使用せずに失敗します(または失敗せず、目的の動作が得られません)...そのため、失敗した場合は、開発コードを変更します。これもまたテストの失敗につながります。これを修正する必要があります。 (実際に、TDDプロセスを正しく実行する場合は、テストを記述しない限り、フィールドに関するコードを記述しないでください...それが失敗するのを確認してから、実際の開発コードを記述してください。)

これはすべて、バックエンドが「モックを更新しました」と言う必要がないことを意味します...それは最終的にコード開発/デバッグを通じて発生します。 itすべてが開発プロセスの一部だからです!ただし、バックエンドがモックされた応答を提供する場合は、簡単です。

これに関する私の全体のポイントは、(更新された模擬API応答を自動化できない場合)、人間のやり取りが必要であるということです。つまり、manualJSONの更新とそれらの価値が最新であることを確認するための短い会議を持つことはあなたのプロセスの一部になります

このセクションは、CocoaHeadミートアップグループのスラックディスカッションのおかげで書かれました。


iOS開発者のみ:

モッキングの非常に良い例はこれです Natasha Muraschevによる実践的なプロトコル指向の話 ちょうど18:30にスキップしてください。

私は転写産物のこの部分が本当に好きです:

これはテスト中なので... getからGettable関数が呼び出されることを確認する必要がありますどこからの食料品の配列。呼び出されることを確認する必要があります。

68
Honey

SOに関する多くの回答と、モックに関するウェブ上の良い投稿があります。 Martin Fowler Mocks Aren't Stubs では、モックに関する多くのアイデアについて説明しています。

一段落で - モッキングは、依存関係に依存することなくコード単位のテストを可能にするための特別な手法の1つです。一般的に、他のメソッドとモックを区別することは、コードの依存関係を置き換えるために使用されるモックオブジェクトが期待を設定することを可能にするということです。


あなたの最初の質問はTypeMockに言及していたので、私はその答えを以下に残しました:

TypeMockは 商用モッキングフレームワークの名前です

RhinoMocksやMoqのような無料のモックフレームワークのすべての機能に加えて、さらに強力なオプションがあります。

あなたがTypeMockを必要とするかどうかは非常に議論の余地があります - あなたは無料のモックライブラリであなたが今までしたがったほとんどのモックをすることができます。

別の答えとして、 'TypeMocking'は実際には定義された概念ではありませんが、実行時にCLRプロファイラーを使用して.Net呼び出しを傍受し、偽造オブジェクトに対してはるかに高い能力を与えます。インタフェースや仮想メソッドが必要な場合など).

29
David Hall

モックは、実際のメソッド/オブジェクトの動作を制御された方法でシミュレートするメソッド/オブジェクトです。モックオブジェクトは単体テストで使用されます。

多くの場合、テスト中のメソッドは他の外部サービスまたはその中のメソッドを呼び出します。これらは依存関係と呼ばれます。モックアップされると、依存関係は定義したとおりに動作します。

依存関係はモックによって制御されているので、コーディングしたメソッドの動作を簡単にテストできます。これは単体テストです。

モックオブジェクトの目的は何ですか?

モック対スタブ

単体テストと機能テスト

8
Venkat Kotra

型をモッキングする目的は、テストを特定の単位に分離するために依存関係を切断することです。スタブは単純なサロゲートですが、モックは使い方を確認できるサロゲートです。モックフレームワークは、スタブとモックを生成するのに役立つツールです。

EDIT:元の文言で「型モッキング」と書かれているので、これはTypeMockに関連しているという印象を受けました。私の経験では、一般的な用語は単なる "モック"です。 TypeMockに関しては、以下の情報を無視してください。

TypeMock Isolatorは他のほとんどのモックフレームワークとは異なり、変更中のILをその場で機能させます。それによって、他のほとんどのフレームワークではモックできない型やインスタンスをモックすることができます。これらの型やインスタンスを他のフレームワークとあざけるには、独自の抽象化を提供してこれらをあざける必要があります。

TypeMockは、きれいなランタイム環境を犠牲にして大きな柔軟性を提供します。 TypeMockがその結果を達成する方法の副作用として、TypeMockを使用するとき、あなたは時々非常に奇妙な結果を得るでしょう。

5
Brian Rasmussen

モッキングはテストのために実際のオブジェクトの振る舞いをシミュレートする擬似オブジェクトを生成しています

3
LOL

TypeMockアイソレータモックフレームワークの使用はTypeMockingになると思います。

IoCを念頭に置いてコードを書く必要なしに、単体テストで使用するためのモックを生成するツールです。

3
Oded

あなたのモックがネットワーク要求を含む場合、もう一つの選択肢はヒットする本物のテストサーバーを持つことです。このサービスを使用して、テスト用の要求と応答を生成できます。 http://testerurl.com/

1
foobar8675