Unit testing 什么是不同类型的双重测试及其用途?

Unit testing 什么是不同类型的双重测试及其用途?,unit-testing,testing,automated-tests,tdd,Unit Testing,Testing,Automated Tests,Tdd,我正在学习一门关于测试驱动开发的在线课程,偶然发现了双倍测试的概念。根据本课程双试的定义: 双重测试:双重测试是在单元测试中用作实际生产系统协作者替代品的对象 我知道双倍考试是什么意思了。但后来有人提到,有各种类型的测试双打。课程中提到的是: 虚拟对象:可以根据需要传递的对象,但没有任何类型的测试实现,不应使用 伪:这些对象通常具有特定接口的简化功能实现,该接口足以进行测试 但不是为了生产 存根:这些对象为实现提供适合测试的固定答案 Spies:这些对象提供记录传入值的实现,以便测试可以使用这些

我正在学习一门关于测试驱动开发的在线课程,偶然发现了双倍测试的概念。根据本课程双试的定义:

双重测试:双重测试是在单元测试中用作实际生产系统协作者替代品的对象

我知道双倍考试是什么意思了。但后来有人提到,有各种类型的测试双打。课程中提到的是:

虚拟对象:可以根据需要传递的对象,但没有任何类型的测试实现,不应使用

:这些对象通常具有特定接口的简化功能实现,该接口足以进行测试 但不是为了生产

存根:这些对象为实现提供适合测试的固定答案

Spies:这些对象提供记录传入值的实现,以便测试可以使用这些值

模拟:这些对象预先编程,以预期特定的调用和参数,并在必要时抛出异常

我以前使用过mock,对它们是什么以及如何使用它们有一个简单的概念。虽然我对提到的其他类型的双打测试感到困惑

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

有用的文献

  • 马丁·福勒:
  • 来自Sandi Metz:
Dummy是一种奇怪的情况,因为您正在使用一个Dummy,因为测试中的代码实际上没有使用这个Dummy;换句话说,系统的组成要求您提供一些多余的元素。通常,这暗示您正在测试的逻辑应该可以通过更具体的接口访问

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

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

Fake的名字很糟糕——它是依赖关系的真实实现,只是一个为测试(小的、确定性的、内存中的)而优化的实现,而不是为生产(规模)而优化的实现。在某些圈子里,你会听到,而不是“假”

当您试图确定您的代码是否向依赖项发送了正确的信息时,通常会使用Spies和mock,而不会产生与该依赖项耦合的成本

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

有用的文献

  • 马丁·福勒:
  • 来自Sandi Metz:
Dummy是一种奇怪的情况,因为您正在使用一个Dummy,因为测试中的代码实际上没有使用这个Dummy;换句话说,系统的组成要求您提供一些多余的元素。通常,这暗示您正在测试的逻辑应该可以通过更具体的接口访问

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

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

Fake的名字很糟糕——它是依赖关系的真实实现,只是一个为测试(小的、确定性的、内存中的)而优化的实现,而不是为生产(规模)而优化的实现。在某些圈子里,你会听到,而不是“假”

当您试图确定您的代码是否向依赖项发送了正确的信息时,通常会使用Spies和mock,而不会产生与该依赖项耦合的成本


间谍通常会保存他们在测试期间收到的消息的历史记录,稍后可以根据预期的消息列表进行验证。mock是这种想法的一种更积极的表达方式,在场景运行时,而不是在场景运行之后,对测试代码的行为进行断言。

我推荐Bob叔叔的博客文章《小Mocker》的简短阅读这不仅很好地解释了双重测试的不同类型以及这些类型之间的区别,还解释了在何种情况下使用何种类型,并用易于理解的代码示例进行了说明


请参阅:

我推荐Bob叔叔的博客文章《小嘲笑者》的简短阅读,这篇文章不仅很好地解释了双重测试的不同类型以及这些类型之间的区别,还解释了在何种情况下使用何种类型,并用易于理解的代码示例进行了说明

见: