【问题标题】:Simple definition of stub, spy, fake and mock in unit testing单元测试中stub、spy、fake和mock的简单定义
【发布时间】:2018-09-01 18:55:03
【问题描述】:

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

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

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

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

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

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

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

提前致谢。

【问题讨论】:

    标签: unit-testing


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:
      1. 不,它们不仅仅适用于函数
      2. 是的
      3. 有点,在大多数情况下,你会监视一个对象
      4. 是的

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

      【讨论】:

        猜你喜欢
        • 2020-10-21
        • 2011-04-10
        • 1970-01-01
        • 2014-08-16
        • 1970-01-01
        • 2021-08-04
        • 2011-10-12
        • 1970-01-01
        相关资源
        最近更新 更多