模拟......和验证者?

时间:2008-11-08 10:10:17

标签: testing mocking

目前,我正在深入研究测试技术,即使我不确定我是否仍然居住在unittest-land或者已经进入集成测试的土地。

让我详细说明一下,鉴于A和B两个组成部分和A使用B,那么我们对B有一定的“向上合同”和A的某个“向下合同”。基本上这意味着:如果A使用B正确且B行为正确,然后两个合同都将完成,事情将正常工作。

我认为模拟是一种保证给定测试用例所需的向上合同子集的方法。例如,如果先前已插入数据记录,则数据库连接可能具有向上合同以检索数据记录。数据库连接模拟保证返回某些记录,而不需要将它们插入数据库。

但是,我目前想知道是否有办法验证向下合同。给定数据库连接的示例,向下合同可能是:您必须连接到数据库并确保连接存在并正常工作并输入正确的SQL查询。

有人做过这样的事吗?对于更复杂的合同,这是值得的吗? (例如,数据库连接可能需要SQL解析器才能完全验证对数据库层的调用)

问候,tetha

2 个答案:

答案 0 :(得分:1)

有人这样做吗?

是的,我有时会使用模拟来验证“向下合同”。

E.g。如果正确,您可以使用DB mock进行检查 用于登录的凭据。 特别是,如果您有其他子系统的接口, 然后你可以模拟它们并让模型检查使用情况 违法行为。

E.g。如果子系统需要初始化 打电话或某种注册,然后你的模拟 子系统接口也可以强制执行此操作。


这值得工作吗?

这取决于你想要测试的深度,让我给你一些不同“深度”的例子:

  1. 如果您想检查对接口的正确调用顺序,那么一个简单的状态机就足够了。
  2. 如果要验证接口语言的正确用法(在您的示例中为SQL),则必须使用解析器。
  3. 如果您想验证它是否真的适用于真实的子系统,那么进行集成测试(不能用模型完成)。
  4. <强>结论:

    如果合适,应该这样做。但是,您不能指望模型可以找到接口的每个错误用法。例如。如果两个并发事务导致死锁,数据库模型几乎检测不到。

答案 1 :(得分:1)

这实际上是difference between mocks and stubs - 模拟确切地验证了(或者至少可以这样做 - 你可以使用模拟作为大多数框架的存根)。从本质上讲,模拟允许你进行协议测试,而不仅仅是“如果你打电话给我,我会给你Y”。我使用的每个模拟框架都可以让您轻松验证“所有这些调用都已完成”和“这些调用以特定顺序发生”等内容。

您在组件之间执行的协议越多,测试就越脆弱 - 有时这是完全合适的(例如,“ )但是很容易最终得到每次更改实现时都要更改的测试,即使是以合理的方式。