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

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(使用前将#替换为@)

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

  • 使用 C++ 进行测试驱动开发

    希望开始用 C 进行 TDD 我见过 CPPUnit 但我想知道人们是否还有其他更喜欢的选择 感谢您的建议 我可以推荐谷歌模拟 https github com google googletest 它已成为 Google Test 捆绑的一
  • 使用 Maven 对 Android 进行单元测试

    我有一个关于使用 Maven 构建的 android 项目的问题 我们让它运行我们的活动测试 但现在我们需要它来运行单元测试 单元测试与活动测试位于同一项目中 我如何在 pom xml 文件中设置它 这是父 Pom xml 文件
  • 在测试设置和拆卸中重定向 Console.Out

    这是后续获取从单元测试中发送到 Console Out 的输出 https stackoverflow com questions 2139274 grabbing the output sent to console out from w
  • Rspec——需要存根在另一个文件中调用的 File.open

    在我的测试中 我正在初始化一个名为的新类Package带有一些参数 在此类的初始化中 我打开一个在远程机器上可用的文件 但不是本地常见的文件 我想知道如何在测试中对该方法进行存根 我正在使用 rspec 和 mocha 我尝试过类似的东西
  • AngularJs 单元测试 - 检查是否调用了“Init”函数

    我使用 jasmine 作为测试框架 并且我想测试以下控制器 我总是有一个 Init 函数 我可以在其中对此控制器进行初始化调用 现在我想测试控制器初始化时是否调用了 Init 函数 function UnitTestsCtrl var t
  • C# 压力测试 - 模拟对给定共享资源的多次访问

    如何在 C 单元测试中模拟 压力测试 100 个用户访问给定的共享资源 例如数据库 假设您正在访问真实的数据库 那么您就处于集成测试的范围内 最简单的方法是从多个线程访问资源 例如 Test public void SimpleStress
  • Android:如何测试自定义视图?

    Android 中有多种单元测试方法 测试我编写的自定义视图的最佳方法是什么 我目前正在将其作为仪器测试用例活动的一部分进行测试 但我宁愿只测试孤立的视图 对于缺乏以视图为中心的测试用例实现的一个简单解决方案是在包含视图的测试项目中创建一个
  • grailsGrails 单元测试中的应用程序访问

    我正在尝试为使用 grailsApplication config 进行一些设置的服务编写单元测试 看来在我的单元测试中 服务实例无法访问其设置的配置文件 空指针 而当我运行 run app 时它可以访问该设置 我如何配置服务以在单元测试中
  • 是否有用于运行测试组的 JUnit TestRunner?

    我目前正在使用 JUnit 4 并且需要将我的测试分为可以以任意组合有选择地运行的组 我知道 TestNG 具有注释测试以将它们分配到组的功能 但我现在无法迁移到 TestNG 看来这可以通过一些自定义注释和自定义 JUnit TestRu
  • CSV 提供的数据源第一列中存在奇数字符

    我有一个 CSV 文件 已添加到 Visual Studio 单元测试项目中 它有七列 如下所示 assessmentitemid reviewer1 reviewer2 reviewer3 reviewer4 reviewer5 revi
  • 一旦相关命令更改,如何自动运行 py.test?

    通过autonose或nosy 一旦某些测试文件或相关文件发生更改 它将自动运行nosetests 请问py test是否提供了类似的功能 有没有其他工具可以自动激发py test 您可以安装pytest xdist 插件 http pyp
  • Grails 控制器单元测试不会将页面渲染到response.text

    我的环境配置 Java 1 7u51 Grails 2 3 7 我试图断言response text在控制器测试中但它总是带 发生了什么 这是我的用户控制器 class UserController def index flash erro
  • Nunit 测试给出结果 OneTimeSetUp: 未找到合适的构造函数

    我有一个问题 NUnit 告诉我 没有找到合适的构造函数 这是什么原因造成的 我还收到另一条消息 异常没有堆栈跟踪 这两条消息只是一遍又一遍地重复 这是我的代码 TestFixture public class SecurityServic
  • 在 PyCharm 中禁用 Pytest

    如果我有一个以 test 开头的文件 PyCharm 会尝试使用 PyTest 运行该文件 我想正常运行它 作为常规 Python 脚本 我怎样才能做到这一点 Edit请参阅下面 Milo 的回答 如果由于某种原因这对您不起作用 正如 A
  • 使用 testify 模拟接口方法两次,输入和输出不同

    如何在 golang 测试中模拟接口方法两次 例如 type myCache interface Get key string data interface error type service struct cache myCache f
  • Node.js 有水豚吗?

    有谁知道 Node js 是否有类似 capybara 的东西 怎么样Zombie http zombie labnotes org 僵尸 js 使用 Node js 进行极其快速的无头全栈测试 The Bite 如果你要编写一个速度极快的
  • Symfony2 功能测试会话持久性

    我正在尝试在 Symfony 中进行一些功能测试 但目前我的会话遇到了问题 我执行了一段代码 它似乎有效 但容器的会话中没有存储任何内容 我有一个表格 您可以在其中设置数据 当您提交它时 它会检查值并将其存储在会话中 然后它重定向到另一个页
  • nodejs mocha suite 未定义错误

    我正在尝试使用摩卡运行一些测试 但似乎无法克服这个错误 E tdd nodejs cart gt mocha cart test js node js 201 throw e process nextTick error or err Re
  • save_and_open_page 已停止提供我的 CSS

    我的测试设置工作得很好 每当我打电话时 都能提供正确格式的 css 页面save and open page从测试中 然后 我设置了一些 javascript 测试 并对我的设置进行了一些更改 抱歉 我无法详细说明所有内容 我没有足够详细地
  • Objective-C – 拥有包含 TestFlight SDK 的 TestFlight 配置

    我已按照 TestFlight 的说明复制 发布 配置 我还使用 TestFlight SDK 从我的应用程序获取实时报告 通过这样做 我必须在我的应用程序中包含一些 TestFlight 代码 当然 我不想在我的应用程序的发布版本中包含此

随机推荐

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

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