web-dev-qa-db-ja.com

ユニットテストの用語の概要(スタブとモック、統合と相互作用)?

私は自分のプロジェクトでより多くの単体テストを使用していて、オンラインで入手できるすべての情報を読んでいて、多くの用語に混乱しています。結果として、私はおそらく会話やグーグル検索でこれらの用語を間違って使用しています。

誰かが「偽の」タイプやテストのタイプ(交互作用と統合)のようなすべての単体テスト用語の概要を説明できますか?

35
John Farrell

モックvs.フェイクvs.スタブに関しては、実際には、人々がそれらを解釈するいくつかの異なる方法があります。私は通常借ります マーティンファウラーによって定義された意味

  1. スタブオブジェクトは有効な応答を提供しますが、静的です。どの入力を渡しても、常に同じ応答が得られます。
  2. 偽のオブジェクトは実際のオブジェクトのように機能しますが、実際のデータベースの代わりにマップを使用してデータを格納するDAOなど、より単純な方法で処理します。
  3. モックオブジェクトはモックテストケースで使用されます-それらは特定のメソッドがそれらのオブジェクトで呼び出されることを検証します。

相互作用テストは、オブジェクト間の相互作用が正しいことを確認する(期待されるメソッドが呼び出されることを確認する)単体テストを指す一般的な用語です。これは、結果の状態が正しい限り、メソッドで何が発生するかを気にしない状態(または従来の)テストとは対照的です。これらのタイプのテストは、上記でリンクしたFowlerの記事で比較されています。

統合テスト 実際には単体テストの側面ではなく、単体テストより上のレベルです。異なるユニットを取り、それらが正しく連携することを確認します。

51
Kaleb Brasee

MSN Magazineのこの 記事 は、用語を説明し、例といくつかのソースコードを使用して詳細に説明しています。

基本的にこれらはテストダブルです:

  • ダミー -ダミーには実装が含まれていません
  • スタブ -スタブは、インターフェイスまたは基本クラスの最小限の実装です
  • スパイ -スパイはどのメンバーが呼び出されたかを記録します
  • -より複雑な、偽物は本番実装に似ている可能性があります
  • モック -モックは通常、モックライブラリによって動的に作成され、その構成に応じて、モックはダミー、スタブ、またはスパイのように動作します。
12
svengali_no

ファウラーはもちろん、区別するのに素晴らしい仕事をしました モックとスタブ しかし、私にとっては、 XUnitテストパターン 本がリファレンスであり、チェックすることをお勧めします モック、フェイク、スタブ、ダミー 包括的な比較。

ええ、私は知っています、これは混乱しているので、チェックすることをお勧めします モックとスタブはスパイではありません 、次に スパイしましょう そして最後に モッキート-ブロック上の新しいモックフレームワーク も。

さまざまなタイプのテストに関して、簡単な説明は次のようになります(これは完全なリストではありません)。

  • ユニットテスト:単一の「ユニット」、メソッドを分離してテストする
  • 統合テスト:複数のユニット(メソッド、クラス、コンポーネント、レイヤー)の統合をテストします
  • 機能テスト:エンドツーエンドシナリオのテスト(ユーザーの観点から)

これらのタイプはすべて便利で排他的ではなく、実際には同じ意図を持っていません。

6
Pascal Thivent

私は読んだ(そして心からお勧めする) The Art of Unit Testing by RoyOsherove。彼は簡略化された一連の用語を使用しています。

彼の本を言い換えると...

統合テスト-現在のプロセスまたはオブジェクトの外部に到達して他の何かと対話するテスト

相互作用テスト-オブジェクトが連携する方法のテスト

状態テスト-操作によって生成された結果のテスト

Fake-本物の代わりに使用される代用オブジェクト

Stub-テスト対象のコードに必要な依存関係を提供する代用オブジェクト

モック-テストの結果を確認するために使用される代役

ここでは、スタブとモックの両方をモックフレームワークによって提供できることに注意してください。区別は、使用されるテクノロジーと同じくらい、それらがどのように使用されるかについてです。

4
Bevan
4
Ray Tayek