“存根”是什么?

因此,继续我的新年决心,以获得更多的 TDD,我现在开始与 犀牛模仿者更多的工作。

我热衷于做的一件事就是确保我真正理解我正在进入的领域,所以我想检查一下我到目前为止所看到的东西(我认为把它作为一种资源放在这里会很好)。

“存根”是什么?

82490 次浏览

“ stub”是一个接口的实现,该接口用于提供某种类型的数据/响应。例如:

  • 数据集
  • 用户名单
  • 一个 XML 文件

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

这样做的一个主要好处是,它允许在基于预期数据的单元测试中进行断言。如果错误是由数据错误引起的,那么可以很容易地添加测试,创建新的存根(复制数据错误)并生成代码来纠正错误。

存根 不同于 嘲笑,因为它们用于表示和测试对象的 国家,而 Mock 测试它的 互动

马丁•福勒(Martin Fowler)在 一篇优秀的文章上撰写了这篇文章:

Meszaros 使用术语 Test Double 作为任何类型的假想对象的通用术语,用于代替实际对象进行测试。这个名字来源于电影中的特技双人秀。(他的目标之一是避免使用任何已被广泛使用的名称。)梅萨罗斯随后定义了四种特殊的双重性:

  • 虚拟对象被传递,但从来没有实际使用过。通常它们只是用来填充参数列表。
  • 假对象实际上有可工作的实现,但通常采用一些不适合生产的快捷方式(内存中的数据库就是一个很好的例子)。
  • 存根为测试期间打出的电话提供录制的答案,通常对测试程序之外的任何东西都没有任何反应。存根也可以记录电话信息,比如一个电子邮件网关存根可以记住它“发送”的消息,或者可能只记住它“发送”的消息数量。
  • 我们在这里讨论的是模仿: 预编程的带有期望的对象,这些对象构成了它们期望接收的调用的规范。

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

我相信“存根”来自于 STartUpBlock。它用于引用自动生成的代码的一部分,以帮助开发人员开始工作。

“ stub”或“ stub 方法”被设计成初始代码或尚未开发的代码的临时替代品。这是 IDE 生成的内置代码。存根方法实际上是用于测试特定类的方法的方法。它用于在实际的开发方法中为局部变量输入一些值,并检查输出是否正确。发现代码中的 bug 很重要。

我最近面对这个问题,认识到 存根司机之间的这种比较是非常清楚和有益的:

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

+---------+-------------------------------+-------------------------------+
|         | Stub                          | Driver                        |
+---------+-------------------------------+-------------------------------+
| Type    | Dummy codes                   | Dummy codes                   |
+---------+-------------------------------+-------------------------------+
| Used in | Top Down Integration          | Bottom Up Integration         |
+---------+-------------------------------+-------------------------------+
| Purpose | To allow testing of the upper | To allow testing of the lower |
|         | levels of the code, when the  | levels of the code, when the  |
|         | lower levels of the code are  | upper levels of the code are  |
|         | not yet developed.            | not yet developed.            |
+---------+-------------------------------+-------------------------------+
| Example | A and B are components.       | A and B are components.       |
|         | A ---> B                      | A ---> B                      |
|         |                               |                               |
|         | A has been developed.         | A still needs to be developed.|
|         | B still needs to be developed.| B has been developed.         |
|         | Therefore, stub is used       | Therefore, driver is used     |
|         | in place of B to imitate it.  | in place of A to imitate it   |
|         |                               |                               |
|         | A ---> Stub                   | Driver ---> B                 |
+---------+-------------------------------+-------------------------------+

来自 存根与驱动程序的区别

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