我有 Ruby 和 TDD 方面的经验,在一定程度上使用 Rspec,主要用于后端单元测试。
我最近开始学习测试背后的理论,包括一些新的概念; 驱动程序
和 stub
。
这些术语的定义在网上似乎各不相同,而且混淆多于帮助。
据我所知, stub 是 Rspec 中的 double ? 不确定在哪里放置驱动程序?
任何人都可以阐明这一点吗?
最佳答案
简而言之, stub 是您的测试代码调用的测试替身,并期望从中获得一些返回值。创建了一个驱动程序来模拟对被测代码的调用者。
例如,如果你想测试一个用户认证登录组件。无需使用外部 LDAP 服务器测试组件,您可以创建一个具有最少甚至没有逻辑的 stub 来伪造“已验证”或“未验证”响应。然后,您可以创建一个驱动程序来伪造一个向身份验证组件发送请求的调用方(HTML 页面、 Controller 等)。
Robert (Uncle Bob) Martin和 Gerard Meszaros进一步解释不同类型的测试替身:
- Dummy - 最简单的测试替身,它不执行任何操作并返回尽可能接近于无的值(例如类型的零值)。
- Stub - 一个测试替身,返回最接近测试需求的值。如果您的测试需要
true
才能通过, stub 将返回true
。 - Spy - 除了返回测试所需的值外,Spy 还会记录在测试执行期间是否发生了某些步骤。例如,在测试计算器的算术加法时, spy 会检查以确保调用了
+
运算符。如果没有进行此类调用, spy 将无法通过测试。 - 真正的模拟 - 真正的模拟比 spy 有更多的行为。它具有内部验证以确保某些断言在您的测试执行期间发生。
需要注意的是,测试替身的行为越多,偏离实际系统真实行为的可能性就越大。就个人而言,如果可能的话,我尽量避免测试 double 。如果我真的必须创建它们,我会从最简单的形式开始,以使我的测试通过。
最后,术语令人困惑,而且经常被错误使用。就我个人而言,我不会太在意它,只会使用在特定情况下适合我的最简单的解决方案。
关于unit-testing - TDD 中驱动程序和 stub 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32075861/