测试软件:假与存根

zap*_*dlo 29 testing terminology stub

有很多关于存根和模拟的文章,但我看不出假和存根之间的真正区别.谁能对它有所启发?

Tho*_*rin 34

我假设你指的是Meszaros引入的术语.Martin Fowler也经常提到他们.我认为他在那篇文章中很好地解释了这种差异.

不过,我会用自己的话再试一次:)

虚假比存根更接近现实世界的实现.存根基本上包含对预期请求的硬编码响应; 它们通常用于单元测试,但除了预编程之外,它们无法处理输入.

假货有一个更真实的实现,比如可以保留的某种状态.它们可用于系统测试以及单元测试目的,但由于某些限制或质量要求,它们不适用于生产用途.


all*_*ode 21

一个假的具有相同的行为,它代替的东西.

一个存根有一个"固定"设定的"罐头"响应特定于你的测试(S).

一个模拟有一组关于由呼叫的预期.如果不满足这些期望,则测试失败.

所有这些都是相似的,因为它们取代了在测试用途下编码的生产合作者.


ket*_*ura 6

套用 Roy Osherove 在他的书《单元测试的艺术》(第二版)中的话:

赝品是模仿其他物体而制作的任何物体。假货可以用作存根或模拟。

存根是一个假的,它提供给您正在测试的类以满足其要求,但在单元测试中会被忽略

模拟是提供给您正在测试的类的伪造品,并将作为单元测试的一部分进行检查以验证功能

例如,MyClass您正在测试的类可能会使用本地记录器和第三方 Web 服务作为其操作的一部分。您可以创建 aFakeLogger和 a FakeWebService,但它们的使用方式决定它们是存根还是模拟。

可以FakeLogger用作存根它被提供给MyClass记录器并假装是记录器,但实际上忽略所有输入,否则只是为了MyClass正常运行。您实际上并没有检查FakeLogger单元测试,就您而言,它是为了让编译器关闭。

FakeWebService可以用作模拟您将其提供给MyClass,并在您调用的一个单元测试中调用MyClass.Foo()该测试,该测试应该调用第三方 Web 服务。为了验证是否发生了这种情况,您现在检查您的FakeWebService电话,看看它是否记录了它应该收到的呼叫。

请注意,其中任何一个都可以颠倒,具体取决于您在特定单元测试中测试的内容。如果您的单元测试正在测试正在记录的内容,那么您可以制作一个FakeLogger尽职尽责地记录它所告诉的所有内容的文件,以便您可以在单元测试期间询问它;现在这是一个模拟。在同一个测试中,您可能不关心第三方 Web 服务何时被调用;你FakeWebService现在是一个存根。因此,如何填写 fake 的功能取决于它是否需要用作存根或模拟或两者兼而有之。

总结一下(直接引用书中的内容):

假对象是一个通用术语,可用于描述存根或模拟对象,因为它们看起来都像真实对象。。。。基本区别在于存根不会使测试失败。模拟可以。

其余的都是实施细节。


Ara*_*ram 5

这可能有所帮助

  • 第一个链接显示了这个主题有多复杂,以及没有两个人似乎共享相同的定义.作为一个例子,StackOverflow问题的答案[伪造,模拟和存根之间有什么区别?](http://stackoverflow.com/questions/346372/whats-the-difference-between-faking-mocking-and-stubbing )与Thorarin对这个问题的回答相比,似乎颠倒了Stub和Fake的定义. (3认同)
  • 对不起,但最好的做法是总结链接的相关部分,以防它们死亡.答案应该不仅仅是链接. (3认同)