选择模拟框架的关键因素是什么?


15

我希望开始使用单元测试中的对象。似乎那里有很多好的模拟框架。

  1. 不同的框架有不同的目标受众吗?
  2. 在选择适合自己情况的框架时应考虑哪些因素?

我在.Net环境中工作,但我希望该问题适用于一般的模拟框架。
epotter

Answers:


14

不同的框架有不同的目标受众吗?

是。诸如Microsoft MolesTypeMock IsolatorJustMock之类的一些框架使您能够模拟几乎任何东西。对于希望在现有遗留代码上使用它们的开发人员而言,这些模拟工具通常更好,因为可能无法将其重构为可测试性更高的设计。*

传统上,可测试的设计意味着代码库需要自由使用接口,抽象类,虚拟方法,未密封的类等。因此,传统的模拟框架(如MoqRhinoMocks)与使用测试驱动开发,依赖注入和其他这样的概念。顺便说一句,我强烈建议您使用Dependency Injection,因为您获得的不仅仅是可测试的代码,而且还有更多的可维护代码。

在选择适合自己情况的框架时应考虑哪些因素?

  • 开发活动。Moq和RhinoMocks等工具非常活跃和流行,因此是最新的。
  • 开源与 商业。考虑此比较的典型优点和缺点。成本,支持等...
  • 到期。该工具有多新。它是Beta版本(例如Microsoft Moles)还是已经发布了几个稳定版本?例如,我喜欢Moles的遗留代码,但是其中需要解决一些错误,并且还需要等待一段时间才能被解决(2011年11月发布)。
  • 文档。有几本书和博客涵盖了单元测试,模拟,自动模拟等。此外,该工具自己的文档有多好?
  • 语法。每个工具都有自己表达相同内容的方式。看看哪个更适合您。
  • 速度。使用CLR分析的工具(TypeMock,Moles,JustMock)可能比传统工具(Moq,RhinoMocks)慢得多。当您积累许多单元测试时,此速度损失可能是一个问题。经验法则是,如果测试花费的时间超过1/10秒,则它太慢了。
  • 社区支持。其他开发人员是否在编写其他工具来扩展(或称赞)模拟工具?有一个Moq.Contrib项目,为Moq添加了自动模拟功能(这有助于加快测试编写时间)。更好的是,还有AutoFixture,AutoFixture.AutoMoq,AutoFixture.AutoRhinoMocks,它们还允许自动模拟以及创建匿名变量。

*有关如何在不进行测试的情况下缓慢重构代码的方法,请参见《使用遗留代码有效工作》,以了解可与传统测试(和模拟)工具一起使用的代码。


2

起订量教程具有在此讨论了这个相对于一些特定的工具开始的背景,理念,争议权的部分:TypeMock隔离,RhinoMocks和起订量。它是为了解释Moq而写的,所以自然有点歪斜,但是当我尝试理解模拟框架中的某些差异时,我发现它对我很有帮助。

在C#模拟框架上找到对此SO线程的响应也很有用。大多数只是指用户真正发现有用的一个Mocking框架,但是HaraldV回应是讨论基于代理的模拟和基于探查器的模拟的方法。

我还能够在线找到比较表。请注意,它是从2009年开始的,因此我不确定它是否是最新的。至少有一条评论指出TypeMock和回调的信息已过时,但是即使您需要做一些工作来了解当前状态,该图表也可能有助于提出要考虑的问题: RhinoMocks,Moq,NMock,和TypeMock比较表

Google Code上有一个项目,其中包含多个模拟框架中的测试用例,可轻松进行代码比较: 模拟框架-比较


2
  1. 使用方便。一些框架具有更高级的用法。例如, 最小起订量允许使用lambda编码期望值。一些较早的库不支持此功能。
  2. 速度。每个单元测试都应该快速进行,以免整个库运行数小时。一些模拟框架具有静态生成的模拟,这是快速的。其他框架在运行时动态生成代码,这比较慢。
  3. 支持。您需要一个受修复程序积极支持并更新为支持新版本.NET的框架。
  4. 功率。我研究的大多数模拟框架在功能上都大致相同。有一个值得注意的例外。Microsoft Moles允许模拟“密封类型中的非虚拟/静态方法”。据我所知,这是其他模拟框架都无法支持的。

在我的团队中,我们选择了Microsoft Moles。它在#2,#3和#4上大获全胜,尽管它不如大多数替代方法那么习惯,并且在#1上处于低端。


现在,像TypeMock很多框架,JustMock允许嘲讽静态方法,密封类等
muruge
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.