单元测试中存根(stub)、间谍(spy)、假冒(fake)和模拟(mock)的简单定义

JS_*_*Dev 12 unit-testing

我对单元测试很陌生。我已经阅读了这里并进行了一些谷歌搜索,但对这四种含义中的每一种含义仍然有点困惑。我发现以下定义有帮助......

存根 - 存根是接口或基类的最小实现

间谍 - 间谍将记录哪些成员被调用

假的 - 更复杂,假的可能类似于生产实现

模拟 - 模拟通常由模拟库动态创建,根据其配置,模拟可以表现得像虚拟机、存根或间谍

不过,我想简化一下含义(如果可能的话)并问几个问题。

  1. 以上所有内容是否仅与函数相关,或者它们可以是对象或任何其他类型吗?
  2. 存根- 存根本质上是一种提供虚拟信息而不是调用实际数据库的方法吗?例如,如果我有一个 API 调用,而不是实际调用 API,我只是向一个 JSON 文件发出 GET 请求,该文件位于我的测试文件夹中,其中包含一些虚拟数据,然后使用该文件而不是进行 API 调用?
  3. Spy - 这是一种跟踪函数发生情况的方法。这意味着当它被调用时你会跟随它,它会被传递到哪里?
  4. 假的- 例如,这是您在测试文件中创建的函数,用于模仿真实函数还是实际函数的简化版本?

提前致谢。

Roh*_*her 20

对于定义有多种尝试。据我所知,没有完全一致的定义,可能是因为模拟框架的定义略有不同。Martin Fowler 列出了以下内容 ( https://martinfowler.com/bliki/TestDouble.html ):

  • 虚拟对象被传递但从未实际使用。通常它们仅用于填充参数列表。
  • 对象实际上有工作实现,但通常采取一些捷径,这使得它们不适合生产(InMemoryTestDatabase 就是一个很好的例子)。
  • 存根为测试期间拨打的电话提供预设答案,通常根本不响应测试编程之外的任何内容。
  • 间谍是存根,还根据其被调用方式记录一些信息。其中一种形式可能是记录发送的消息数量的电子邮件服务。
  • 模拟是根据期望进行预编程的,这些期望形成了它们预期接收的调用的规范。如果他们收到不期望的呼叫,他们可以抛出异常,并在验证过程中进行检查,以确保他们收到了他们期望的所有呼叫。

Fowler 从这个页面获得了它们:http://xunitpatterns.com/Test%20Double.html,您可以在其中更详细地了解它们。


Joc*_*cke 1

  1. 不,它们不仅仅适用于函数
  2. 是的
  3. 有点,在大多数情况下你会监视一个物体
  4. 是的

实现和命名法取决于您使用的框架。