【问题标题】:What is wrong with Stubs for unit testing?用于单元测试的存根有什么问题?
【发布时间】:2010-12-04 02:48:42
【问题描述】:

我刚刚看了这个有趣的YouTube Video about unit testing(它是带有假字幕的希特勒,因为他的团队没有做好单元测试而大骂他的团队——如果你有幽默感,请跳过它),其中存根受到严厉批评。但我不明白存根有什么问题。

我还没有开始使用模拟框架,也没有开始因为不使用而感到痛苦。

我是否会在某个时候受到伤害,having chosen handwritten stubs and fakes instead of mocks (like Rhinomock etc)?(使用 Fowler 的分类法)

在模拟存根和手写存根之间进行选择有哪些注意事项?

【问题讨论】:

  • 你欠自己使用模拟框架(我使用犀牛)。他们会做很多事情来让您的 TDD 生活更轻松。

标签: unit-testing mocking rhino-mocks stubs


【解决方案1】:

Mocks 更容易投入使用。它们是您的类的真实实例,预先存根,能够以最少的样板覆盖任何方法的操作。

有很多小问题,例如:如果您不想处理任何方法,您可以让它充当无操作或测试失败 - 您的选择 - 但无论哪种方式几乎没有代码。

当你结束一个类时,你会得到多少样板文件?如果您的课程是最终课程,您将如何处理?你是先把存根放在类路径上,还是使用不同的源?

我建议从 mocks 开始——它更容易。

【讨论】:

    【解决方案2】:

    模拟和存根用于实现真正的单元测试。您只需模拟所有依赖项,并单独对您的类进行单元测试。

    我目前正在使用 MOQ 进行模拟和存根。

    【讨论】:

      【解决方案3】:

      使用存根代替模拟没有任何问题。

      如果您想获得技术知识,模拟是具有可以验证的期望的“智能”对象。存根是返回预设值的虚拟对象。见Mocks Aren't Stubs

      但许多人(包括我自己)更喜欢使用存根进行状态测试,而不是使用模拟进行行为测试。您将一个存根注入到被测类中,调用一个方法,然后检查被测类的状态。与断言类的内部调用了带有参数 Y 的模拟对象的方法 X 相比,它倾向于使测试不那么脆弱。

      我不认为你会受到伤害。如果您还没有开始感到痛苦,那么您可能还不需要隔离/模拟框架。如果你这样做了,有手写的存根/假货不会有任何伤害。

      如果您有很多接口,或者如果您的接口有很多方法,那么隔离/模拟框架可以比手动编码存根节省大量时间。

      我非常喜欢Moq;我发现它比 Rhino Mocks 更容易用于创建存根。

      【讨论】:

        【解决方案4】:

        存根并没有错,存根、模拟......和间谍都有空间。都是“测试替身”,但用途不同,如 Mocks and Stubs aren't Spies 所述:

        [...] 在继续之前,我想 澄清和定义一些使用中的术语 这里,我最初是在 杰拉德·梅萨罗斯的xUnit Patterns book

        • 虚拟对象是传递给被测系统的占位符对象 但从未使用过。
        • 测试存根为被测系统提供间接输入
        • Test Spy 提供了一种方法来验证被测系统是否执行 正确的间接输出
        • 模拟对象为被测系统提供间接输入 以及一种验证间接输出的方法

        [...] 你可以让这个方便的图表 指导您的决定:

        PS:Mockito - The New Mock Framework on the Block 也值得一读。

        【讨论】:

        • 图表+0.5,链接+0.5
        • -1 对于图表,它基本上是错误的。模拟在断言上可能会失败,它们更容易维护,并且更容易在所有地方使用。我认为该图表可能已过时或针对旧的模拟框架或旧语言/Java 版本的框架。 (不是真的投票 -1,但那张图表很糟糕)
        【解决方案5】:

        我使用以下术语(由单元测试艺术的作者 Roy Osherove 介绍):

        fake 被称为 stub,如果你告诉它伪造某些东西,以防使用这样那样的参数调用方法。但是,如果您还验证了这样的调用确实发生了或恰好发生了 N 次,那么这种假称为 mock。简而言之。一个假的就是一个存根,除非你在它上面调用 Verify() 然后它就是一个模拟。

        显然,在某些情况下您需要使用存根,而在其他情况下需要使用模拟。因此,全面批评存根可能是错误的,而仅使用存根也可能是错误的。

        如果您还没有开始使用模拟框架(替代术语:隔离框架),您应该密切关注它们并经常重新评估您的选择。我很快就从手动模拟到 NMock2 再到 Moq。这是一个有趣的poll 程序员,展示了他们使用的东西。手动模拟/存根是少数,但并不少见。

        【讨论】:

        • 单元测试艺术(好书)和起订量(好工具)+1。
        猜你喜欢
        • 2017-04-21
        • 1970-01-01
        • 2019-01-30
        • 2012-04-07
        • 2016-01-24
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多