在软件测试中,模拟与存根是两种流行的测试替身类型,用于模拟依赖关系。它们通过在测试期间用受控替代品替换真正的依赖项来帮助隔离组件的行为。虽然模拟和存根都有类似的用途,但根据测试场景的类型,它们的使用方式有所不同。
本文深入探讨了模拟和存根之间的主要区别、它们的用例以及何时在测试策略中使用它们。
什么是测试替身?
测试替身是测试期间用于代表真实依赖项的任何对象或组件的通用术语。目标是隔离被测组件并消除可能影响测试结果的外部因素。模拟和存根是两种类型的测试替身,通常用于单元和集成测试。
什么是存根?
存根是一个测试替身,当被测试的组件调用时,它返回预定义的数据。当被测试的组件需要来自依赖项的输入,但依赖项的实际行为与测试结果无关时,通常使用它。存根提供受控响应,使您可以只关注组件内部的逻辑。
存根示例:
假设您正在测试支付处理功能。您无需调用真正的支付网关,而是使用始终返回“支付成功”响应的存根,确保可以独立测试函数中的逻辑。
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() 函数。
模拟和存根可以一起使用吗?
是的,在某些情况下,模拟和存根在同一测试中一起使用,以实现交互验证和受控响应。例如,您可以使用存根返回特定数据,并使用模拟来验证是否调用了特定服务。
模拟和存根的优点和缺点
存根的优点:
• 简单且易于实施
• 对于单独测试组件逻辑很有用
存根的缺点:
• 无法验证方法调用或参数
• 仅限于静态响应
模拟的优点:
• 验证行为、交互和序列
• 对于具有多个依赖关系的复杂场景很有用
模拟的缺点:
• 需要更多设置并且可能使测试更难以阅读
• 如果使用不小心,可能会导致脆弱的测试
模拟与存根:您应该使用哪一个?
• 如果您的测试依赖于依赖项的输出并且您想要控制该输出,请使用存根。
• 如果您需要验证方法是否被调用或验证组件之间的交互,请使用模拟。
• 对于单元测试,更常用存根,因为重点是测试内部逻辑。
• 对于集成测试,在验证系统不同部分如何交互时,模拟更有用。
结论
模拟和存根在测试策略中都发挥着重要作用,但各自有不同的目的。存根控制依赖项返回的数据,而模拟则确保组件之间发生正确的交互。了解何时以及如何使用每种方法可以提高测试质量,从而获得更可靠的软件。通过正确应用模拟和存根,团队可以减少错误、加快开发速度,并为单元测试和集成测试创建更好的测试策略。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3