LoginSignup
66
56

More than 5 years have passed since last update.

テストダブルの種類

Posted at

スタブとモックの違いというのを書いたのですが、書いているとき「テストダブル」という用語についてよく知らないまま書いていました。それをコメントで指摘され、改めて調べてみました。

5種類のテストダブル

テストスタブ

実際の依存コンポーネントにかわりテスト対象に間接入力を行うもの。そのテスト内では間接入力の値を確定できる。

RSpecでいう
allow(hoge).to revceive(:fuga).and_return('foo')

テストスパイ

テスト対象が他のコンポーネントに間接出力を行う場合、実際のコンポーネントの代わりにメッセージを受け取り記録するもの。モックとの違いは事前に期待する値を知っていて、一致しているかどうか検証を行うかどうか。

RSpecでいうと
expect(hoge).to have_received(:fuga)

モックオブジェクト

テスト対象が他のコンポーネントに間接出力を行う場合、実際のコンポーネントの代わりにメッセージを受け取り事前に教えられている期待したメッセージと一致しているかどうか検証するもの。

RSpecでいう
expect(hoge).to receive(:fuga)

フェイクオブジェクト

実際の依存コンポーネントと同じAPIを持っており、似たような挙動をするもの。ローカルでAmazon S3やSQSと同じAPIを提供しテストを行いやすくするライブラリなどがあたるかと。

ダミーオブジェクト

厳密にはテストダブルには含まれないそうですが。
メソッド呼び出しを検証する際、検証しなくても良い引数に入れる適当なオブジェクト。RSpecで anything に対応するものであるかと。

用語

一般的に使われる訳語があるかもしれませんが、ここでは個人的にわかりやすいと思うように訳しました。

  • テスト対象(system under test):
    テストの対象になる物。単体テストであればクラス・オブジェクトであり、結合テストであればアプリケーションそれ自体になる。

  • 依存コンポーネント(depend on component)
    テスト対象が依存しているコンポーネント。

  • 間接入力(indirect input):
    テスト対象の振る舞いが依存する他のコンポーネントからの返り値に依存する場合、その返り値を間接入力という。

  • 間接出力
    パブリックなAPIからは見えないテスト対象の振る舞いによって、他のコンポーネントに送られるメッセージ。入力を受取り出力を返すメソッドが、内部でログを書き出している場合など。

66
56
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
56