当谈到软件测试时,Fakes、Mocks和Stubs是常见的测试概念,用于模拟和替代某些组件以便进行有效的测试。它们的主要区别在于其行为和使用方式:

  1. Fakes(仿件): Fakes是一种实现了某个功能的简化版本。它们通常用于替代真实的组件,例如数据库或外部服务,在测试中使用。与真实的组件相比,仿件可能会被简化,使得测试更加可控和可预测。它们不仅提供了相似的接口,还能模拟基本的功能,以便进行测试。

  2. Mocks(模拟对象): Mocks是为了验证被测系统的交互而创建的对象。它们通常用于模拟其他组件或对象的行为,以便测试某个特定组件的交互是否正确。Mocks可以记录函数调用和传递给它们的参数,以便进行后续的验证。

  3. Stubs(存根): Stubs也是一种替代组件,但它们更多地关注于提供预定义的硬编码响应而不是模拟完整的行为。通常,Stubs会返回预定义的数据或操作,以便测试某些特定的路径或场景。

简而言之,这些概念都是用于测试中模拟或替代外部依赖的方法。Fakes提供了更真实的行为,Mocks用于验证交互,而Stubs则关注于提供简单的预定义响应。选择使用哪种取决于你所测试的系统、场景和需求。

Fake

Fake 是那些包含了生产环境下具体实现的简化版本的对象,但与生产对象不同。通常他们会采取一些捷径并提供生产代码的简化版本。

image.png

这个假的实现不会涉及数据库,但会使用一个简单的集合来存储数据。这使我们能够进行服务的集成测试,而无需启动数据库和执行耗时的请求。

Stub

Stub 代指那些包含了预定义好的数据并且在测试时返回给调用者的对象。Stub 常被用于我们不希望返回真实数据或者造成其他副作用的场景。 image.png

从数据库获取一些数据以响应方法调用的对象。我们引入了一个存根并定义了应该返回哪些数据,而不是真正的对象。

Mock

Mocks 代指那些仅记录它们的调用信息的对象,在测试断言中我们需要验证 Mocks 被进行了符合期望的调用。 image.png

当我们并不希望真的调用生产环境下的代码或者在测试中难于验证真实代码执行效果的时候,我们会用 Mock 来替代那些真实的对象。典型的例子即是对邮件发送服务的测试,我们并不希望每次进行测试的时候都发送一封邮件,毕竟我们很难去验证邮件是否真的被发出了或者被接收了。我们更多地关注于邮件服务是否按照我们的预期在合适的业务流中被调用,其概念如下图所示:

Reference