什么是“Stub”?

时间:2009-01-20 21:49:49

标签: unit-testing testing tdd stub

因此,继续我的新年决议以更多地使用TDD,我现在开始使用Rhino Mocks开展更多工作。

我渴望做的一件事就是确保我真正了解我所接受的内容,所以我想检查一下我对目前所看到的内容的理解(我认为这样做会很好在这里作为资源)。

什么是“存根”?

6 个答案:

答案 0 :(得分:95)

Martin Fowler在这个问题上写了an excellent article。从那篇文章:

  

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

     
      
  • 虚拟对象传递但从未实际使用过。通常它们只用于填充参数列表。
  •   
  • 虚假对象实际上有工作实现,但通常需要一些使它们不适合生产的快捷方式(在内存数据库中就是一个很好的例子)。
  •   
  • Stubs为测试期间的调用提供了固定的答案,通常根本不会对测试中编程的任何内容做出任何响应。存根还可以记录有关呼叫的信息,例如记住它'发送'的消息的电子邮件网关存根,或者可能只记录它'发送'的消息。
  •   
  • 模拟是我们在这里讨论的:预先编程了预期的对象,形成了预期接收的呼叫规范。
  •   

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

答案 1 :(得分:28)

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

  • 一个DataSet
  • 用户列表
  • 一个Xml文件

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

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

Stubs Mocks 的不同之处在于它们用于表示和测试对象的状态,而Mock测试其 >相互作用

答案 2 :(得分:7)

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

我最近遇到了这个问题,并认识到存根驱动程序之间的比较非常明确且有用:

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

+---------+-------------------------------+-------------------------------+
|         | 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                 |
+---------+-------------------------------+-------------------------------+

来自Difference between Stub and Driver

答案 5 :(得分:0)

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