软件测试基础_第1页
软件测试基础_第2页
软件测试基础_第3页
软件测试基础_第4页
软件测试基础_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.,1,软件测试技术基础,Part软件测试方法,华东交通大学软件学院,.,2,第5章面向对象软件的测试,本章重点面向对象软件的特点什么是面向对象的单元?如何利用JUnit进行单元测试?,.,5.1概述,对象定义对象是一个可操作的实体,它既包含了特定的数据,又包含了操作这些数据的代码,即方法。针对对象的测试对象的封装信息隐藏对测试的影响对象的状态对象状态的转化对象的生命周期状态与生命期是否相符对象的交互消息的发送和接受,.,4,5.1概述,类定义是通过抽象数据类型的方法实现的一种数据类型,是具有共性的对象集合。对类的测试构造函数不同的构造函数以及是否调用其他对象析构函数(可选)数据空间及时释放方法关注前置条件和后置条件符合设计,.,5,5.1概述,封装定义:是将数据以及操作数据的方法关联起来,构成的一个具有类类型的对象的描述。封装要求类高度内聚,且耦合很松。测试的难点封装使得内部的实现细节隐藏起来,外界无法访问封装后对象的独立性加重集成测试的负担,.,6,5.1概述,继承定义是类之间的一种联系,通过从某个类(称父类)派生可以得到一个新的类(称子类或派生类),该类具有父类的特点和功能,同时还具有新的特点和功能。给测试带来的挑战缺陷传播重复测试,.,7,5.1概述,多态定义:一个对外接口,多个内在实现方法。分为参数多态和包含多态。一般通过动态测试来检查。,.,8,5.1概述,消息对象之间通过消息的传递产生相互作用,通过消息来请求执行某个操作。测试时应考虑消息的发送者消息的接收者消息所包含的参数,.,9,5.1概述,接口用于描述一系列规范的行为对接口的测试应注意接口包含的行为应与对应类的行为相符;接口往往与其他接口或类具有关系,应测试到所有可能的作用方式。,.,面向对象技术的特点给测试带来的新问题具体表现为:(1)封装把数据及对数据的操作封装在一起,限制了对象属性对外的透明性和外界对它的操作权限,在某种程度上避免了对数据的非法操作,有效防止了故障的扩散。但同时,封装机制也给测试数据的生成、测试路径的选取以及测试结构的分析带来了困难。(2)继承实现了共享父类中定义的数据和操作,同时也可定义新的特征。子类是在新的环境中存在,所以父类的正确性不能保证子类的正确性。继承使代码的重用率得到了提高,但同时也使故障的传播几率增加。(3)多态和动态绑定增加了系统运行中可能的执行路径,而且给面向对象软件带来了严重的不确定性,给测试覆盖率的活动带来新的困难。,面向对象的软件测试与传统软件测试,.,1数据成员是否满足数据封装的要求数据封装是数据和数据有关的操作的集合。检查数据成员是否满足数据封装的要求,基本原则是数据成员是否被外界(数据成员所属的类或子类以外的调用)直接调用。当改变数据成员的结构时,是否影响了类的对外接口,是否会导致相应外界必须改动。值得注意,有时强制的类型转换会破坏数据的封装特性。,.,8.2类测试,例如:classHidenprivate:inta=1;char*p=hiden;classVisiblepublic:intb=2;char*s=visible;.Hidenpp;Visible*qq=(Visible*)在上面的程序段中,pp的数据成员可以通过qq被随意访问。,.,1.继承的成员函数是否都不需要测试?对父类中已经测试过的成员函数,两种情况需要在子类中重新测试:a)继承的成员函数在子类中做了改动;b)成员函数调用了改动过的成员函数的部分。,Derived:Redefined()显然需要重新测试。对于Derived:Inherited(),如果它有调用Redefined()的语句(x=x/Redefined(),就需要重新测试,反之,无此必要。,.,2.对父类的测试是否能照搬到子类?延用上面的假设,Base:Redefined()和Derived:Redefined()已经是不同的成员函数,它们有不同的服务说明和执行。应该对Derived:Redefined()重新测试分析,设计测试用例。但由于面向对象的继承使得两个函数有相似,故只需在Base:Redefined()的测试要求和测试用例上添加对Derived:Redfined()新的测试要求和增补相应的测试用例。,.,例如:Base:Redefined()含有如下语句if(value0)message(less);elseif(value=0)message(equal);elsemessage(more);Derived:Redfined()中定义为if(value0)message(less);elseif(value=0)message(Itisequal);elsemessage(more);if(value=88)message(luck);在原有的测试上,对Derived:Redfined()的测试只需做如下改动:将value=0的测试结果期望改动;增加value=88的测试。,.,16,5.2面向对象的软件测试模型,面向对象的软件开发面向对象的分析(OOA)面向对象的设计(OOD)面向对象的编程(OOP),.,17,5.2面向对象的软件测试模型,面向对象的软件测试面向对象分析的测试面向对象设计的测试面向对象编程的测试面向对象的单元测试面向对象的集成测试面向对象的系统测试,对分析和设计得到的文档进行测试,对编程风格和代码进行测试,.,面向对象软件测试模型,.,面向对象测试的模型,面向对象分析OOA的测试OOA直接映射问题空间,全面的将问题空间中实现功能的现实抽象化。将问题空间中的实例抽象为对象,用对象的结构反映问题空间的复杂实例和复杂关系,用属性和服务表示实例的特性和行为。OOA对问题空间分析抽象的不完整,最终会影响软件的功能实现,导致软件开发后期产生大量原本可避免的修补工作;冗余的对象或结构会影响类的选定、程序的整体结构或增加程序员不必要的工作量。,.,面向对象设计OOD的测试OOD确定类和类的结构不仅满足满足当前需求分析的需求,更重要的是通过重新组合或加以适当的补充,能方便实现功能的重用和扩增。对OOD的测试针对功能的实现和重用以及对OOA结果的拓展。对认定的类测试(是否涵盖了OOA中所有认定的对象;是否能体现OOA中定义的属性;是否能实现OOA中定义的服务;是否对应着一个含义明确的数据抽象;是否尽可能少的依赖其他类;类中的方法是否单用途)对构造的类层次结构的测试(类层次结构是否涵盖了所有定义的类;是否能体现OOA中定义的实例关联;是否能实现OOA中定义的消息关联;子类是否具有父类没有的新特性;子类间的共同特性是否完全在父类中得以体现)对类库的支持的测试,面向对象测试的模型,.,面向对象测试的模型,面向对象程序是把功能的实现分布在类中。能正确实现功能的类,通过消息传递来协同实现设计要求的功能。这种程序架构能将出现的错误精确的确定在某一具体的类。对OOP的测试重点集中在类功能的实现和相应的面向对象程序架构,主要体现为以下两个方面:(1)数据成员是否满足数据封装的要求基本原则是数据成员是否被外界(数据成员所属的类或子类以外的调用)直接调用。(2)类是否实现了要求的功能测试类的功能,不能仅满足于代码能无错运行或被测试的类能提供的功能正确,应以所做的OOD结果为依据,检测类提供的功能是否满足了设计的要求,是否有缺陷。,.,22,5.3面向对象的单元测试,与传统单元测试的区别从单元的划分看从测试方法看从测试对象看,.,23,5.3面向对象的单元测试,从单元划分看面向过程:以过程或功能作为单元划分的依据。面向对象:以类作为单元是否需要测试所有的类无法实例化的类如何测试继承的类如何测试,.,24,5.3面向对象的单元测试,与传统单元测试的区别从单元的划分看从测试方法看从测试对象看,.,25,5.3面向对象的单元测试,从测试方法看传统的单元测试:静态测试+动态测试面向对象的单元测试:更强调自动化,不强调代码检查如何设计测试用例如何构造测试驱动程序,并避免巨大的工作量如何最大可能实现自动化的单元测试,.,26,5.3面向对象的单元测试,与传统单元测试的区别从单元的划分看从测试方法看从测试对象看,.,27,5.3面向对象的单元测试,从测试对象看传统的单元测试主要关注函数实现的功能如何通过接口传递数据或消息函数内部的逻辑和效率面向对象的单元测试主要关注类的方法类的状态,.,28,5.3面向对象的单元测试,从测试对象看面向对象的单元测试应解决如何测试私有方法或受到保护的方法是否需要测试类中的所有方法,.,29,5.3面向对象的单元测试,实施的基本步骤划分类的优先级根据优先级的大小确定需要执行单元测试的类。静态测试去除低级错误,评估类的质量对需要执行单元测试的类设计测试用例开发测试驱动自动化的脚本组织测试用例执行测试,对测试结果进行总结,.,30,5.3面向对象的单元测试,测试用例的设计案例说明根据代码设计测试用例根据前置条件和后置条件设计测试用例根据状态转换设计测试用例根据方法特性设计测试用例,.,31,5.3面向对象的单元测试,案例说明MyPointMyShapeMyLineMyTriangleScaleneIsosceles,.,32,5.3面向对象的单元测试,测试用例的设计案例说明根据代码设计测试用例根据前置条件和后置条件设计测试用例根据状态转换设计测试用例根据方法特性设计测试用例,.,33,5.3面向对象的单元测试,根据代码设计测试用例公有方法保护方法私有方法直接修改被测代码在被测类中加入公有方法利用内类机制,.,34,5.3面向对象的单元测试,测试用例的设计案例说明根据代码设计测试用例根据前置条件和后置条件设计测试用例根据状态转换设计测试用例根据方法特性设计测试用例,.,35,5.3面向对象的单元测试,根据前置和后置条件设计测试用例定义前置条件是方法被执行之前应该满足的条件;后置条件是当方法执行结束之后应满足的条件。,.,36,5.3面向对象的单元测试,测试用例的设计案例说明根据代码设计测试用例根据前置条件和后置条件设计测试用例根据状态转换设计测试用例根据方法特性设计测试用例,.,37,5.3面向对象的单元测试,根据状态转换设计测试用例状态转换图中清晰地列出了类可能处于的所有状态,每一对状态转换都涉及一个触发事件。,.,38,5.3面向对象的单元测试,测试用例的设计案例说明根据代码设计测试用例根据前置条件和后置条件设计测试用例根据状态转换设计测试用例根据方法特性设计测试用例,.,39,5.3面向对象的单元测试,根据方法特性设计测试用例构造函数检测被测类在各种情况下所创建的对象能否正常初始化功能函数结合边界值、等价类检验每种功能是否能正确完成接口函数检验类能否在各种状态之间成功转化,.,40,5.3面向对象的单元测试,综合策略根据方法特性划分:构造函数、功能函数和接口函数。针对构造函数,根据前置和后置条件设计用例。针对功能函数公有方法:基于前置条件和后置条件设计测试用例。受保护的方法:严格区分有访问权限和无访问权限的前置条件和后置条件,设计测试用例。私有方法:根据实际情况选用适当的策略进行测试。针对接口函数,根据状态转换设计测试用例。对于以上每种情况,都应结合边界值、等价类等测试方法来选择测试数据。,.,41,5.3面向对象的单元测试,测试驱动的实现方式利用main方法嵌入静态方法独立的测试类,.,42,5.3面向对象的单元测试,测试代码的组织与产品代码放在一起在产品代码目录下与产品代码并行与产品代码的副本放在一起,.,43,5.3面向对象的单元测试,测试驱动框架设计目标自动简单灵活设计思想TestCaseTestResult,.,44,5.3面向对象的单元测试,测试驱动框架:TestCase4类操作构建和执行测试用例创建和操作被测类的Object实例分析测试用例结果将测试过程记录到日志文件,.,45,5.3面向对象的单元测试,案例实践一:类MyPoint的第一次测试尝试,.,46,5.4JUnit测试,面临的问题提高软件的质量需要撰写测试程序;经良好设计和规划的测试类的代码不需要那么繁琐和冗长;通过借助于测试类的编写规范可以得到易于操作的测试,且不随时间变化。,.,47,5.4JUnit测试,JUnit的概念用于编写和运行可重复的测试,专门针对Java代码的单元测试,主要用于白盒测试盒回归测试。3个设计目标自动化测试框架确保代码持久有效支持测试代码的重用,.,48,5.4JUnit测试,JUnit特性及优点特性利用断言assert*来测试实际执行结果是否符合预期结果;利用测试用例TestCase和测试包TestSuite方便地组织和运行测试;通过文本运行器textui、图形运行器awtui和swingui提供灵活的交互模式。,.,49,5.4JUnit测试,JUnit特性及优点在支持测试方面,JUnit的优点将测试代码与产品代码分开,提高了软件的可维护性;针对某个类的测试代码经少量改动之后即可应用于另一个类的测试,简化了测试代码的撰写,提高了测试代码的复用程度;公开源代码,便于进行二次开发,且便于扩展。,.,50,5.4JUnit测试,JUnit特性及优点就对软件开发与过程的支持而言,JUnit有助于加快开发速度;提高软件代码质量;提升系统的可信赖度。,.,51,5.4JUnit测试,JUnit下载与安装,.,52,5.4JUnit测试,JUnit3.8.x测试思想,.,5.4JUnit测试,Test类接口类,建立TestCase与TestSuite类之间的关联TestCase类由TestCase类派生测试驱动类,包含若干测试用例TestSuite类将多个测试组合成一个测试包,在一个测试过程完成对被测类的所有测试TestResult类搜集所有测试用例的执行结果。Assert类将实际值与预期值进行比较。,.,54,5.4JUnit测试,基于类的单元测试的基本步骤创建测试驱动类;创建被测类的对象;设计测试用例和对应的测试程序,从方法、状态等方面展开测试;测试完毕释放已经分配的永久性资源;将多个测试用例组织成测试包,必要时需设定测试用例执行的顺序;执行测试;检验并统计测试结果。,.,55,5.4JUnit测试,案例实践二:类MyPoint的第二次测试尝试,.,56,5.4JUnit测试,JUnit使用经验基本步骤继承junit.framework.TestCase类;填写setUp()和tearDown()方法;撰写test*测试方法,并用assert*验证用例的执行情况;重写suite()方法,利用addTest加入自己的test*测试方法;以图形或文本方式执行测试。,.,57,5.4JUnit测试,特殊类的测试接口类对实现的类展开测试而进而测试到接口类。抽象类利用内类实现(JUnit3.x)。继承类分别设计测试驱动类,用一个组合测试类来将父类和子类的测试加入一个包中。,.,58,5.4JUnit测试,案例实践三:MyPoint系列的测试,.,59,5.4JUnit测试,JUnit4功能增强TestBefore,AfterBeforeClass,AfterClass,.,5.5面向对象的集成测试和系统测试,面向对象设计(OOD)采用“造型的观点”,以OOA为基础归纳出类,并建立类结构或进一步构造成类库,实现分析结果对问题空间的抽象。OOD归纳的类,可以是对象简单的延续,可以是不同对象的相同或相似的服务。OOD不是在OOA上的另一思维方式的大动干戈,而是OOA的进一步细化和更高层的抽象。,.,5.5面向对象的集成测试和系统测试,与传统的集成测试的区别,传统的集成测试是由底向上通过集成完成的功能模块进行测试,一般可以在部分程序编译完成的情况下进行。,面向对象程序,相互调用的功能是散布在程序的不同类中,类通过消息相互作用申请和提供服务。类的行为与它的状态密切相关,状态不仅仅是体现在类数据成员的值,也许还包括其他类中的状态信息。类相互依赖极其紧密,根本无法在编译不完全的程序上对类进行测试。面向对象的集成测试通常需要在整个程序编译完成后进行。,.,5.5面向对象的集成测试和系统测试,面向对象的集成测试,能够检测出相对独立的、单元测试无法检测出的、类相互作用时才会产生的错误。基于单元测试对成员函数行为正确性的保证,集成测试只关注于系统的结构和内部的相互作用。面向对象的集成测试可以分成两步进行:先进行静态测试,再进行动态测试。,.,5.5面向对象的集成测试和系统测试

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论