单元测试中存根,间谍,伪造和模拟的简单定义

时间:2018-09-01 18:55:04

标签: unit-testing

我对单元测试非常陌生。我在这里已经阅读并做了一些谷歌搜索,但是对于这四种含义的含义仍然有些困惑。我遇到了以下定义,该定义对您有帮助。...

  

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

     

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

     

伪造-更复杂的是,伪造品可能类似于生产实施方式

     

模拟-模拟通常由模拟库动态创建,并且根据其配置,模拟的行为可能类似于虚拟对象,存根或间谍

但是,我想简化意思(如果可能的话),并提出几个问题。

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

谢谢。

2 个答案:

答案 0 :(得分:0)

  1. 不,它们不仅适用于函数,而且适用于其他
  2. 大多数情况下,您会监视一个物体

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

答案 1 :(得分:0)

有多次尝试定义。据我所知,没有完全一致的定义,可能是由于模拟框架对事物的定义略有不同。马丁·福勒(Martin Fowler)列出了以下(https://martinfowler.com/bliki/TestDouble.html):

  • 虚拟对象被传递但从未实际使用过。通常它们仅用于填充参数列表。
  • 伪造对象实际上具有有效的实现,但是通常采用一些快捷方式,这使其不适用于生产(InMemoryTestDatabase是一个很好的示例)。
  • 存根为测试期间进行的呼叫提供罐装答案,通常不会对测试中编程的内容做出任何反应。
  • 间谍是存根,它们还会根据调用方式记录一些信息。其中一种形式可能是电子邮件服务,它记录发送了多少消息。
  • 通话进行了预编程,并设定了预期的期望,从而形成了预期会收到的呼叫的规范。如果他们收到不希望的电话,并且可以在验证过程中进行检查以确保收到了所有期望的电话,则可以抛出异常。

福勒在http://xunitpatterns.com/Test%20Double.html页上有它们,您可以在其中详细了解它们。

相关问题