TDD 中驱动程序和存根之间的区别

Difference between Drivers and Stubs in TDD

我在 Ruby 和 TDD 方面有相当程度的使用 Rspec 的经验,主要用于后端单元测试。

我最近开始学习测试背后的理论,包括一些新概念; DriversStubs.

这些术语的定义在网上似乎各不相同,而且混淆多于帮助。

据我所知,存根是 Rspec 中的双打? 不确定在哪里放置驱动程序?

任何人都可以阐明这一点吗?

简而言之,存根是您的测试代码调用的测试替身,并期望从中获得一些 return 值。创建了一个驱动程序来模拟对被测代码的调用者。

例如,如果你想测试一个用户认证登录组件。无需使用外部 LDAP 服务器测试组件,您可以创建一个具有最少甚至没有逻辑的存根来伪造 "authenticated" 或 "not authenticated" 响应。然后你可以创建一个驱动程序来伪造一个调用者(一个 HTML 页面,一个控制器等),将请求发送到身份验证组件。

Robert (Uncle Bob) Martin and Gerard Meszaros进一步解释不同类型的测试替身:

  1. Dummy - 最简单的测试替身,不采取任何操作,return 值尽可能接近于零(例如类型的零值)。
  2. Stub - returns 值最接近测试需求的测试替身。如果您的测试需要 true 才能通过,存根将 return true.
  3. Spy - 除了 returning 测试所需的值外,Sp​​y 还会记录测试执行期间是否发生了某些步骤。例如,在测试计算器的算术加法时,间谍会检查以确保调用了 + 运算符。如果没有进行此类调用,间谍将无法通过测试。
  4. True Mock - 真正的 Mock 比间谍有更多的行为。它具有内部验证以确保某些断言在您的测试执行期间发生。

需要注意的是,测试替身的行为越多,偏离实际系统真实行为的可能性就越大。就个人而言,如果可能的话,我尽量避免测试双打。如果我真的必须创建它们,我会从最简单的形式开始让我的测试通过。

最后,术语令人困惑,而且经常被错误使用。就我个人而言,不会太在意它,只会使用在特定情况下适合我的最简单的解决方案。