什么是“存根”?


116

因此,继续执行我的新决议,以更多地参与TDD,我现在开始与Rhino Mocks合作

我热衷于做的一件事是确保我确实了解自己将要从事的工作,因此我想检查一下我对到目前为止所见内容的理解(我认为将其作为一个完整的内容会很好。资源)。

什么是“存根”?


6
首先您问一个问题,然后给出答案?
empi

17
如问题中所述-我正在寻找验证我的理解是正确的,我希望答案在这里(无论是我的还是不存在),以提供有关这个广为提出但很少得到很好回答的问题的资源: )
罗伯·库珀

42
常见问题解答中也指出了回答自己的问题的有效方法,该方法实际上是应鼓励的。
Erik Forbes,2009年

回答您自己的问题很好,尽管问题本身有点杂音(自传),并且不显示寻找答案的努力,也没有倾诉该人为找到答案所做的努力。
eric

Answers:


112

马丁·福勒(Martin Fowler)在这个问题上写了一篇很棒的文章。从那篇文章:

Meszaros使用术语Test Double作为测试对象代替真实对象使用的任何假装对象的通用术语。该名称源于电影中的“特技替身”概念。(他的目标之一是避免使用任何已经被广泛使用的名称。)然后,Meszaros定义了四种特殊的double类型:

  • 虚拟对象可以传递,但从未实际使用过。通常它们仅用于填充参数列表。
  • 伪对象实际上具有有效的实现,但是通常采取一些捷径,这使它们不适合生产(内存数据库就是一个很好的例子)。
  • 存根提供对测试期间进行的呼叫的固定答复,通常通常根本不响应为测试编程的内容。存根还可以记录有关呼叫的信息,例如电子邮件网关存根,它可以记住“已发送”的消息,或者仅记住“已发送”的消息数量。
  • 嘲笑是我们在这里谈论的内容:对象被预编程并带有期望,这些期望形成了期望接收的呼叫的规范。

用我自己的话来说:模拟对象“期望”要在其上调用的某些方法,并且如果不满足他们的期望,通常会导致单元测试失败。存根对象提供固定的响应(并且可以由帮助程序库自动生成),但通常不会直接导致单元测试失败。通常仅使用它们,以便您正在测试的对象获取完成其工作所需的数据。


2
那么伪造的物品和sutbs有什么区别?如您所述,它们具有相同的作用,不是吗?
LKM

4
@LKM假对象是一个实际的对象,可以实现真正的功能并执行操作。存根只是“罐头答案”,例如。硬编码的JSON结果模仿了从Web服务器返回的结果。
user3344977

31

“存根”是接口的实现,该接口存在以提供数据/某种响应。例如:

  • 数据集
  • 用户列表
  • Xml文件

通常,这将由另一个服务(例如Web服务,另一个应用程序,数据库)提供,但是为了提高代码的可测试性,结果是“伪造的”。

这样做的主要好处是,它允许在单元测试中根据期望的数据进行断言。如果由于数据错误而导致错误,则可以轻松地添加测试,创建新的存根(复制数据错误),并生成纠正错误的代码。

存根Mocks的不同之处在于,存根用于表示和测试对象的状态,而Mock则用于测试其交互


感谢您的回答,但我仍然不明白:“接口的实现” ??
BKSpurgeon '16


3

“存根”或“存根方法”被设计为入门代码或临时替代尚待开发的代码。这是由IDE生成的内置代码。存根方法实际上是用于测试特定类的方法的方法。通过在您实际的开发方法中为局部变量输入一些值并检查输出是否正确来使用它。在代码中查找错误很重要。


如果更详细地解释,此答案会更好:存根方法的目的是什么?如何使用?它为什么如此重要?
伊万·韦斯堡

谢谢!我是编程新手,刚开始学习软件开发。到目前为止,这是我对存根方法的了解。因此,我不太确定其目的,重要性以及如何使用它。但是我认为存根方法实际上是用于测试特定类的方法的方法。通过在您的实际开发方法中为局部变量输入一些值并检查输出是否正确来使用它。查找代码错误很重要。如果您要添加或更正其他内容,请发表评论。我目前正在学习测试。
Nasserr

1
很高兴您正在学习!您应该编辑原始答案,以便将来的读者可以轻松地从中学习,而不必在评论中发布。此外,如果您不确定某件事,为什么还要发布有关此问题的权威性答案?
埃文·魏斯堡

1
如果您是一个自学的学生,那很好-在StackOverflow上,除非您确定答案,否则无需发布答案。这不是标准论坛。请参阅:stackoverflow.com/tour
Evan Weissburg,

1
非常感谢您的指导和建议。真的很感激!
Nasserr

3

我最近遇到了这个问题,并且认识到StubDriver之间的这种比较确实很清楚并且很有帮助:

基本上,存根和驱动程序是例程,除了声明自己和接受的参数外,它们实际上不做任何事情。然后,其余代码可以采用这些参数并将其用作输入。

+ --------- + ------------------------------- + ------- ------------------------ +
| | 存根| 驱动程序
+ --------- + ------------------------------- + ------- ------------------------ +
| 类型 虚拟代码| 虚拟代码|
+ --------- + ------------------------------- + ------- ------------------------ +
| 用于 自上而下的集成| 自下而上的整合|
+ --------- + ------------------------------- + ------- ------------------------ +
| 目的| 允许测试鞋面| 允许测试较低的|
| | 级别的代码,当| 级别的代码,当|
| | 较低级别的代码是| 代码的上层是|
| | 尚未开发。| 尚未开发。|
+ --------- + ------------------------------- + ------- ------------------------ +
| 例子 A和B是组件。| A和B是组件。|
| | A ---> B | A ---> B |
| | | |
| | 已经开发了。| 仍然需要开发。
| | B仍然需要开发。B已开发。|
| | 因此,使用存根| 因此,使用驱动程序|
| | 代替B模仿它。| 代替A模仿|
| | | |
| | A --->存根| 驱动程序---> B |
+ --------- + ------------------------------- + ------- ------------------------ +

存根和驱动程序之间的差异


0

经过一些研究,并根据我在编码器使用过程中遇到的存根文件,我会说存根文件只是一个文件,包含整个或部分实现的文件。它帮助开发人员开始编码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.