软件测试-5模拟对象课件



《软件测试-5模拟对象课件》由会员分享,可在线阅读,更多相关《软件测试-5模拟对象课件(44页珍藏版)》请在装配图网上搜索。
1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,计算机科学与技术学院,模拟,对象,模拟对象,1,议程,基于状态的测试和交互,测试,模拟,对象与桩对象的,区别,模拟对象的例子,同时使用模拟对象和桩对象,桩链,手写,模拟对象与桩对象的问题,议程基于状态的测试和交互测试,场景,被测代码的复杂逻辑需要基于对其他对象的调用,被调用对象,可能,不返回结果,不保存状态,如何,测试对象间的,调用,模拟对象,场景被测代码的复杂逻辑需要基于对其他对象的调用,什么是交互测试,交互测试用来测试一个对象如何向另一个对象传递消息,或者如何从其他对象接收消息,即测试对象如何与其他对象进行
2、交互,什么是交互测试交互测试用来测试一个对象如何向另一个对象传递消,两种测试的区分,交互测试,=,动作驱动测试,测试对象的某个特定动作,基于状态的测试,=,结果驱动测试,测试某些最终结果是否,成立,通常,倾向于测试对象的最终结果,有时,对象间的交互就是最终结果,此时需要测试交互本身,如:调用一个,web,服务,两种测试的区分交互测试=动作驱动测试,示例比较,假设:一个灌溉系统,事先设定好时间让它给院子里的树木浇水,一天浇几次,每次多少水,基于状态的测试,在指定的一段时间内(如:,24,小时)让系统持续运行,结束后检查树木状态,土地的湿度够不够?树的状态好不好?,叶子够不够绿?等等,测试很难操作
3、,示例比较假设:一个灌溉系统,事先设定好时间让它给院子里的树木,交互测试,在水龙头末端安装一个设备,记录灌溉的开始时间与结束时间,以及每次灌溉的用水量,系统运行结束后,不必检查树木,只需检查该设备调用次数是否正确,每次用水量是否正确,交互测试,实际上,无需真正的树木以测试系统,可改变灌溉单元的时钟,让它认为浇水时间到了,这样它就会在你指定的任何时间浇水,而不必等很长时间才能确定系统是否正常工作,实际上,无需真正的树木以测试系统,模拟对象,用来记录灌溉信息的是什么设备?,可以说它是一个伪水龙头,或桩对象,比桩对象更智能,记录其每次调用的桩对象,模拟对象的职责,模拟对象,系统中的一个伪对象,用来决
4、定一个单元测试是通过还是失败,通过验证被测对象和伪对象之间是否进行预期的交互来判断,模拟对象用来记录灌溉信息的是什么设备?,模拟对象的用法与桩对象很相似,模拟对象比桩对象做的事情更多,保存通信历史信息,验证这些记录,模拟对象的用法与桩对象很相似,区别,基本区别,桩对象不会使测试失败,模拟对象可以导致测试失败,桩,对象用来替换依赖项,确保测试顺利运行,断言是针对被测类的,测试利用模拟对象来验证测试是否失败,断言是针对模拟对象的,区别基本区别,使用桩对象的交互图,使用桩对象的交互图,使用模拟对象的交互图,使用模拟对象的交互图,业务背景,增加,LogAnalyzer,需求,当接收到一个长度太短的文件
5、名,就发送一条错误信息给某个外部的,web,服务,测试遇到的问题,Web,服务未实现,直接调用该服务会导致测试时间过长,业务背景增加LogAnalyzer需求,重构设计,新建接口,包含调用,web,服务所需的方法,便于新建模拟对象,测试中使用该接口而不是直接调用,web,服务,重构设计新建接口,接口,接口,模拟对象,模拟对象,被测类,被测类,测试代码,测试代码,测试策略,没有在模拟对象代码内部编写测试,原因,希望重用该模拟对象,以便于对消息做不同的断言,若在模拟对象内部放置断言,那么阅读的人无法理解在断言什么,隐藏测试代码的重要信息,会导致测试的可读性和可维护性下降,测试策略没有在模拟对象代码
6、内部编写测试,原因,业务背景,LogAnalyzer,调用,web,服务,如果,Web,服务抛出错误,,LogAnalyzer,必须记录该错误,发送邮件给管理员,业务背景LogAnalyzer调用web服务,两个外部依赖的交互图,两个外部依赖的交互图,被测类,被测类,面对的问题,如何测试,LogAnalyzer,在,web,服务抛出异常时正确调用电子邮件服务?,如何替换,web,服务?,如何模拟,web,服务抛出的异常?,如何知道电子邮件是否正确调用?,面对的问题如何测试LogAnalyzer在web服务抛出异常,解决思路,使用桩对象,替换,web,服务,模拟,web,服务抛出异常,使用模拟对
7、象,替换邮件服务,解决思路使用桩对象,分析,桩对象,模拟,web,服务抛出异常,用来保证测试正确运行,模拟对象,验证是否向电子邮件服务传入正确的参数,针对它做断言,验证它是否被正确调用,分析桩对象,测试交互图,测试交互图,接口,接口,桩对象,web,服务,桩对象web服务,模拟对象,模拟对象,被测类,被测类,测试代码,测试代码,问题,为什么要在一个测试中做多次断言?,将测试拆分为,3,个测试,每个测试一个断言,会更简单?可以把,3,个断言组合成一个逻辑测试吗?,为每个测试或测试类手工新建模拟对象和桩对象很枯燥乏味,如何克服?,更,重要的是:在一个测试中可以使用多少个桩对象和模拟对象?,问题为什
8、么要在一个测试中做多次断言?,原则,一个测试只测一件事,每个测试只能有一个模拟对象,每个测试可以有多个桩对象,一,个测试中存在多个模拟对象意味着正在测试多件事,这会导致测试变得复杂或脆弱,在遇到更复杂的测试时,首先找到模拟对象,其他的就是桩对象,前者影响断言,原则一个测试只测一件事,桩链,有时,我们希望从一个伪组件中返回另外一个伪组件,从而在测试中形成了一个小小的桩链,示例代码,IServiceFactory factory=GetServiceFactory(),Iservice service=factory.GetService(),String conn=GlobalUtil.Conf
9、iguration.DBConfiguration.ConnectionString,桩链有时,我们希望从一个伪组件中返回另外一个伪组件,从而在测,弊端,假设你想在测试时替换连接字符串,你可以将,Configuration,属性设计为一个桩对象,然后测试时替换它,这个技术很强大,但是否不利于重构?,弊端假设你想在测试时替换连接字符串,你可以将Configur,虚方法,String,conn=GetConnString(),Proteced virtual string GetConnString(),return GlobalUtil.Configuration.DBConfiguration
10、.ConnectionString,虚方法String conn=GetConnString,测试时,重写该方法,这种方式,能增强代码的可读性和可维护性,不用为插桩,新增接口,测试时,重写该方法,手写模拟对象和桩对象的问题,编写模拟对象和桩对象很费时,如果类和接口有很多方法、属性和事件,将很难为它们编写模拟对象和桩对象,如果模拟的方法被多次调用,一旦涉及状态保存问题,就需要写很多代码(方法内部),手写模拟对象和桩对象的问题编写模拟对象和桩对象很费时,如果要验证一个方法的所有参数,就需要写多个断言,第一,个断言失败时,程序抛出异常,从而导致后续断言无法执行,很难在其他测试中重用模拟对象和桩对象,如果要验证一个方法的所有参数,就需要写多个断言,解决方案,采用隔离框架,下,一讲介绍,隔离框架,Rhino Mock,解决方案采用隔离框架,小结,基于状态的测试和交互测试,前者,=,结果驱动测试,后者,=,动作驱动测试,模拟对象与桩对象的区别,模拟对象测试依赖项的交互,桩对象返回状态,模拟对象会导致断言失败,桩对象则不会,小结基于状态的测试和交互测试,测试交互图,测试交互图,使用,同时使用桩对象与模拟对象,每个测试最多只能有一个模拟对象,每个测试可有多个桩对象,采用桩链时,优先考虑采用虚方法注入桩对象,提高代码可读性与可维护性,避免过度使用模拟对象,使用同时使用桩对象与模拟对象,
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。