伪造、嘲笑和存根有什么区别?

2024-01-09

我知道如何使用这些术语,但我想知道是否有可接受的定义faking, mocking, and stubbing用于单元测试?您如何为您的测试定义这些?描述一下您可能会使用每种方法的情况。

以下是我如何使用它们:

Fake:实现接口但包含固定数据且不包含逻辑的类。根据实现简单地返回“好”或“坏”数据。

Mock:一个实现接口的类,允许动态设置从特定方法返回的值/抛出异常,并提供检查特定方法是否已被调用/未调用的能力。

Stub:与模拟类类似,但它不提供验证方法是否已被调用/未调用的能力。

每个的生成:

  • Mocks and Stubs可以手动生成或由模拟框架生成。
  • 假课程是手工生成的。

按如下方式使用它们:

  • Mocks主要是为了验证我的类和依赖类之间的交互。
  • Stubs一旦我验证了交互并通过我的代码测试替代路径。
  • 假课程主要是为了抽象出数据依赖性,或者当模拟/存根太繁琐而无法每次设置时。

您可以获得一些信息:

From 马丁·福勒 (Martin Fowler) 关于 Mock 和 Stub http://www.martinfowler.com/articles/mocksArentStubs.html

Fake对象实际上有工作实现,但通常采取一些捷径,这使得它们不适合生产

Stubs为测试期间拨打的电话提供预设答案,通常根本不响应测试编程之外的任何内容。存根还可以记录有关呼叫的信息,例如记住它“发送”的消息的电子邮件网关存根,或者可能只记录它“发送”的消息数量。

Mocks是我们在这里讨论的内容:预先编程的对象,形成了它们预期接收的调用的规范。

From xunit模式 http://xunitpatterns.com:

Fake:我们获取或构建一个非常轻量级的实现,其功能与 SUT 所依赖的组件提供的功能相同,并指示 SUT 使用它而不是真实的组件。

Stub:此实现配置为响应来自 SUT 的调用,其值(或异常)将在 SUT 内执行未经测试的代码(请参阅第 X 页的生产错误)。使用测试存根的一个关键指标是由于无法控制 SUT 的间接输入而导致代码未经测试

模拟对象它实现与 SUT(被测系统)所依赖的对象相同的接口。当我们需要进行行为验证时,我们可以使用模拟对象作为观察点,以避免由于无法观察在 SUT 上调用方法的副作用而导致出现未经测试的需求(请参阅第 X 页的生产错误)。

亲自

我尝试使用 Mock 和 Stub 来简化。当它是一个返回设置为测试类的值的对象时,我使用 Mock。我使用存根来模拟要测试的接口或抽象类。事实上,你怎么称呼它并不重要,它们都是不在生产中使用的类,而是用作测试的实用程序类。

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

伪造、嘲笑和存根有什么区别? 的相关文章

  • Python HTTP Post 方法将响应返回为 magicmock 对象而不是值

    我正在尝试使用 POST 方法触发某些 API 后检查响应状态代码 响应状态代码是 Magicmock 实例类型 我正在使用在 python 2 中工作但引发 TypeError 的比较运算符检查状态代码是否在 400 和 500 之间在P
  • 命名空间、类和自由函数 - 什么时候需要完全限定名称

    在下面的示例中 为什么我必须完全限定 cpp 中自由函数的名称以避免链接器错误 以及为什么它适用于没有链接器错误的类函数 你能解释一下其中的区别吗 ctest h int FreeFunction void 只是一个声明 而下面是一个定义
  • 模型驱动开发:什么是转换?

    据我了解 模型驱动开发 MDD 允许自动化 通过应用转换从相应的模型自动生成程序 模型 我对转换的了解是 它们是存储开发人员特定于平台的专业知识的某种方式 但究竟什么是转型 A 程序 转型 http www semanticdesigns
  • ASP.NET Core 中 AsNoTracking 的模拟或更好的解决方法

    您如何模拟 AsNoTracking 或者是否有更好的解决方法来解决此问题 Example public class MyContext MyContextBase Constructor public MyContext DbContex
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • Bug:VS2017 Live 单元测试 - 只有减号 - 不起作用

    TL 博士 编辑6 我缩小了范围并提供了重现问题 错误的 5 个步骤 创建 VS2017 c 控制台应用程序 Net 完整框架 将方法添加到 Program cs 并使该类公开 public class Program static voi
  • 包括 PHPUnit 在内的麻烦

    我想开始为我的代码编写测试 因此我使用以下命令安装了最新的 PHPUnit wget http pear phpunit de get phpunit phar chmod x phpunit phar mv phpunit phar us
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • HTTPbis - bis 是什么意思?

    我经常看到 bis 附加到协议版本 例如 v 34bis 或 httpbis bis 是什么意思或代表什么 我认识的一位电信工程师认为它可能起源于法国 正如其他人已经说过的 bis 来自 两次 或 重复 http oxforddiction
  • 使用 Mockito 进行 Android 仪器测试 [重复]

    这个问题在这里已经有答案了 我正在尝试将 Mockito 框架与 android 仪器测试一起使用 但无法正确初始化它 我有以下测试类 class MainKontorTest extends ActivityInstrumentation
  • 是否可以证明序列是否是随机的?

    考虑以下输入 1 1 2 3 5 8 这不是随机的 2 4 8 16 32 这都不是 4 1 2 11 5 9 这个看起来像随机序列 我想问是否有这样的算法来证明输入是否是随机的 不 没有这样的证明 如果你有完全随机的数字 则每个长度为 n
  • 如何命名变量

    您使用什么规则来命名变量 哪里允许使用单字母变量 你在名字中加入了多少信息 例如代码怎么样 你最喜欢的无意义变量名是什么 在 foo 和 bar 之后 为什么它们被拼写为 foo 和 bar http en wikipedia org wi
  • 单元测试和静态方法

    阅读并学习单元测试 试图理解以下帖子 http misko hevery com 2008 12 15 static methods are death to testability 这解释了静态函数调用的困难 我不太清楚这个问题 我一直认
  • 自动夹具和起订量 v4

    我使用 Nuget 安装了 Autofixture 和 Moq 所以我有 moq 版本 4 当运行以下代码时 var fixture new Fixture Customize new AutoMoqCustomization fixtur
  • 有人真正有效地实现了斐波那契堆吗?

    你们中有人曾经实施过斐波那契堆 http en wikipedia org wiki Fibonacci heap 几年前我就这样做了 但它比使用基于数组的 BinHeaps 慢了几个数量级 当时 我认为这是一个宝贵的教训 告诉我们研究并不
  • 具有多个输入的单元测试

    我一直在尝试进行单元测试 并且正在尝试处理一个函数的单元测试 该函数的返回值取决于一堆参数 不过信息量有点大 有点让人不知所措 考虑以下 我有课Article 其中有价格集合 它有一个方法GetCurrentPrice它根据一些规则确定当前
  • 如何替换被测模块的文件访问引用

    pyfakefs https code google com p pyfakefs 听起来非常有用 它 最初是作为核心 Python 模块的一个适度的假实现来开发的 以支持中等复杂的文件系统交互 并于 2006 年 9 月在 Google
  • 编程语言之间的关系

    我想知道以下问题 这是什么意思 有些语言是 另一个的子集 超集 http www c2 com cgi wiki ForeignFunctionInterface 能 是用数学来定义的吗 是吗 与子集 超集相关 初等集合论中的概念 几乎所有
  • 如何在Python模拟中调用模拟方法

    我想创建一个模拟方法来调用被模拟的底层方法 我正在想象类似以下的内容 但我找不到任何有关模拟对象的文档 该对象包含对被模拟对象的引用 我将其表示为 wrapped method foo below from mock import patc
  • 使用 Espresso + MockK 进行 Android UI 测试时,在模拟器上使用 SIGSEGV 会崩溃,在物理设备上则正常

    我刚刚开始使用MockK模拟基于 MVP 的应用程序中的所有存储库 服务逻辑以进行 UI 测试 我有一些运行登录活动的 UI 测试 其中 Espresso 输入登录名和密码 并使用 MockK 我可以fake登录失败或无法登录的各种情况 所

随机推荐

  • 返回匿名结构的函数是否有合理的用途?

    这是一个 人工 示例 使用返回匿名结构并执行 某些 有用操作的函数 include
  • Visual Studio 2010 Ultimate 无法再创建 VC++ 项目

    突然 Visual Studio 2010 Ultimate 无法创建运行 Windows 7 的 VC 项目 例如 当我转到 新建 gt 项目 gt Visual C gt Win32 gt Win32 控制台应用程序 并执行向导时 我收
  • terraform aws_elastic_beanstalk_environment SSL 策略名称

    使用terraform 有谁知道如何设置预定义的ELB 的 SSL 安全策略 来自内部aws elastic beanstalk environment资源 我尝试了各种参数排列 从类似下面的内容中分支出来 但没有运气 setting na
  • 如何通过避免 mongodb 聚合中的空值来进行 $lookup

    在这里 我使用 lookup 到其他集合的左连接 查询工作正常 但是当某些记录缺少值时 它会返回 errmsg in requires an array as a second argument found null 查询文档结构如下 no
  • Angular 4 - 验证器自定义函数这是未定义的

    我正在构建一个应用程序 与组件 FormComponent 在里面我使用 Angular Core 的反应式表单模块 并创建一个自定义验证器 该函数正在使用 this 调用另一个函数 因为我认为它将引用 FormComponent 但它指的
  • Swift 中 `let` 和 `var` 有什么区别?

    有什么区别let and var用苹果的 Swift 语言 根据我的理解 它是一种编译语言 但它不会在编译时检查类型 这让我很困惑 编译器如何知道类型错误 如果编译器不检查类型 那不是生产环境的问题吗 当我尝试将值分配给 a 时出现此错误l
  • YouTube 视频标题背景

    我正在尝试创建一些网站模板来帮助我提高前端开发技能 因为我目前在后端工作方面做得更好 我试图在某种程度上复制我自己网站的风格 https thomas smyth co uk https thomas smyth co uk 这是一个简单的
  • ZF3会话超时问题

    我一直面临与使用 Zend Framework 3 的会话超时相关的问题 会话在 5 10 分钟内过期 我使用了会话的默认代码 Zf3 框架在全局 php如下 Session configuration session config gt
  • 如何将 GOPATH 链接到 LiteIDE?

    我已经安装了 LiteIde 并导出GOROOT and GOPATH in my bashrc 当我使用 LiteIDE 时 自动完成工作正常 但它无法构建 运行我的代码 当我查看 管理 GOPATH 时 系统 GOPATH 框是空的 我
  • 相同的 RSA 密钥、相同的消息、不同的加密[重复]

    这个问题在这里已经有答案了 我生成私钥 公钥和一个小文本文件 openssl genrsa out priv pem openssl rsa out pub pem in priv pem pubout echo A gt plain tx
  • 如何在matplotlib图中的特定位置添加网格线?

    如何在 matplotlib 图中 y 轴的特定位置添加网格 是的 这很简单 使用set x y ticks的方法axes对象并正常切换网格 import matplotlib pyplot as plt fig ax plt subplo
  • 如何在已处理的异常上停止 PyCharm 的中断/停止/停止功能(即仅在 python 未处理的异常上中断)?

    我发现 PyCharm 停止处理我的所有异常 甚至是我正在处理的异常try except堵塞 我不希望它在那里中断 我正在处理并且可能期待一个错误 但我确实希望它停止并暂停执行所有其他异常 例如 以便我拥有程序状态并对其进行调试 如何做到这
  • kafka生产者API中的标头信息

    我有一个 json 有效负载 我想将其作为生成器 Api 中的标头发送 type record created version 1 orgId userId userName correlationId jobId 以上有效负载应作为标头发
  • 正则表达式删除空 标签

    我想要这样的空跨度标签 填充有 nbsp 和空格 要删除 span nbsp nbsp nbsp span 我尝试过使用这个正则表达式 但它需要调整 span nbsp s span preg replace span nbsp s spa
  • 识别 Formik FieldArray 中已删除(创建和修改)的项目

    想知道 Formik 是否有一个本地解决方案来识别添加和删除 和更新 FieldArray以形式 我这里有沙箱上的代码https codesandbox io s jn7x2m75o9 https codesandbox io s jn7x
  • 如何使用FacesContext.getCurrentInstance(),它返回null

    在过去的几天里 我一直在为网络应用程序的登录部分而苦苦挣扎 我已经可以使用 tomcat 上的 JDBCRealm 成功验证用户身份 通过从 sql 服务器数据库读取用户 现在我想发送某种反馈当用户的帐户被阻止或凭据不正确时 这就是我现在陷
  • 通过 geopandas 连接多个 shapefile

    我试图通过实现以下内容来组合多个形状文件 import geopandas as gpd import pandas as pd for i in range 10 56 interesting files Users m3105 Down
  • 在 Visual Studio 中更改目标构建目录

    我是 Visual Studio 的新手 我导入了一个由多个子项目组成的 Visual Studio 项目 我可以构建所有这些 但我不知道 IDE 在构建后将可执行文件放在哪里 如何从 Visual Studio 获取 设置项目的目标目录
  • 如何像Crashlytics和开源PLCrashReporter一样获取崩溃行和方法

    正如我提到的 我正在尝试恢复崩溃的线路以及发生崩溃的功能 我需要提到的是 我已经尝试了 AppDelegate 中的下一个代码 并且我得到了未符号化的堆栈和类以及引发的错误 NSSetUncaughtExceptionHandler unc
  • 伪造、嘲笑和存根有什么区别?

    我知道如何使用这些术语 但我想知道是否有可接受的定义faking mocking and stubbing用于单元测试 您如何为您的测试定义这些 描述一下您可能会使用每种方法的情况 以下是我如何使用它们 Fake 实现接口但包含固定数据且不