.NET平台测试驱动开发模拟框架Moq简明教程(简介)<转>

简介:

一、简介

目前针对测试驱动开发技术的研究在国内看来还少得可怜,估计这主要是国内的软件开发实际所致(急功近利型颇多)。所以,针对目前比较优秀的测试框架以及模拟框架的介绍也不多见。鉴于此,我想借这篇短文,对目前.NET平台上最新出炉的模拟对象框架—Moq作一简介。Moq的发明者声称,较之于其他的模拟对象框架(例如Rhino Mocks和TypeMock Isolator),这个框架更易于学习和使用。

具体来看,Moq框架中充分利用了VB.NET和C#语言的最新特征,例如lambda表达式与泛型的概念。因此,当你使用Moq创建模拟对象时,你可以使用lambda表达式来描述你想要模拟的方法与属性等。由于提供了对于最新的lambda表达式的支持,Moq得以能够提供一种格外清晰的语法形式来描述期望值、参数约束和返回值等。

根据Moq的作者的说法,你可以把“Moq”发音为“Mock-You”或者干脆与“Mock”一致。名称“Moq”源于Mock和Linq的组合。既然Moq使用的是lambda表达式而不是Linq表达式,所以名字“Mambda”似乎更为准确一些。

Moq框架的维护者为Daniel Cazzulino。你可以阅读Daniel Cazzuiono关于Moq的博客入口:
http://www.clariusconsulting.net/blogs/kzu/archive/category/1062.aspx。

本文中我们集中讨论的是Moq的2.5版本,其实这并不是最新的(例如下文图中给出的2.5.3版本下载后的文件名字),但是基本代表了这个框架的最新特征。

二、背景与争论

关于模拟框架的使用,一直以来存在一些争论。目前在.NET平台上主要存在三个流行的Mock框架,它们分别是:Typemock Isolator,Rhino Mocks和Moq。其中,TypeMock Isolator因其功能过于强大而受到批评;相反地,Moq也因过于简单也受到同样的批评。为什么会存在这种看似荒诞的批评呢?

一些人批评Typemock Isolator的功能过于强大。批评者认为,TypeMock Isolator可能会导致鼓励糟糕的软件设计,因为你有可能使你在代码框架的设计方面产生惰性,理由是编写可模拟的代码应该能够迫使开发者编写出更良好的代码。现在的情形是,Typemock Isolator能够支持你模拟出任何东西,甚至是你想模拟的一切。因此,批评者认为,这个工具并没有把开发者引导到良构代码的编写道路上。他们甚至还打了另一个比方,说Typemock Isolator就像把一个核武器交给一个仅仅四岁的小孩使用一样。

在Typemock Isolator被批评其功能过于强大的同时,Moq则被批评其功能过于简单。抱怨者认为,Moq混淆了模拟与代理。如果你想深入理解上述批评观点,必须具备一定的背景知识才行。为此,你不妨参考驱动开发权威Martin Fowler曾写过一篇标题为“Mocks Aren't Stubs”的很有影响的论文,其相关网址为:
http://martinfowler.com/articles/mocksArentStubs.html。

Fowler在上面这篇论文中对好几组概念加以区别。首先,他区别了代理(stub)和模拟(mock)。根据Fowler的看法(此处他引用了Meszaros的定义),代理对于测试期间进行的调用提供了封装现成的答案,经常情况下,这种封装与当前测试之外的内容是毫无关系的。相比之下,模拟(Mocks)是一些提前编写的带有一定期望的对象,这些期望对于所进行的调用加以声明-期望达到的结果。

根据上面这对概念的区别,Fowler又进一步对状态校验(state verification)和行为校验(behavior. verification)加以区别。当执行状态校验时,代理最为常用。当执行状态校验时,你更感兴趣的是测试结束某个条件是真还是假。而另一方面,当执行行为校验时,最为常用的却是模拟(Mocks)。当执行行为校验时,你更感兴趣的是模拟对象之间是如何交互的。例如,你想知道在另一个模拟对象上调用了一个方法之后是否在某个模拟对象上调用了某个特定的方法。

Fowler最后区别了传统的测试驱动开发(classical TDD)和模拟主义测试驱动开发(mockist TDD)。其实,Fowler对这两者的区别涉及到如何进行测试和设计的根本问题。传统的测试驱动开发者趋向于使用代理和状态校验。根据Fowler的说法,传统式测试驱动开发风格在于尽可能使用真正的对象,而当这种情形相当难以实现时又引入近乎两倍的真正对象以试图实现既定测试目的。而一个模拟主义测试驱动开发者几乎总是使用模拟和行为校验方案,他们会一直针对感兴趣的行为使用任何的模拟对象。

一个传统型的测试驱动程序员会使用一个模拟对象框架来简化单元测试。如果你想要测试的代码依赖于另外其他的对象,那么,你可以为当前不太方便的对象快速创建一个代理(stub),从而继续进行你的单元测试工作。因此,从一个传统型的测试驱动程序员角度来看,一个模拟对象框架的主要意义正在于此。

相比之下,模拟主义测试驱动开发者持有完全不同的观点。他们认为,应用程序的设计应该受你期望对象在程序中交互的方式的驱动。因此,他们使用模拟对象来模拟实现最终的应用程序。因此,在测试期间,他们会模拟所有的东西。

Moq因其没有尊重传统型测试驱动开发者和习惯于使用模拟对象进行测试驱动开发的开发者而受到指责。Moq使得很容易地创建代理(stubs)而不是模拟。这或者是一件好事,也可能是一件糟糕的事情,具体要依赖于你使用的模拟对象框架的目标。

Daniel Cazzulino,作为Moq框架的主要创建者,无可辩解地是一位传统型测试驱动开发者。在Daniel Cazzulino和Ayende (Rhino Mocks框架的作者)之间曾经有一次很有意思的意见交流,此网址为:
http://www.ayende.com/Blog/archive/2007/12/19/Moq-Mocking-in-C-3.0.aspx

Daniel Cazzulino认为,大多数的开发者,如果他们使用了测试驱动开发的话,并不会区别什么是传统的测试驱动开发(classical TDD)和什么是模拟主义测试驱动开发(mockist TDD)。事实上,这两者之间的区别并不像Martin Fowler所描述的那样清晰分明。为此,Daniel Cazzulino撰写了一篇论文,题目为“Mocks, Stubs and Fakes: it's a continuum”,其博客地址为:
http://www.clariusconsulting.net/blogs/kzu/archive/2007/12/21/47152.aspx

最终,Daniel Cazzulino没有使用Fowler/Meszaros针对模拟和代理所作出的区别。他呼吁,大多数开发者当引用Fowler/Meszaros所指的“代理”时应该使用“模拟”代之,并且强调大家应当尊重这些词语的日常语言使用习惯。

由于本文后面的内容将介绍Moq的用法,所以,我们也根据Daniel Cazzulino的做法把模拟和代理合并到一起使用。

三、下载和安装Moq

Moq是作为Google代码工程的形式维护的。你可以从网址http://code.google.com/p/moq/处下载Moq的二进制形式及相关API参考文档。

在下载Moq的二进制形式Moq.2.5.3-bin.zip并解压后,你将得到如下图所示的几个文件。


注意到,上图中包含了一个程序集Moq.dll。当在Visual Studio中测试你的项目前,你必须添加对于此程序集的引用。当然,你还需要添加对于Moq命名空间的具体引用,以便可以使用其中提供的测试类。

另外请注意:解压结果中还一并提供了一个帮助文件Moq.chm。这是Windows平台上流行的帮助文件格式。通过此文件,你可以详细研究这个模拟对象框架的使用。

 

在接下来的文章中,我将详细介绍 如何使用Moq创建模拟对象并编写一个简单的实例。
原文地址: http://space.itpub.net/14518332/viewspace-431738

 

 

本文转自温景良(Jason)博客园博客,原文链接: http://www.cnblogs.com/wenjl520/archive/2009/08/21/1551299.html,如需转载请自行联系原作者

相关文章
|
2天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
17 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
2天前
|
监控 安全 测试技术
构建高效的精准测试平台:设计与实现指南
在软件开发过程中,精准测试是确保产品质量和性能的关键环节。一个精准的测试平台能够自动化测试流程,提高测试效率,缩短测试周期,并提供准确的测试结果。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
21 1
|
3天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
11 1
|
5天前
|
测试技术 Android开发 UED
探索软件测试中的自动化框架选择
【10月更文挑战第29天】 在软件开发的复杂过程中,测试环节扮演着至关重要的角色。本文将深入探讨自动化测试框架的选择,分析不同框架的特点和适用场景,旨在为软件开发团队提供决策支持。通过对比主流自动化测试工具的优势与局限,我们将揭示如何根据项目需求和团队技能来选择最合适的自动化测试解决方案。此外,文章还将讨论自动化测试实施过程中的关键考虑因素,包括成本效益分析、维护难度和扩展性等,确保读者能够全面理解自动化测试框架选择的重要性。
21 1
|
11天前
|
监控 安全 jenkins
探索软件测试的奥秘:自动化测试框架的搭建与实践
【10月更文挑战第24天】在软件开发的海洋里,测试是确保航行安全的灯塔。本文将带领读者揭开软件测试的神秘面纱,深入探讨如何从零开始搭建一个自动化测试框架,并配以代码示例。我们将一起航行在自动化测试的浪潮之上,体验从理论到实践的转变,最终达到提高测试效率和质量的彼岸。
|
2天前
|
监控 安全 测试技术
构建高效精准测试平台:设计与实现全攻略
在软件开发过程中,精准测试是确保产品质量的关键环节。一个高效、精准的测试平台能够自动化测试流程,提高测试覆盖率,缩短测试周期。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
21 0
|
3天前
|
机器学习/深度学习 自然语言处理 物联网
探索自动化测试框架的演变与未来趋势
随着软件开发行业的蓬勃发展,软件测试作为保障软件质量的重要环节,其方法和工具也在不断进化。本文将深入探讨自动化测试框架从诞生至今的发展历程,分析当前主流框架的特点和应用场景,并预测未来的发展趋势,为软件开发团队选择合适的自动化测试解决方案提供参考。
|
6天前
|
测试技术 持续交付
探索软件测试中的自动化框架:优势与挑战
【10月更文挑战第28天】 随着软件开发的快速进步,自动化测试已成为确保软件质量的关键步骤。本文将探讨自动化测试框架的优势和面临的挑战,以及如何有效地克服这些挑战。
17 0
|
26天前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
49 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
2月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
219 7
Jmeter实现WebSocket协议的接口测试方法

热门文章

最新文章