”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 模拟与存根:了解主要区别

模拟与存根:了解主要区别

发布于2024-11-07
浏览:242

Mock vs Stub: Understanding the Key Differences
在软件测试中,模拟与存根是两种流行的测试替身类型,用于模拟依赖关系。它们通过在测试期间用受控替代品替换真正的依赖项来帮助隔离组件的行为。虽然模拟和存根都有类似的用途,但根据测试场景的类型,它们的使用方式有所不同。
本文深入探讨了模拟和存根之间的主要区别、它们的用例以及何时在测试策略中使用它们。

什么是测试替身?
测试替身是测试期间用于代表真实依赖项的任何对象或组件的通用术语。目标是隔离被测组件并消除可能影响测试结果的外部因素。模拟和存根是两种类型的测试替身,通常用于单元和集成测试。

什么是存根?
存根是一个测试替身,当被测试的组件调用时,它返回预定义的数据。当被测试的组件需要来自依赖项的输入,但依赖项的实际行为与测试结果无关时,通常使用它。存根提供受控响应,使您可以只关注组件内部的逻辑。

存根示例:
假设您正在测试支付处理功能。您无需调用真正的支付网关,而是使用始终返回“支付成功”响应的存根,确保可以独立测试函数中的逻辑。

const paymentGatewayStub = {
  processPayment: () => "payment successful"
};

function processOrder(paymentService) {
  const result = paymentService.processPayment();
  return result === "payment successful" ? "Order Complete" : "Order Failed";
}

// Test
console.log(processOrder(paymentGatewayStub));  // Output: "Order Complete"

在这种情况下,存根确保外部服务始终返回预期的输出,从而更容易测试内部逻辑。

什么是模拟?
模拟是一个测试替身,它不仅提供假数据,还验证组件之间的交互。模拟有助于确保使用正确的参数调用正确的方法,并确保在执行期间发生所需的事件顺序。当组件的行为或交互对测试很重要时,通常使用它们。
模拟示例:
使用相同的付款示例,假设您想要验证 processPayment() 方法在订单处理期间仅被调用一次。

const paymentGatewayMock = {
  processPayment: jest.fn().mockReturnValue("payment successful")
};

function processOrder(paymentService) {
  paymentService.processPayment();  
}

// Test
processOrder(paymentGatewayMock);
expect(paymentGatewayMock.processPayment).toHaveBeenCalledTimes(1);

在这种情况下,模拟通过检查方法是否被调用来验证交互,确保组件在执行过程中行为正确。
模拟和存根之间的主要区别
方面模拟存根
目的 验证组件之间的交互 ​​提供预定义的响应
行为 验证方法调用和参数 仅返回静态数据
使用场景 交互重要时使用 数据输出足够时使用
复杂性 实施起来更复杂 创建起来更简单
测试验证方法调用示例 具有固定响应的测试逻辑

何时使用存根
• 测试简单逻辑:当您只需要控制依赖项的输出时,请使用存根。
• 数据驱动测试:如果重点是测试组件在特定数据下的行为方式,则存根更合适。
• 示例用例:如果您正在测试需要数据库中的用户数据的登录功能,请使用存根返回虚拟用户,而不调用真实数据库。
何时使用模拟
• 基于交互的测试:如果重点是确保使用正确的参数调用正确的方法,请使用模拟。
• 测试复杂的交互:模拟非常适合与多个服务或API 交互的组件。
• 示例用例:如果您正在测试电子邮件发送服务,请使用模拟来验证是否使用预期的收件人和消息调用了 sendEmail() 函数。
模拟和存根可以一起使用吗?
是的,在某些情况下,模拟和存根在同一测试中一起使用,以实现交互验证和受控响应。例如,您可以使用存根返回特定数据,并使用模拟来验证是否调用了特定服务。
模拟和存根的优点和缺点
存根的优点:
• 简单且易于实施
• 对于单独测试组件逻辑很有用
存根的缺点:
• 无法验证方法调用或参数
• 仅限于静态响应
模拟的优点:
• 验证行为、交互和序列
• 对于具有多个依赖关系的复杂场景很有用
模拟的缺点:
• 需要更多设置并且可能使测试更难以阅读
• 如果使用不小心,可能会导致脆弱的测试
模拟与存根:您应该使用哪一个?
• 如果您的测试依赖于依赖项的输出并且您想要控制该输出,请使用存根。
• 如果您需要验证方法是否被调用或验证组件之间的交互,请使用模拟。
• 对于单元测试,更常用存根,因为重点是测试内部逻辑。
• 对于集成测试,在验证系统不同部分如何交互时,模拟更有用。

结论
模拟和存根在测试策略中都发挥着重要作用,但各自有不同的目的。存根控制依赖项返回的数据,而模拟则确保组件之间发生正确的交互。了解何时以及如何使用每种方法可以提高测试质量,从而获得更可靠的软件。通过正确应用模拟和存根,团队可以减少错误、加快开发速度,并为单元测试和集成测试创建更好的测试策略。

版本声明 本文转载于:https://dev.to/keploy/mock-vs-stub-understanding-the-key-differences-1e36?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Python中嵌套函数与闭包的区别是什么
    Python中嵌套函数与闭包的区别是什么
    嵌套函数与python 在python中的嵌套函数不被考虑闭合,因为它们不符合以下要求:不访问局部范围scliables to incling scliables在封装范围外执行范围的局部范围。 make_printer(msg): DEF打印机(): 打印(味精) ...
    编程 发布于2025-07-04
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-07-04
  • input: Why Does "Warning: mysqli_query() expects parameter 1 to be mysqli, resource given" Error Occur and How to Fix It?

output: 解决“Warning: mysqli_query() 参数应为 mysqli 而非 resource”错误的解析与修复方法
    input: Why Does "Warning: mysqli_query() expects parameter 1 to be mysqli, resource given" Error Occur and How to Fix It? output: 解决“Warning: mysqli_query() 参数应为 mysqli 而非 resource”错误的解析与修复方法
    mysqli_query()期望参数1是mysqli,resource给定的,尝试使用mysql Query进行执行MySQLI_QUERY_QUERY formation,be be yessqli:sqli:sqli:sqli:sqli:sqli:sqli: mysqli,给定的资源“可能发...
    编程 发布于2025-07-04
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-07-04
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-07-04
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-07-04
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-07-04
  • Java中假唤醒真的会发生吗?
    Java中假唤醒真的会发生吗?
    在Java中的浪费唤醒:真实性或神话?在Java同步中伪装唤醒的概念已经是讨论的主题。尽管存在这种行为的潜力,但问题仍然存在:它们实际上是在实践中发生的吗? Linux的唤醒机制根据Wikipedia关于伪造唤醒的文章,linux实现了pthread_cond_wait()功能的Linux实现,利用...
    编程 发布于2025-07-04
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 c...
    编程 发布于2025-07-04
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-07-04
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-07-04
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-07-04
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-07-04
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-07-04
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-07-04

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3