代码之家  ›  专栏  ›  技术社区  ›  Tetha

模拟…和验证?

  •  2
  • Tetha  · 技术社区  · 17 年前

    让我详细说明一下,给定两个组件a和B,a使用B,那么B有一个特定的“向上契约”,a有一个特定的“向下契约”。基本上这意味着:如果a正确地使用B,B正确地行为,那么这两个契约都将得到履行,事情也将正常运行。

    我认为mock是一种保证给定测试用例所需的向上契约的子集的方法。例如,数据库连接可能具有向上协定,以检索较早插入的数据记录。数据库连接模拟保证返回某些记录,而无需将它们插入数据库。

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

    你好,特莎

    2 回复  |  直到 14 年前
        1
  •  1
  •   Jon Skeet    17 年前

    这才是真正的问题 difference between mocks and stubs -mock准确地验证了这一点(或者至少可以这样做——您可以在大多数框架中使用mock作为存根)。本质上,mock允许您执行以下操作 协议测试 而不仅仅是“如果你打电话给X,我就给你Y”。我使用的每一个模拟框架都允许您轻松地验证“所有这些调用都是发出的”和“这些调用是按特定顺序发生的”。

    您在组件之间实施的协议越多,测试就越脆弱-有时这是完全合适的(例如“您” 必须 之前 您可以执行任何其他操作),但很容易在每次更改实现时都必须更改测试,即使是以合理的方式。

        2
  •  1
  •   Black    17 年前

    有人这样做吗?

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

    例如,您可以使用DB模拟来检查 特别是,如果您有与其他子系统的接口,

    电话或某种注册,然后你的 子系统接口也可以实现这一点。


    这工作值得吗?

    这取决于您希望测试的深度,让我给您一些不同“深度”的示例:

    1. 如果您想检查接口调用的正确顺序,那么一个简单的状态机就足够了。
    2. 如果要验证接口语言(示例中为SQL)的正确使用,必须使用解析器。
    3. 如果您想验证它是否能与真实的子系统一起工作,那么就进行集成测试(不能用实体模型完成)。

    如果适当,应该这样做。但是,您不能期望模型能够发现接口的每一次错误使用。例如,如果两个并发事务导致死锁,数据库模型几乎无法检测。