测试替身有哪些不同类型及其用途?

2024-01-10

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

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

我知道测试双打是什么意思了。但后来有人提到,测试替身有多种类型。课程中提到的内容是:

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

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

Stub:这些对象提供了适合测试的预设答案的实现。

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

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

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

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


有用的文献,

  • from Martin Fowler:
    • 测试双精度 https://martinfowler.com/bliki/TestDouble.html
    • 模拟不是存根 https://martinfowler.com/articles/mocksArentStubs.html
  • from Sandi Metz:
    • 测试的魔术 https://www.youtube.com/watch?v=URSWYvyc42M

虚拟是一种奇怪的情况,因为您使用虚拟是因为被测试的代码实际上并不使用虚拟;换句话说,系统的组成需要你提供一些多余的元素。通常,这暗示您正在测试的逻辑应该可以通过更具体的接口访问。

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

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

Fake 的名字很糟糕——它是依赖项的真实实现,只是针对测试(小型、确定性、在内存中)进行了优化,而不是针对生产(规模)进行了优化。在某些圈子里,你会听到代替 https://github.com/eventide-project/useful-objects#substitutes,而不是“假”。

当您尝试确定代码是否将正确的信息发送到依赖项而不需要耦合到该依赖项时,通常会使用间谍和模拟。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测试替身有哪些不同类型及其用途? 的相关文章

  • CMake - 作为构建过程的一部分运行测试并将标准输出捕获到文件

    我们有几个单元测试 我们希望将其作为构建过程的一部分运行 为了实现这一目标 我有一个帮助程序脚本 它创建一个运行测试的自定义命令 如果成功 则创建一个文件 test name passed 然后我添加一个自定义目标 test name ru
  • 开玩笑错误意外的令牌...(ES6)

    每当我在命令行中运行 jest 时 都会收到以下错误 Test suite failed to run Users
  • spring中如何进行单元测试验证注解

    我在类中有一些注释 例如 public class ProductModel Pattern regexp 1 1 9 0 9 message Quantity it should be number and greater than ze
  • Perl 单元测试只针对模块,而不针对程序吗?

    我在网上找到的文档和我拥有的书 Perl测试 或者说或者建议 Perl 的单元测试通常是在创建模块时完成的 这是真的 有没有办法使用单元测试实际程序Test More和表兄弟姐妹 当然 您可以使用测试脚本测试 更多 http search
  • 测试 - 存根服务方法未定义

    我已经在非常简单的代码上编写了一个非常简单的测试 但由于某种原因存根服务方法未定义 当我使用 Jasmine Spy 时 它可以工作 但对于这样一个简单的任务 有人可以解释一下为什么会发生这种情况吗 我删除了 import 语句只是为了减少
  • FakeItEasy 代理方法调用实际实现

    我正在尝试将对假对象的调用代理到实际的实现 这样做的原因是我希望能够使用 Machine Specifications 的 WasToldTo 和 WhenToldTo 它们仅适用于接口类型的伪造 因此 我正在执行以下操作来代理对我的真实对
  • 使用 IQueryable 进行单元测试代码

    我被要求为某些功能编写一些单元测试 但坦率地说 我不太确定这样做的必要性或有用性对于这个特殊的一段代码 我绝不试图质疑单元测试的必要性或有用性 所讨论的代码非常简单并且被大量使用 基本上它是 Skip 和 Take 扩展方法的包装 在我看来
  • Scala 的代码覆盖率工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在调试器模式下运行 perl 测试?

    我尝试在调试器下运行测试 perl d which prove t file t 但这没有任何效果 因为每个测试都是作为单独的作业运行的 我已经发现 exec选项 但是当我提供它时 我失去了任何选项 proverc文件和命令行 prove
  • django RequestFactory 文件上传

    我尝试使用 RequestFactory 创建请求并使用文件发布 但我没有收到 request FILES from django test client import RequestFactory from django core fil
  • 用于 Kotlin 中单元测试的 BuildConfigField 模拟

    我正在尝试尽可能多地涵盖Kotlin Android 库我遇到了有关自定义 BuildConfig 变量的问题 更广为人知的是buildConfigField 我想模拟这个变量来测试两者true and false values 从 Gra
  • 如何阻止与 RSpec 和 Capybara 的外部连接?

    在我的 Rails 项目中 我想编写非理想条件的测试 例如缺乏互联网连接或超时 例如 我正在使用 gem 来联系 API 并且希望确保在我的应用程序和外部 API 之间存在连接问题时能够正确处理错误 我已经可以通过用录像机制作固定装置并从
  • 如何在 Angular 单元测试中模拟/触发 $routeChangeSuccess?

    给定一个附加到 routeChangeSuccess 事件的处理程序来更新 rootScope 上的 title 属性 rootScope on routeChangeSuccess function event current previ
  • Expresso 的 Android 测试首选项片段

    我在通过 Expresso 测试我的代码时遇到问题 我写了这段代码 public class SettingsActivity extends Activity Override protected void onCreate Bundle
  • 如何对我的自定义验证属性进行单元测试

    我有一个自定义的 asp net mvc 类验证属性 我的问题是如何对其进行单元测试 测试类是否具有该属性是一回事 但这实际上并不能测试其中的逻辑 这就是我想测试的 Serializable EligabilityStudentDebtsA
  • 茉莉花单元测试 - 测试对象的未定义属性

    我有以下声明 expect A BAR name toEqual foo 由于我的对象 A 具有顶级属性 BAR 并且 bar 具有值 foo 传递 我想测试我的结构以确认属性 NONEXISTINGPROP 尚未定义 例如 expect
  • 在 Angular 单元测试中应该如何处理运行块?

    我的理解是 当您在 Angular 单元测试中加载模块时 run块被调用 我认为如果你正在测试一个组件 你不会想同时测试run块 因为unit测试应该只是测试一个unit 真的吗 如果是的话有什么办法可以防止run阻止运行 我的研究让我认为
  • 使用 Moq 测试接受委托的方法

    我的代码正在使用一个实现这样的接口的组件 public interface IFoo void DoSomething string p1 void DoSomething string p1 Action
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • Spark scala 模拟 Spark.implicits 用于单元测试

    当尝试使用 Spark 和 Scala 简化单元测试时 我使用 scala test 和mockito scala 以及mockito Sugar 这只是让你做这样的事情 val sparkSessionMock mock SparkSes

随机推荐

  • 如何开始黑莓编程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 编码文件路径

    net 中是否有内置方法可以像编码 url 一样对文件路径进行编码 例如 如果我的文件名中有非法字符 例如 whatever whatever 我希望它对 进行编码 这样它仍然存在 只是进行编码以便系统接受它 我想做类似的事情Path En
  • php,while()循环中的无限循环

    infinite loop x 1 while x 9 echo x x 我不明白背后的原因 为什么上面的代码会导致无限循环 在我看来 上面的代码应该输出 9 一次 但它输出无穷无尽的999999999 首先 当 x 等于 1 时 whil
  • Smack 的 FileTransferManager.createOutgoingFileTransfer 仅接受完整的 JID。如何在 Smack 中确定用户的完整 JID?

    经过几个小时的调试并试图找出为什么使用 aSmack 无法进行文件传输 而正常的消息传递却可以 我终于设法将其确定为这一点 当我按照 Smack 文档中给出的方法获取用户的名册列表时 Openfire 服务器发送的名册 JID 末尾缺少 C
  • 使用当前行值更新变量

    我正在尝试执行一项复杂的操作 其中我提取整列数据的总和 并从每行的总和中减去运行小计 我可以单独完成 Sum 和 Running Subtotal 的组成部分 用它来运行小计 sum UsageMetric over order by Ne
  • IE9、表格和显示:块

    对于我网站的低宽度移动版本 我切换了display某些的table tr td and th to block 让它们垂直堆叠 我使用此技术来允许宽表继续显示其所有内容 而不会溢出其容器之外 它在所有现代 5 种浏览器中都能完美运行 但在
  • 如何在 Android 中以最佳方式调整位图大小?

    假设我有一个六边形 如果我调整它的大小以在包含六边形网格的应用程序中使用它 bgPaint new Paint bgPaint setAntiAlias true bgPaint setDither true Bitmap coloredB
  • iOS - 如何使用 NIB 中的特定框架初始化自定义 UIView

    我想知道初始化自定义的最干净的方法是什么UIView具有特定的框架 The UIView是由一个设计的XIB file 这是我的实现 class CustomView UIView IBOutlet var outletLabel UILa
  • 为 Debian Lenny 编译 OpenCV 2.4.2

    为了保留问答方面 我在最新 v 2 4 2 OpenCV 版本中遇到了一个奇怪的问题 安装失败并出现以下错误 在 OpenCV 2 4 2 modules core src system cpp 460 包含的文件中 OpenCV 2 4
  • 如何告诉 CMake 在 Windows 上使用 Clang?

    我有一个使用 CMake 构建的 C 项目 我通常在 OSX 上构建 但现在我正在尝试让 Windows 版本也能工作 出于兼容性原因 我想在 Windows 上使用 Clang 我从 LLVM 安装了预编译的 Clang 3 8 二进制文
  • 为什么无法在组合框中选择空值?

    在 WPF 中 似乎不可能从组合框中选择 使用鼠标 空 值 Edit澄清一下 这是 NET 3 5 SP1 这是一些代码来说明我的意思 首先 C 声明 public class Foo public Bar Bar get set publ
  • 使用别名更改默认 python 版本

    我想知道是否使用alias在终端中更改默认的Python版本对脚本中Python的后续调用有积极的影响吗 例如 我使用 alias python python36 run program 现在假设 run program 是一个调用多个嵌套
  • Scala - 动态类加载 - A 类无法转换为 A 类

    我有一个包含类的简单 jar 文件A public class A 然后我在运行时加载它 var classLoader new URLClassLoader Array my jar file toURI toURL var clazz
  • 如何用另一个 CSS 覆盖 CSS 中定义的背景图像?

    我有一个 Core css 它定义了网站的页面背景图像以及主题 但对于特定页面 我只想更改背景 关于如何在单独的 CSS 文件中实现这一点有什么建议吗 该页面的 HTML 是 core css 定义 body background imag
  • 当 UIView 变得可见时,如何收到通知?

    每当 UIView 对用户可见时 即当 UIScrollview 是某些 UIView 的超级视图时 是否有一种方法可以获取通知 回调或其他方式来调用方法 并且此类 UIView 的 ViewController 应在以下情况下收到通知 它
  • 根据用户输入将单词中的字母加粗

    我的应用程序中有一个搜索组件 当用户输入一些文本时 它会根据用户输入过滤数据并显示过滤数据的列表 我想要做的是将用户搜索的文本在过滤后的数据中加粗 例如 如果我搜索 Jo 过滤后的数据应显示为John Joseph Joe Rogan 我可
  • 爆炸函数后将值添加到一个数组

    我正在尝试从所有行获取所有路径并将它们 爆炸后 添加到一个数组中 以便将它们显示为复选框 这是我的代码 result mysql query select path from audit where ind ind exp array wh
  • SPOJ ADDREV 问题

    我确实浏览了其他线程SPOJ http en wikipedia org wiki SPOJ问题 ADDREV https www spoj pl problems ADDREV 添加反转数字 但遗憾的是 我无法通过我编写的三个程序 C P
  • 即使我调用 componentHandler.upgradeDom(),汉堡包图标也不会显示;

  • 测试替身有哪些不同类型及其用途?

    我正在学习有关测试驱动开发的在线课程 并遇到了测试替身的概念 根据课程中测试替身的定义 测试双打 测试替身是在单元测试中用于替代实际生产系统协作者的对象 我知道测试双打是什么意思了 但后来有人提到 测试替身有多种类型 课程中提到的内容是 D