什么是“存根”?

Posted

技术标签:

【中文标题】什么是“存根”?【英文标题】:What is a "Stub"? 【发布时间】:2010-10-02 13:45:26 【问题描述】:

所以,为了更多地参与 TDD,我将继续我的新年决心,现在我开始更多地与 Rhino Mocks 合作。

我热衷于做的一件事是确保我真正了解我正在研究的内容,所以我想检查一下我对到目前为止所看到的内容的理解(我认为最好在这里进行作为资源)。

【问题讨论】:

你先提出问题,然后给出答案? 如问题中所述 - 我正在寻找我的理解是否正确的验证,我希望答案在这里(无论是否是我的)以提供有关这个问题的资源 - 但-很少得到很好回答的问题:) 在常见问题解答中还指出,回答自己的问题是使用该网站的有效方式 - 事实上,应该鼓励这样做。 回答你自己的问题很好,虽然这个问题本身有一点噪音(自传),并且没有努力寻找答案,没有人试图尝试做什么找到答案。 【参考方案1】:

Martin Fowler 就这个主题写了an excellent article。从那篇文章:

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

虚拟对象被传递,但从未实际使用过。通常它们只是用来填充参数列表。 假对象实际上有工作实现,但通常采取一些捷径,使它们不适合生产(内存数据库就是一个很好的例子)。 存根对测试期间的呼叫提供预设答案,通常根本不响应任何超出测试编程的内容。存根还可以记录有关呼叫的信息,例如记住它“发送”的消息的电子邮件网关存根,或者可能只记录它“发送”的消息的数量。 Mocks 就是我们在此讨论的内容:预编程了期望的对象,这些期望构成了它们期望接收的调用的规范。

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

【讨论】:

那么fake objects和sutbs有什么区别呢?正如您所说,它们具有相同的作用,不是吗? @LKM 一个假对象是一个实际的对象,它实现了真正的功能并做事。存根只是“固定答案”,例如。硬编码 JSON 结果,模拟从 Web 服务器返回的内容。【参考方案2】:

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

一个数据集 用户列表 一个 Xml 文件

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

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

StubsMocks 的不同之处在于它们用于表示和测试对象的 状态,而 Mock 则测试其 >互动

【讨论】:

感谢您的回答,但我还是不明白:“接口的实现”?? 这就像从 NetworkManager 类继承并覆盖您只关心的方法,以便它可以返回固定数据(而不是使用常规方法的代码)。一个示例是覆盖返回固定数据对象的获取请求方法,而不是通过常规获取请求进行实际网络调用的测试。【参考方案3】:

我相信“存根”来自 STARTUpBlock。它用于指代自动生成的代码部分,以帮助开发人员开始使用。

【讨论】:

我不认为这是正确的。大概来自家庭建设中的这种做法:hunker.com/12000314/what-is-a-stub-out【参考方案4】:

我最近遇到了这个问题,并意识到 StubDriver 之间的这种比较非常清晰且很有帮助:

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

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

来自Difference between Stub and Driver

【讨论】:

【参考方案5】:

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

【讨论】:

如果更详细地解释这个答案会更好:存根方法的目的是什么?它是如何使用的?为什么它很重要? 谢谢!我刚接触编程,刚开始学习软件开发。到目前为止,这就是我对存根方法的理解。所以我不太确定它的目的、重要性以及如何使用它。但我认为存根方法实际上是用于测试特定类的方法的方法。它用于在您的实际开发方法中为局部变量输入一些值并检查输出是否正确。找到代码中的错误很重要。如果您还有其他要添加或更正的内容,请发表评论。我目前正在学习测试。 你在学习真是太好了!您应该编辑您的原始答案,以便未来的读者可以轻松地从中学习,而不是在 cmets 中发布。此外——如果您不确定某事,为什么要发布有关它的权威答案? 如果您是自学者,那很好——在 *** 上,除非您确定答案,否则您无需发布答案。这不是一个标准的论坛。见:***.com/tour 非常感谢您的指导和建议。真的很感激!【参考方案6】:

经过一些研究并基于我在编码人员生活中遇到的存根文件,我会说存根文件只是一个包含文件的全部或部分实现的文件。它可以帮助开发人员开始编码。

【讨论】:

以上是关于什么是“存根”?的主要内容,如果未能解决你的问题,请参考以下文章

什么是存根例程?

什么是“存根”?

编程中的“存根”是啥意思?

Dubbo本地存根是什么,Dubbo本地伪装又是什么?

RhinoMocks - 存根返回参数的方法

为啥在 REST 中没有存根?