9

私はモックとスタブ、それらの違いと用途について読んでいます。私はまだ少し混乱していますが、私はそれの要点を持っていると思います.

今、私はアプリケーションについて疑問に思っています。実際のオブジェクトが複雑すぎて 1 つの側面をテストするには移動できないようなテスト シナリオで、「偽の」オブジェクトを作成する際に使用されることがわかります。

しかし、私のアプリケーションを考えてみましょう: 私は計算幾何学ライブラリに取り組んでいます。私たちのライブラリは、点、線、線分、ベクトル、多角形、多面体、およびその他のオブジェクトの束とすべての通常の幾何学的操作を定義します。特定のオブジェクトは、ポイントまたは方向のリスト、または下位レベルのオブジェクトとして保存されます。しかし、これらのオブジェクトの生成に数ミリ秒以上かかるものはありません。

このライブラリをテストしているとき、どこでもモック/スタブを使用するのは理にかなっていますか?

現在、特定のテストケースのみを使用しています。私たちはそれらをスタブと呼んでいますが、スタブの技術的な定義を満たしていないと思います。そのためのより良い語彙は何だと思いますか? 「テストケース」?「例」?

ソースコード: https://bitbucket.org/Clearspan/geometry-class-library/src

編集: すべてのジオメトリ オブジェクトで不変性を目指していることに注意してください。そのため、操作の結果をテストするだけで意味があり、初期オブジェクトへの状態の変更は意味がありません。

4

2 に答える 2

5

モックとスタブの根本的な違いは、モックを使用するとテストが失敗する可能性があることです。スタブはできません。スタブは、正しいプログラム フローを保証するために使用されます。アサートの一部ではありません。

モックはフローを保証するためにも使用できることに注意してください。つまり、すべてのモックはスタブでもあり、スタブは決してモックではありません。このように責任が重複しているため、今日ではモックとスタブの区別があまり見られず、フレームワークの設計者はより一般的な用語 (フェイク代用キャッチオール モックなど) を使用します。

この実現 (モック - アサート、スタブ - フロー) は、いくつかの使用シナリオを絞り込むのに役立ちます。簡単なものから始めるには...

モック

前述したように、モックはアサートで使用されます。コンポーネントの予想される動作が、この他のコンポーネントと通信する必要がある場合は、モックを使用します。それらすべて

emailSender.SendEmail(email);
endOfDayRunner.Run();
jobScheduler.ScheduleJob(jobDetails);

「そのようなパラメーターで呼び出しましたScheduleJobか?」と尋ねることによってのみテストできます。これはあなたがモックに行くところです。通常、これはモックの唯一の使用シナリオです。

スタブ

スタブの場合は少し異なります。スタブを使用するかどうかは設計上の問題です。通常の疎結合の依存性注入ベースの設計に従うと、最終的に多くのインターフェースが作成されます。

さて、テスト中、インターフェイスからどのように値を返すのでしょうか? スタブするか、実際の実装を使用します。それぞれのアプローチには長所と短所があります。

  • ライブラリで生成されたスタブを使用すると、テストの脆弱性は軽減されますが、より多くの事前作業 (スタブの設定など) が必要になる場合があります。
  • 実際の実装では、セットアップ作業は既に行われていますが、Angleクラスの変更CoordinateSystemが失敗する可能性がある場合...そのような動作は望ましいですか?

それは...ですか?どちらを使用しますか?両方!それはすべて依存しています...

仕事の単位

問題の最終部分と実際の部分に到達しました。単体テストの範囲は? 単位は?CoordinateSystem内部の仕組みと依存関係 ( AnglePoint、 ) から切り離すことができLine、それらをスタブ化できますか? それとももっと重要なことは、そうあるべきですか?

ユニットが何であるかを常に特定する必要があります。それはCoordinateSystem単独ですか、それとも重要な役割を果たしているのでしょうAngleLine? Point多くの場合、ユニットはメソッドとその周辺のエコシステムの両方によって形成されます。これには、ドメイン オブジェクト、ヘルパー クラス、拡張機能、場合によっては他のメソッドや他のクラスが含まれます。

当然、それらを分離してスタブすることもできますが、それでは... 本当にあなたのユニットですか?

于 2015-06-19T07:25:43.717 に答える
4

経験則として、動作をシミュレートする必要がある場合はモックを使用し、テストで重要なのは通信しているオブジェクトの状態だけである場合はスタブを使用します。

投稿に加えた編集を考慮して、不変オブジェクトを受け取る必要がある場合はスタブを使用しますが、オブジェクトが公開する操作を呼び出す必要がある場合はモックを使用します。この方法により、テストが失敗する傾向がありません。別のクラスの実装でのエラー。

于 2015-06-18T20:43:58.623 に答える