软件测试面向对象测试技术.ppt

上传人:xt****7 文档编号:3729003 上传时间:2019-12-22 格式:PPT 页数:59 大小:288.50KB
返回 下载 相关 举报
软件测试面向对象测试技术.ppt_第1页
第1页 / 共59页
软件测试面向对象测试技术.ppt_第2页
第2页 / 共59页
软件测试面向对象测试技术.ppt_第3页
第3页 / 共59页
点击查看更多>>
资源描述
第八章面向对象软件测试,一、面向对象测试概述,1.传统的软件开发存在的问题(1)软件重用性差(2)软件可维护性差(3)开发出的软件不易满足用户需求,一、面向对象测试概述,2、面向对象技术基本概念(1)对象(2)对象的状态和行为(3)类(4)类的结构(类间关系)(5)消息和方法,一、面向对象测试概述,我们生活在一个对象的世界里,每个对象有一定的属性,把属性相同的对象进行归纳就形成类例如:家具就可以看作类,其主要的属性有价格、尺寸、重量、位置和颜色等无论我们谈论桌子、椅子还是沙发、衣橱,这些属性总是可用的,因为它们都是家具而继承了为类定义的所有属性。,除了属性之外,每个对象可以被一系列不同的方式操纵,它可以被买卖、移动、修改(如漆上不同的颜色)。这些操作或方法将改变对象的一个或多个属性。类的合法操作可以和对象的定义联系在一起,并且被类的所有实例继承。,一、面向对象测试概述,面向对象特征(1)对象唯一性(2)分类性(3)继承性(4)多态性,一、面向对象测试概述,面向对象要素(1)抽象(2)封装(3)共享,面向对象软件开发方法与传统的软件开发方法的区别:,(1)调查、分析系统需求,建立一个全面、合理、统一的模型。(2)对象设计。(3)程序实现。,面向对象软件开发过程,面向对象的开发模型突破了传统的瀑布模型,将开发分为面向对象分析(OOA),面向对象设计(OOD),和面向对象编程(OOP)三个阶段。针对这种开发模型,结合传统的测试步骤的划分,我们把面向对象的软件测试分为:面向对象分析的测试,面向对象设计的测试,面向对象编程的测试;面向对象单元测试,面向对象集成测试,面向对象系统测试。,面向对象测试,在传统的面向过程程序中,对于函数y=Function(x);只需要考虑一个函数(Function())的行为特点,在面向对象程序中,你不得不同时考虑基类函数(Base:Function())的行为和继承类函数(Derived:Function())的行为。面向对象程序的结构不再是传统的功能模块结构,作为一个整体,原有集成测试所要求的逐步将开发的模块搭建在一起进行测试的方法已不可能。,面向对象测试,面向对象软件对每个开发阶段都有不同以往的要求和结果,已经不可能用功能细化的观点来检测面向对象分析和设计的结果。针对面向对象软件的开发特点,应该有一种新的测试模型。,二、面向对象模型,OOATest:面向对象分析的测试,OODTest:面向对象设计的测试,OOPTest:面向对象编程的测试;OOUnitTest:面向对象单元测试,OOIntegrateTest:面向对象集成测试,OOSystemTest:面向对象系统测试。,二、面向对象模型,OOATest和OODTest:是对分析和设计结果的测试,主要是对分析设计生成的文档进行,是软件开发前期的关键性测试;OOPTest:主要针对编程风格和程序代码实现进行测试看,其测试内容主要在面向对象单元和面向对象集成测试中体现;OOUnitTest:对程序内部具体单一的功能模块的测试。主要是对类的测试。OOIntegrateTest:主要对系统内部相互服务进行测试,如方法间的相互作用,类间的消息传递等。OOSystemTest:是面向对象测试的最后阶段的测试,主要以用户需求为测试标准,借鉴OOA及其测试结果。,二、面向对象模型,OOA:将问题空间中实现的功能进行抽象,问题空间中的实例抽象为对象,用对象的结构反映问题空间的复杂关系,用属性和服务表示实例的特殊性和行为OOD:建立类结构或进一步构造类库,实现分析结果对问题空间的抽象。OOP:软件的计算机实现。,三、面向对象分析和设计的测试,OOATest和OODTest:是对分析和设计结果的测试,主要是对分析设计生成的文档进行,是软件开发前期的关键性测试;OOA直接映射问题空间,全面地在问题空间中实现功能的现实抽象化。OOA必须回答:(1)为完成用户要求,系统应提供哪些功能(2)系统应由哪些对象构成(3)每个对象应有哪些属性和服务(4)对象间应有怎样的联系,三、面向对象分析和设计的测试,面向对象设计(OOD)采用“造型的观点”,以OOA为基础归纳出类,并建立类结构或进一步构造成类库,实现分析结果对问题空间的抽象。OOD归纳的类,可以是对象简单的延续,可以是不同对象的相同或相似的服务。由此可见,OOD不是在OOA上的另一思维方式的大动干戈,而是OOA的进一步细化和更高层的抽象。面向对象设计(OOD)是以OOA归纳出的类为基础,建立类结构甚至进一步构造成类库,实现分析结果对问题空间的抽象。,三、面向对象分析和设计的测试,对认定的对象的测试,OOA(面向对象分析)中认定的对象是对问题空间中的结构、其他系统、设备、被记忆的事件、系统涉及的人员等实际实例的抽象。对它的测试可以从如下方面考虑:认定的对象是否全面,其名称应该尽量准确、适用,是否问题空间中所涉及到的实例都反映在认定的抽象对象中。认定的对象是否具有多个属性。只有一个属性的对象通常应看作其他对象的属性而不是抽象为独立的对象对认定为同一对象的实例是否有共同的、区别于其他实例的共同属性,是否提供或需要相同的服务如果系统没有必要始终保持对象代表的实例信息,提供或者得到关于它的服务,认定的对象也无必要。,三、面向对象分析和设计的测试,对认定的结构的测试,认定的结构指的是多种对象的组织方式,用来反映问题空间中的复杂实例和复杂关系。认定的分类结构测试要点:处于高层的对象,是否在问题空间中含有不同于下一层对象的特殊可能性,即是否能派生出下一层对象。处于同一低层的对象,是否能抽象出在现实中有意义的更一般的上层对象。对所有认定的对象,是否能在问题空间内向上层抽象出在现实中有意义的对象。高层的对象的特性是否完全体现下层的共性,低层的对象是否有高层特性基础上的特殊性。,三、面向对象分析和设计的测试,对构造的类层次结构的测试,为了能充分发挥面向对象继承共享特性,OOD(面向对象设计)的类层次结构通常基于OOA中产生的分类结构的原则来组织,着重体现父类和子类间的一般性和特殊性。在当前的问题空间,对类层次结构的主要要求是能在解空间构造实现全部功能的结构框架。为此测试要注意如下几个方面:类层次结构是否涵盖了所有定义的类;是否能体现OOA中所定义的实例关联、消息关联;子类是否具有父类没有的新特性;子类间的共同特性是否完全在父类中得以体现。,五、面向对象编程的测试,典型的面向对象程序具有继承、封装和多态的新特性,这使得传统的测试策略必须有所改变。封装是对数据的隐藏,外界只能通过被提供的操作来访问或修改数据,这样降低了数据被任意修改和读写的可能性,降低了传统程序中对数据非法操作的测试。继承是面向对象程序的重要特点,继承使得代码的重用率提高,同时也使错误传播的概率提高。,五、面向对象编程的测试,继承使得传统测试遇见了这样一个难题:对继承的代码究竟应该怎样测试?多态使得面向对象程序对外呈现出强大的处理能力,但同时却使得程序内“同一”函数的行为复杂化,测试时不得不考虑不同类型具体执行的代码和产生的行为。,面向对象程序是把功能的实现分布在类中。能正确实现功能的类,通过消息传递来协同实现设计要求的功能。正是这种面向对象程序风格,将出现的错误能精确的确定在某一具体的类。因此,在面向对象编程(OOP)阶段,忽略类功能实现的细则,将测试的目光集中在类功能的实现和相应的面向对象程序风格,主要体现为以下两个方面(假设编程使用C+语言):数据成员是否满足数据封装的要求类是否实现了要求的功能,六、面向对象的单元测试,传统的单元测试是针对程序的函数、过程或完成某一定功能的程序块。沿用单元测试的概念,实际测试类成员函数。一些传统的测试方法在面向对象的单元测试中都可以使用。如等价类划分法,因果图法,边值分析法,逻辑覆盖法,路径分析法,等等,单元测试一般建议由程序员完成。,六、面向对象的单元测试,面向对象的单元测试的对象是软件设计的最小单位类。单元测试的依据是详细设计,单元测试应对类中所有重要的属性和方法设计测试用例,以发现类内部的错误。单元测试多采用白盒测试技术,系统内多个类都可以并行进行测试。沿用单元测试概念,实际测试类成员函数。一些传统的测试方法在面向对象的单元测试中都可以使用,如等价类划分、边界值分析、因果图、逻辑覆盖、路径分析法等。,1、单元测试的内容面向对象的单元就是类,单元测试实际测试的就是对类的测试。类测试的目的主要确保一个类的代码能够完全满足类的说明所描述的要求。,2、单元测试开始的时间单元测试开始的时间一般在完全说明了这个类,并且准备对其编码后不久。单元测试开始时要制定一个测试计划。在反复迭代的过程中,类的实现和说明在进程中可能会发生变化,所以应该在软件的其他部件使用该类之前对类进行测试,同时还有必要执行回归测试。,3、单元测试的人员由另一个类的开发人员编写测试计划,由该类的开发人员完成测试,避免对类说明的错误理解,4、单元测试方法单元测试的方法有代码检查和执行测试用例。在某些情况下,用代码检查代替基于执行的测试方法是可行的,但是,代码检查也存在以下两个不利之处:代码检查容易受人为因素影响代码检查在回归测试方面明显需要更多的工作量,类测试按顺序分为以下三部分:基于属性的测试:类中所有属性的设置和访问的测试。基于服务的测试:测试类中的每个方法。基于状态的测试:除了类的每个操作要进行测试,类的行为也要进行测试,所有能引起状态变化的事件都要模拟到。类的行为通常可用状态图来描述,在利用状态图进行类测试时,可考虑覆盖所有状态、状态迁移等覆盖标准,也可考虑从初始状态到终止状态的所有迁移路径的覆盖。,5、方法的测试在测试类的功能实现时,应该首先保证类成员函数的正确性。测试时主要考虑封装在类中的一个方法对数据进行的操作,可以采用传统的模块测试方法,通过向所在对象发消息来执行,它的执行与状态有关。传统的针对模块的设计测试用例的技术,如等价划分、边界值分析、因果图、逻辑覆盖、路径覆盖等方法,仍然可以作为测试类中每个方法的主要技术。,在面向对象的系统中的方法,是通过消息来驱动执行的,要测试类中的方法,必须用一个驱动程序对被测方法发送一条消息以驱动其执行,如果被测模块或方法中调用了其他模块或方法,则需要设计一个模拟被调子程序功能的存根程序,驱动程序、存根程序及被测模块或方法组成一个独立的可执行单元。,在面向对象软件中,在保证单个方法功能正确的基础上,还应该处理好测试方法之间的协助关系。为了提高方法的重用性,设计方法的一个准则是提高方法的内聚,即在一个方法中只完成单个功能。对于继承过来的方法,也要加以测试。运行测试用例的时候,必须提供能够实例化的桩类,以及起驱动器作用的“主程序”类,来提供和分析测试用例。,6、测试程度可以根据已经测试了多少类的实现和多少类的说明来衡量测试的充分性。通常需要将这两者都考虑到,希望测试到操作和状态转换的各种组合情况。一个对象能维持自己的状态,而状态一般来说也会影响操作的含义。,类层次的分割测试这种测试可以减少用完全相同的方式检查类测试用例的数目。这很像传统软件测试中的等价类划分测试。分割测试又可分三种:基于状态的分割,按类操作是否改变类的状态来分割(归类);基于属性的分割,按类操作所用到的属性来分割(归类);基于类型的分割,按完成的功能分割(归类)。,举例,一个银行类Account:属性:balance(账户余额)和creditLimit(透支额)其操作有:open()打开账户、setup()建立、deposit()存款、withdraw()取钱、balance()查询余额、summarize()操作清单、creaditLimit()透支限额close()关闭账户,举例,基于状态划分就是根据它们改变类状态的能力对类操作进行划分。考虑Account类,状态操作包括deposit()、withdraw(),非状态操作包括balance()、summarize()、creaditLimit()。将给不状态的操作和不改变状态的操作分别进行测试。因此:测试用例a:opensetupdepositdepositwithdrawwithdrawclose测试用例b:opensetupdepositsummrizecreaditLimitbalancewithdrawclose,举例,基于属性划分就是根据它们所使用的属性进行划分。对于类Account,属性balance和creaditLimit用于定义划分。操作可分为三类(1)使用creditLimit的操作;(2)修改creditLimit的操作;(3)既不使用也不修改creditLimit的操作。然后为每个划分设计测试用例。基于类别的划分就是根据每个操作所完成一般功能进行划分类操作。例如Account类操作可以划分初始化操作open()、setup(),计算操作deposit()、withdraw(),查询操作balance()、summarize()、creadLimit()及关闭操作close()。,七、面向对象的集成测试,对于面向对象程序,相互调用的功能是散布在程序的不同类中,类通过消息相互作用申请和提供服务。把一组相互有影响的类看作一个整体称为类簇。类簇的测试主要依据系统中相关类的层次关系,检查类之间相互作用的正确性,即检查各相关类之间消息连接的合法性、子类的继承性与父类的一致性、动态绑定执行的正确性、类簇协同完成系统功能的正确性等。面向对象的集成测试能够检测出相对独立的单元测试无法检测出的那些类相互作用时才会产生的错误。,基于单元测试对成员函数行为正确性的保证,集成测试只关注于系统的结构和内部的相互作用。面向对象的集成测试可以分成两步进行:先进行静态测试,再进行动态测试。,七、面向对象的集成测试,静态测试主要针对程序的结构进行,检测程序结构是否符合设计要求。现在流行的一些测试软件都能提供一种称为“可逆性工程”的功能,即通过原程序得到类关系图和函数功能调用关系图。通过“可逆性工程”得到的结果与OOD的结果相互比较,检测程序结构和实现上是否有缺陷,通过这种方法检测OOP是否达到了OOD的要求。,动态测试设计测试用例时,通常需要功能调用结构图、类关系图或者实体关系图为参考,确定不需要被重复测试的部分,从而优化测试用例,减少测试工作量,使得进行的测试能够达到一定覆盖标准。测试所要达到的覆盖标准:达到类所有的服务要求或服务提供的一定覆盖率;依据类间传递的消息,达到对所有执行线程的一定覆盖率;达到类的所有状态的一定覆盖率等。同时也可以考虑使用现有的一些测试工具来得到程序代码执行的覆盖率。,面向对象集成测试的测试策略,其测试有两种不同策略:基于类间协作关系的横向测试基于类间继承关系的纵向测试。,1、基于类间协作关系的横向测试由系统的一个输入事件为起点,对其触发的一组类进行测试,执行相应的操作/消息处理路径,最后终止于某一输出事件。应用回归测试对以测试过的类集再重新执行一次,以保证加入新类时不会产生意外的结果,2、基于类间继承关系的纵向测试首先通过测试独立的类来开始构造系统,在独立类测试完成后,进行下一层继承独立类的类的测试,这个依赖类层次的测试序列一直循环执行到构造完整个系统为止。集成测试在面向对象系统中属于应用生命周期的一个阶段,可在两个层次上进行:对一个新类进行测试,并测试在定义中所涉及的那些类的集成。将各部件集合在一起组成完整的系统进行测试。,类与子类的测试,假设类D是类C的子类,类C已进行了充分的测试,分层与增量,派生类D是C的子类,那么所有的用于C的基于规范的测试用例也都适用于D。术语“继承的测试用例”来代表从父类测试用例中选取出来的、用于子类的测试用例。可以通过增量变化分析来确定继承的测试用例中哪些在测试子类时必须执行、哪些可以不执行。,合理的分析,有利于找出更有价值的测试用例。,分层与增量-测试用例选择,D的接口中添加新的操作,并且有可能是D中的一个新方法实现的新操作。新操作引入了新的功能/代码,这些都需要测试。在D中改变那些在C中声明的操作规范,需要为操作添加新的基于规范的测试用例。附加的测试用例提供了符合其前置条件的新输入,并且对由任何加强了的后置条件导致的新的期望结果进行检查。在D中覆盖那些在C中实现了某个操作并且被D继承了的方法,可以复用于该方法的所有继承来的基于规范的测试用例。在D中添加新的实例变量来实现更多的状态和/或属性,最有可能与新的操作和/或重载方法中代码有关,而且关系到对测试的处理。在D中改变类常量。类常量累计成每个测试用例的附加的后置条件。,注:设计测试用例时,不但要设计确认类功能满足的输入,还应该有意识的设计一些被禁止的例子,确认类是否有不合法的行为产生,如发送与类状态不相适应的消息,要求不相适应的服务等。根据具体情况,动态的集成测试,有时也可以通过系统测试完成。,八、面向对象的系统测试,系统测试应该尽量搭建与用户实际使用环境相同的测试平台,应该保证被测系统的完整性,对临时没有的系统设备部件,也应有相应的模拟手段。系统测试时,应该参考OOA分析的结果,对应描述的对象、属性和各种服务,检测软件是否能够完全再现问题空间。系统测试不仅是检测软件的整体行为表现,从另一个侧面看,也是对软件开发设计的再确认。,具体测试内容包括:功能测试:测试是否满足开发要求,是否能够提供设计所描述的功能,是否用户的需求都得到满足。强度测试:测试系统的能力最高实际限度。性能测试:测试软件的运行性能。安全测试:验证安装在系统内的保护机构确实能够对系统进行保护,使之不受各种非常的干扰。容错性测试可用性测试:安装/卸载测试(install/uninstalltest)等等。,八、面向对象的系统测试,基于UML的系统测试考察系统规格说明、用例图、GUI状态图。构建用例与系统功能的关系矩阵,建立测试覆盖的初步标准,从对应于扩展基本用例的真实用例中导出测试用例;通过所有真实用例开发测试用例由GUI外观有限状态机描述导出有限状态机,通过有限状态机导出测试用例通过基于状态的事件表导出测试用例,这种工作必须对每个状态重复进行,八、面向对象的系统测试,基于状态图的系统测试状态图是很好的系统测试的基础。问题是,UML将状态图规定为类级的。合成多个类的状态图得到一个系统级的状态图很难。一种可行的方法是,将每个类级的状态图转换成一组EDPN(事件驱动的Petri网),然后合成EDPN。,九、面向对象的其他测试,1、基于故障的测试基于故障的测试(fault_basedtesting)与传统的错误推测法类似,也是首先推测软件中可能有的错误,然后设计出最可能发现这些错误的测试用例。例如,软件工程师经常在问题的边界处犯错误,因此,应该着重检查边界情况。,1、基于故障的测试为了推测出软件中可能有的错误,应该仔细研究分析模型和设计模型,而且在很大程度上要依靠测试人员的经验和直觉。如果推测得比较准确,则使用基于故障的测试方法能够用相当低的工作量发现大量错误;反之,如果推测不准,则这种方法的效果并不比随机测试技术的效果好。,2、基于脚本的测试基于脚本的测试主要关注用户需要做什么,而不是产品能做什么,即从用户任务中找出用户要做什么。这种基于脚本的测试有助于在一个单元测试情况下检查多重系统。所以基于脚本的测试比基于故障的测试更实际、更复杂。,2、基于脚本的测试基于脚本测试减少了两种类型的错误:不正确的规格说明,如做了用户不需要的功能或缺少了用户需要的功能子系统间的交互作用没有考虑,如一个子系统的建立,导致其他子系统的失败。,3、面向对象类的随机测试如果一个类有多个操作(功能),这些操作(功能)序列有多种排列,而这种不变化的操作序列可随机产生,用这种可能排列的序列来检查不同类实例的生存史,就是随机测试。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!