gpt4 book ai didi

.net - 仅仅使用接口(interface)来促进单元测试中的 stub 和模拟现在已经过时了吗?

转载 作者:行者123 更新时间:2023-12-03 23:46:55 24 4
gpt4 key购买 nike

在 .NET 中,TypeMock Isolator 和 Microsoft Moles 允许隔离任何类、属性或方法——无论是密封的、静态的、 protected 还是非虚拟的。因此,在 Moq 或 Rhino Mocks 中不可能模拟的东西,现在不再是这样了。

我一直对使用接口(interface)只是为了能够允许模拟的想法有些反感,否则只会存在具体的类。我并不孤单(见 hereherehere )。在后面,它暗示“现代”模拟框架不再需要用于测试或依赖注入(inject)的接口(interface)。

但是,虽然我不能代表 TypeMock Isolator,但我可以说在 Microsoft Moles 中使用 Mocks 非常慢。在单元测试中使用如下代码会使测试速度太慢而不能经常使用:

MFile.ReadAllLinesString = (s) => csvDataCorrectlyFormatted;
MDirectoryInfo.AllInstances.GetFilesString = (di,fi) => fileInfoArray;
MFileInfo.AllInstances.NameGet = (fi) => "Doesn't Matter";

我敢肯定,如果正在测试的方法被编程为接口(interface)或抽象基类(以便文件系统代码可以在某种包装器中抽象出来),那么使用像 Moq 这样的框架进行 stub 或模拟最终会更快.但随后我们又回到了为基本单元测试能力增加生产代码复杂性的情况。

我倾向于认为 Isolator 和 Moles 只有在无法使用传统的模拟框架进行模拟时才应该使用。然而,我仍然在为测试而增加生产代码复杂性的想法苦苦挣扎。

我很好奇社区的其他人是怎么想的。

2010 年 10 月 6 日更新:通过说我为测试而增加生产代码复杂性的概念而斗争,我指的是在不需要时添加接口(interface)(甚至是抽象类),例如在制作具体类时非密封和虚拟方法会做。后者仍然允许接缝进行测试。即使后来发现需要为多个实现使用一个接口(interface),他们不能从类中提取它吗?但除非出现这种需要,否则为什么不关注 YAGNI .

我完全赞成 SOLID 原则,它们使程序的体系结构更易于维护。我不认为在任何情况下都需要虔诚地遵循这些原则。我认为“它总是取决于”的口头禅多次发挥作用。否则,每个具体类型都有一个接口(interface)或抽象基类,即使只有一个实现。

最后,我并不是说,因为 Isolator 和 Moles 允许人们绕过基于动态代理的框架中的隔离限制,人们仍然不应该将架构设计为可维护的。在许多情况下,SOLID 原则是最好的,因此不需要隔离器或 Moles。我质疑的是界面仅用于测试的情况。我也提出了另一个关于速度的观点。如果一个人选择使用隔离器和鼹鼠,它似乎会带来速度惩罚。所以我当然不认为他们使基于动态代理的框架过时了。

最佳答案

这确实是一个有趣的问题,我有时会从测试新手那里听到。在我看来,Moles/Typemock 并不能真正与 mocking 框架相提并论,它们肯定不是替代品。这是我的主要论点:

  • 虽然物有所值,但 Typemock 的初始许可成本相当可观(每个席位约 800 美元),这也是为什么一些经理不愿投入这么多钱的原因。另一方面,Moles 是免费的,但需要相当多的工作来设置 Moles 程序集,并且附带一个非常奇怪的“API”,这很难学习 - 特别是如果您完全不熟悉测试。
  • Typemock 和 Moles 并不是严格意义上的“模拟框架”——它们是某种分析器,在底层使用运行时工具。因此,它们带来了相当大的性能影响。我没有具体的数据,但根据我自己的经验,我估计仪器测试要慢 100-400% 左右(Typemock 似乎比 MS Moles 快)!对于包含数千个测试的大型测试电池,这本身可能是一个障碍。
  • 最后同样重要的是,杀手论点:模拟框架迫使您不仅要使用接口(interface),但迫使您应用高度解耦和可维护的设计在您的软件上(沿着 SOLID 的行)。 - 请记住:主要考虑成本的不是软件的初始编写,而是维护! - 使用 Typemock 或 Moles,您基本上可以为所欲为,这确实是一件坏事,也是反对使用 Typemock 或 Moles 开发的主要论据。

  • 结论:
  • 如果你想用测试覆盖一个棕地项目,而编写时根本没有考虑到可测试性,那么你必须使用 Typemock 或 Moles 之一(在我看来,Typemock 是更好的选择)。
  • 如果你正在开始一个新项目(即你正在做一个新项目),那么使用一个模拟框架(我个人喜欢 Moq 因为它的简单性)并使用 MS Moles 作为你不能拥有的东西的补充(例如 .NET 框架类型)的接口(interface)。

  • 甚至 Typemock 的首席开发者 Roy Osherove 也是这么说的(希望他不会因此而惹上老板的麻烦):
    A customer switches to MOQ – and I’m happy

    但是有一个异常(exception):如果从头开始学习测试驱动开发,那么使用 Typemock 甚至对于新代码也可能是有益的。这样,您可以显着拉平 TDD 学习曲线......

    托马斯

    关于.net - 仅仅使用接口(interface)来促进单元测试中的 stub 和模拟现在已经过时了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3869002/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com