【问题标题】:What are different types of test doubles and their uses?有哪些不同类型的测试替身及其用途?
【发布时间】:2020-11-19 09:16:24
【问题描述】:

我在学习测试驱动开发的在线课程时遇到了测试替身的概念。根据课程中测试替身的定义:

测试替身:测试替身是在单元测试中用来替代真实生产系统协作者的对象。

我知道测试替身是什么意思。但是后来有人提到有各种类型的测试替身。课程中提到的是:

Dummy:可以根据需要传递但没有任何类型的测试实现且永远不应使用的对象。

Fake :这些对象通常具有特定接口的简化功能实现,足以进行测试 但不适用于生产。

存根:这些对象为实现提供适合测试的预设答案。

间谍:这些对象提供了记录传入值的实现,以便测试可以使用它们。

Mocks:这些对象经过预先编程,可以期待特定的调用和参数,并且可以在必要时抛出异常。

我以前使用过模拟,并且对它们是什么以及如何使用它们有一个简要的了解。虽然我对其他提到的测试替身类型感到困惑。

有人可以帮助我区分这些类型的测试替身以及何时使用吗?

【问题讨论】:

    标签: unit-testing testing automated-tests tdd


    【解决方案1】:

    有用的文献,

    Dummy 有点奇怪,因为您使用的是 dummy,因为被测代码实际上并没有使用 dummy;换句话说,系统的组成要求你提供一些多余的元素。通常,这暗示您正在测试的逻辑应该可以通过更具体的界面访问。

    当测试场景要求被测代码从某些依赖项中获取值时,通常会使用存根和伪造。

    存根非常专注;它不会假装在内部做正确的事情,而只是返回一些预设答案。例如,您可以使用存根来模拟特定的故障模式。

    Fake 的名字很糟糕 - 它是依赖项的真正实现,只是针对测试(小型、确定性、内存中)进行了优化,而不是针对生产(规模)进行了优化。在某些圈子中,您会听到substitute,而不是“假”。

    当您试图确定您的代码将正确的信息发送到依赖项时,通常会使用间谍和模拟,而不会产生与该依赖项耦合的成本。

    间谍通常会保留他们在测试期间收到的消息的历史记录,以后可以根据预期的消息列表对其进行验证。模拟是该想法的更积极表达,其中断言是在场景运行时而不是之后对被测代码的行为进行断言。

    【讨论】:

      【解决方案2】:

      我推荐 Bob 叔叔的博文“小嘲弄者” 的简短阅读,它不仅很好地解释了测试替身的不同类型 以及这些类型之间的区别,还解释了在什么情况下使用什么类型,并通过易于理解的代码示例进行了说明。

      见:https://blog.cleancoder.com/uncle-bob/2014/05/14/TheLittleMocker.html

      【讨论】:

        猜你喜欢
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2017-10-07
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        • 2010-09-27
        • 2012-08-17
        相关资源
        最近更新 更多