面向对象的软件测试基础.ppt

上传人:zhu****ei 文档编号:2885876 上传时间:2019-12-03 格式:PPT 页数:49 大小:301.81KB
返回 下载 相关 举报
面向对象的软件测试基础.ppt_第1页
第1页 / 共49页
面向对象的软件测试基础.ppt_第2页
第2页 / 共49页
面向对象的软件测试基础.ppt_第3页
第3页 / 共49页
点击查看更多>>
资源描述
第10章 面向对象的软件测试基础,罗 东 俊 ZSUJONE126.COM,1,主要内容,10.1从测试视角看待面向对象 10.2面向对象测试的层次 10.3面向对象测试模型 10.4面向对象测试部分的例子,2,10.1从测试视角看待面向对象,10.1.1测试面向对象软件的不同 10.1.2测试视角 10.1.3从测试视角的角度看待面向对象的概念,3,10.1.1测试面向对象软件的不同,从编程语言看,面向对象编程特点对测试产生了影响 封装把数据及对数据的操作封装在一起,限制了对象属性对外的透明性和外界对它的操作权限,在某种程度上避免了对数据的非法操作,有效防止了故障的扩散;但同时,封装机制也给测试数据的生成、测试路径的选取以及测试结构的分析带来了困难。 继承实现了共享父类中定义的数据和操作,同时也可以定义新的特征,子类是在新的环境中存在,所以父类的正确性不能保证子类的正确性,继承使代码的重用率得到了提高,但同时也使故障的传播几率增加 多态和动态绑定增加了系统运行中可能的执行路径,而且给面向对象软件带来了严重的不确定性,给测试覆盖率的活动带来新的困难。,4,测试面向对象软件的不同,另一方面,面向对象的开发过程以及分析和设计方法也对测试产生了影响 分析、设计和编码实现密切相关,分析模型可以映射为设计模型,设计模型又可以映射为代码。 因此,分析阶段开始测试,提炼以后可用于设计阶段,设计阶段的测试提炼后又可用于实现阶段的测试。,5,例如,在传统的面向过程程序中,对于函数 y=Function(x),只需考虑函数Function()本身的行为特点 在面向对象程序中,不得不同时考虑基类函数Base:Function()的行为和继承类函数Derived:Function()的行为。 通常,传统软件中存在的依赖关系有:变量间的数据依赖;模块间的调用依赖;变量与其类型间的定义依赖;模块与其变量间的功能依赖。 而在面向对象软件中,除了存在上述依赖关系外,还存在以下的依赖关系:类与类间的依赖;类与操作间的依赖;类与消息间的依赖;类与变量间的依赖;操作与变量间的依赖;操作与消息间的依赖;操作与操作间的依赖。,6,面向对象软件的测试内容,模型测试 类测试 交互测试 系统/子系统测试 发布/自我测试,7,10.1.2 测试视角,测试人员必须以一种对软件的方方面面都提出疑问的态度来思考软件,这种方法被称之为测试视角。 测试视角包含以下几个方面: 质疑:想验证软件的质量。 客观:确保不能凭空想像。 彻底:确保不要遗漏重要的部分。 系统:检查是可再现的。,8,10.1.3从测试视角的角度看待面向对象的概念,对象 消息 接口 类 继承 多态,9,对象,对象是指包含了一组属性以及对这些属性的操作的封装体。 对象是软件开发期间测试的直接目标 在程序运行时,对象被创建、修改、访问或删除,而在运行期间,对象的行为是否符合它的规格说明,该对象与和它相关的对象能否协同工作,这两方面都是面向对象软件测试所关注的焦点。,10,从测试视角的角度关于对象的观点,对象的封装:封装使得已定义的对象容易识别,在系统中容易传递,也容易操纵。 对象隐藏了信息:这使得对象信息的改变有时很难观察到,也加大了检查测试结果的难度。 对象的状态:对象在生命期中总是处于某个状态的,对象状态的多变可能会导致不正常的行为。 对象的生命周期:在对象生命周期的不同阶段,要从各个方面检测对象的状态是否符合其生命周期。例如过早地创建一个对象或过早地删除一个对象,都是造成软件故障的原因。,消息,执行对象某个操作的一种请求。包含操作的名称、实参,当然接收者也可返回值给发送者。例:ss.add(5,6) 从测试视角的角度,关于消息的观点; 消息有发送者:发送者决定何时发送消息,并且可能做出错误的决定; 消息有接收者:接收者可能接收到非预期的特定消息,可能会做出不正确反应。 消息可能包含实参:参数能被接收者使用或修改,若传递的参数是对象,则对象在消息处理前和处理后,对象必须处于正确的状态,而且必须实现接收者所期望的接口。,12,接口,接口是行为声明的集合。 从测试视角的角度,关于接口的观点: 接口封装了操作的说明,如果接口包含的行为和类的行为不相符,那么对这一接口的说明就不是令人满意的。 接口不是孤立的,与其它的接口和类有一定的关系,一个接口可以指定一个行为的参数类型,使得实现该接口的类可被当作一个参数传递。,13,类,类是具有相同属性和相同行为的对象的集合。 类从规范和实现两个方面来描述对象。 在类规范中,定义了类的每个对象能做什么; 在类实现中,定义了类的每个对象如何做它们能做的事情。,14,类规范,类规范包括对每个操作的语义说明,包括前置条件、后置条件和不变量 前置条件是当操作执行之前应该满足的条件 后置条件是当操作执行结束之后必须保持的条件 不变量描述了在对象的生命周期中必须保持的条件,15,发送者和接收者之间接口的定义,当对一个操作进行说明时,可以使用保护性方法或约束性方法来定义发送者和接收者之间的接口。 约束性方法强调前置条件也包含简单的后置条件,发送者必须保证前置条件得到满足,接收者就会响应在后置条件或类不变量中描述的请求。 保护性方法强调的则是后置条件,请求的结果状态通常由一些返回值指示,返回值和每一个可能的结果联系在一起。,16,从测试视角的角度关于类规范的观点,从测试视角的角度,约束性方法简化了类的测试,但使得交互测试更加复杂,因为必须保证任何发送者都能满足前置条件。 保护性方法使得类的测试复杂了(发送者必须知道所有可能的结果),交互测试也更复杂(必须保证产生了所有可能的输出,并且发送者能够获得这些输出)。,17,类的实现,类的实现描述了对象如何表现它的属性,如何执行操作。 主要包括实例变量、方法集、构造函数和析构函数、私有操作集。 类测试是面向对象测试过程中最重要的一个测试,在类测试过程中要保证测试那些具有代表性的操作。,18,从测试视角的角度来研究类,1)类的规范中包含用来构造实例的一些操作,这些操作也可能导致新实例不正确的初始化。 2)类在定义自己的行为和属性时,也依赖于其他协作的类。例如,类的成员变量可能是其他类的实例,或者类中的方法的参数是其他类的实例。如果类定义中使用了包含不正确实现的其他类,就会使类发生错误。 3)类的实现必须满足类本身的说明,但并不保证说明的正确性。 4)类的实现也可能不支持所有要求的操作,或者执行一些错误的操作。 5)类需要指定每个操作的前置条件,在发送消息之前,它也可能不提供检查前置条件的方法。,19,继承,是类之间的联系,允许新类可以在一个已有的基础上进行定义。 继承实现了共享父类中定义的数据和操作,同时也可以定义新的特征,子类是在新的环境中存在,所以父类的正确性不能保证子类的正确性,继承使代码的重用率得到了提高,但同时也使故障的传播几率增加。 从测试视角的角度,关于继承: 继承提供了一种机制,潜在的错误会从基类传递到其派生类,因此类测试中要尽早消除错误。 子类继承了父类的说明和实现,因此可重复使用相同的测试方法。 设计模型时,检查是否合理地使用了继承。 使用继承实现代码的复用,可能会增加代码维护的难度,20,多态,多态是指同一个操作作用于不同的对象可以有不同的解释,产生不同的执行结果。 与多态密切相关的一个概念就是动态绑定。 动态绑定是指在程序运行过程中,当一个对象发送消息请求服务时,要根据接收对象的具体情况将请求的操作与实现的方法进行连接,即把这种连接推迟到运行时才进行。 从测试视角的角度来看,关于多态的观点: 1)多态允许通过增加类来扩展系统,而无须修改已有类。但在扩展中可能出现意料之外的交互关系。 2)多态允许任何操作都能够包括类型不确定的参数,这就增加了应该测试的实参的种类。 3)多态允许操作指定动态引用返回的响应。因为实际引用的类可能是不正确的,或者不是发送者所期望的。,21,10.2面向对象测试的层次,面向对象测试通常采用三层方式: 面向对象单元测试(类测试):针对类中的成员函数以及成员函数间的交互进行测试; 面向对象集成测试:主要对系统内部的相互服务进行测试,如类间的消息传递等; 面向对象系统测试:基于面向对象集成测试的最后阶段的测试,主要以用户需求为测试标准。,22,10.2.1面向对象的单元测试类测试,类测试一般也采用功能性测试方法和结构性测试方法 功能性测试以类的规格说明为基础,主要检查类是否符合其规格说明的要求。 功能性测试包括两个层次:类的规格说明和方法的规格说明。 结构性测试则是从程序出发,对类中方法进行测试,需要考虑其中的代码是否正确。 测试分为两层:第一层考虑类中各独立方法的代码,即方法要做单独测试;第二层考虑方法之间的相互作用,即方法需要进行综合测试。 测试类中成员函数须考虑的两个问题: 1)继承的成员函数是否都不需要测试? 2)对父类的测试是否能照搬到子类?,23,继承的成员函数是否都不需要测试?,对父类中已经测试过的成员函数,以下两种情况需要在子类中重新测试: 继承的成员函数在子类中做了改动。 成员函数调用了改动过的成员函数的部分。 例:假设父类Base中有Inherited()和Redefined()这两个成员函数,继承父类Base的子类Derived只对Redefined()做了改动。那么,Derived:Redefined()就需要重新测试;对于Derived:Inherited(),若它包含了调用Redefined()的语句(比如:x=x/Redefined(),就需要重新测试,否则就不需要。,24,对父类的测试是否能照搬到子类?,例:假设父类Base中有Inherited()和Redefined()这两个成员函数,继承父类Base的子类Derived只对Redefined()做了改动。由于面向对象的继承使得两个函数相似,故只需要在对Base:Redefined()的测试要求和测试用例上添加对Derived:Redefined()新的测试要求和增补相应的测试用例。,25,例如,Base:Redefined()含有如下语句: If(value0)message(“less“); else if(value=0)message(“equal“); else message(“more“); 在Derived:Redefined()中定义为: If(value0)message(“less“); else if(value=0)message(“It is equal“) else message(“more“); if (value=88)message(“luck”); 在原有对父类Base的测试上,对Derived:Redefined()的测试只需作如下改动:将value=0的测试结果期望改动;增加value=88的测试。,26,基于状态的测试,基于状态的测试是通过检查对象的状态在执行某个方法后是否会转移到预期状态的一种测试技术。 使用该技术能够检验类中的方法是否能正确地交互。 基于状态测试的主要步骤如下: 1)依据设计文档,或者通过分析对象数据成员的取值情况空间,得到被测试类的状态转移图。 2)给被测试的类加入用于设置和检查对象状态的新方法,导出对象的逻辑状态。 3)对于状态转移图中每个状态,确定该状态是哪些方法的合法起始状态,即在该状态时对象允许执行哪些操作。 4)在每个状态,从类中方法的调用关系图最下层开始,逐一测试类中的方法;测试每个方法时,根据对象当前状态确定出对方法的执行路径有特殊影响的参数值,将各种可能组合作为参数进行测试。,27,10.2.2 面向对象的集成测试,面向对象的集成测试能够检测出类相互作用时才会产生的错误。 面向对象集成测试通常需要在整个程序编译完成后进行,并只能做基于黑盒的集成测试。 类之间的相互依赖使面向对象集成测试根本无法在编译不完全的程序上对类进行测试 面向对象程序具有动态特性,程序的控制流往往无法确定,28,面向对象集成测试步骤,面向对象集成测试可以分成两步进行:先进行静态测试,再进行动态测试。 静态测试主要针对程序结构进行,检测程序结构是否符合设计要求。现在常用的一些测试软件都能提供一种称为“可逆性工程”的功能,即通过源程序得到类关系图和函数功能调用关系图。将“可逆性工程”得到的结果与面向对象设计(OOD)的结果相比较,以检测面向对象编码(OOP)是否达到了设计要求。 动态测试则测试与每个动态语境有关的消息。设计测试用例时,通常需要上述的功能调用关系图、类关系图或实体关系图为参考,确定不需要被重复测试的部分,从而优化测试用例,使得执行的测试能够达到一定覆盖标准。,29,10.2.3 面向对象的系统测试,系统测试应该尽量搭建与用户实际使用环境相同的测试平台 具体测试的内容包括:功能测试、强度测试、性能测试、安全测试、恢复测试、可用性测试、安装御载测试等。,30,10.3面向对象测试模型,面向对象的软件开发模型将开发过程定义为面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)三个阶段。针对这种开发模型,应该建立一种新的测试模型。,31,10.3.1面向对象分析的测试(OOA Test),面向对象分析(OOA)直接映射问题空间,全面地将问题空间中实现功能的实例抽象为对象,用对象的结构反映问题空间的复杂实例和复杂关系,用属性和服务表示实例的特性和行为。 对OOA阶段的测试划分为五个方面: 1.对认定的对象的测试 2.对认定的结构的测试 3.对认定的主题的测试 4.对定义的属性和实例关联的测试 5.对定义的服务和消息关联的测试,32,对认定的对象的测试,对认定的对象进行测试时,主要测试五个方面: 测试认定的对象是否全面,是否问题空间中所有涉及到的实例都反映在认定的抽象对象中。 测试认定的对象是否具有多个属性,只有一个属性的对象通常应看成其他对象的属性,而不是抽象为独立的对象。 测试被认定为同一对象的实例是否有共同的、区别于其他实例的共同属性。 测试被认定为同一对象的实例是否提供或需要相同的服务 如果服务随着不同的实例而变化,认定的对象就需要分解或利用继承性来分类表示。 如果系统没有必要始终保持对象代表的实例的信息,提供或者得到关于它的服务,认定的对象也无必要。 认定的对象的名称应该尽量准确、适用。,33,对认定的结构的测试,认定的结构指的是多种对象的组织方式,用来反映问题空间中的复杂实例和复杂关系。 认定的结构分为两种:分类结构和组装结构 分类结构体现了问题空间中实例的一般与特殊的关系 组装结构体现了问题空间中实例整体与局部的关系。,34,对认定的分类结构的测试,对认定的分类结构的测试可从以下方面进行测试: 1)对于结构中的一种对象,尤其是处于高层的对象,是否在问题空间中含有不同于下一层对象的特殊可能性,即是否能派生出下一层对象。 2)对于结构中的一种对象,尤其是处于同一低层的对象,是否能抽象出在现实中有意义的更一般的上层对象。 3)对所有认定的对象,是否能在问题空间内向上层抽象出在现实中有意义的对象。 4)高层的对象的特性是否完全体现下层的共性。 5)低层的对象是否有高层特性基础上的特殊性。,35,对认定的组装结构的测试,对认定的组装结构的测试可以从以下方面进行测试: 1)整体(对象)和部件(对象)的组装关系是否符合现实的关系。 2)整体(对象)的部件(对象)是否在考虑的问题空间中有实际应用。 3)整体(对象)中是否遗漏了反映在问题空间中有用的部件(对象)。 4)部件(对象)是否能够在问题空间中组装新的有现实意义的整体(对象)。,36,对认定的主题的测试,主题是在对象和结构的基础上更高一层的抽象,是为了提供OOA分析结果的可见性,如同文章对各部分内容的概要。 对主题层的测试应该考虑以下方面: 1)贯彻George Miller的“7+2”原则,如果主题个数超过7个,就要求对有较密切属性和服务的主题进行归并。 2)主题所反映的一组对象和结构是否具有相同和相近的属性和服务。 3)认定的主题是否是对象和结构更高层的抽象,是否便于理解OOA结果的概貌(尤其是对非技术人员的OOA结果读者)。 4)主题间的消息联系(抽象)是否代表了主题所反映的对象和结构之间的所有关联。,37,对定义的属性和实例关联的测试,属性是用来描述对象或结构所反映的实例的特性。而实例关联是反映实例集合间的映射关系。 对属性和实例关联的测试从如下方面考虑: 1)定义的属性是否对相应的对象和分类结构的每个现实实例都适用。 2)定义的属性在现实世界是否与这种实例关系密切。 3)定义的属性在问题空间是否与这种实例关系密切。 4)定义的属性是否能够不依赖于其他属性被独立理解。 5)定义的属性在分类结构中的位置是否恰当,低层对象的共有属性是否在上层对象属性体现。 6)在问题空间中每个对象的属性是否定义完整。 7)定义的实例关联是否符合现实。 8)在问题空间中实例关联是否定义完整,特别需要注意一对多和多对多的实例关联。,38,对定义的服务和消息关联的测试,定义的服务,就是定义的每一种对象和结构在问题空间所要求的行为。由于问题空间中实例间必要的通信,在OOA中相应地需要定义消息关联。 对定义的服务和消息关联的测试从以下方面进行: 1)对象和结构在问题空间的不同状态是否定义了相应的服务。 2)对象或结构所需要的服务是否都定义了相应的消息关联。 3)定义的消息关联所指引的服务提供是否正确。 4)沿着消息关联执行的线程是否合理,是否符合现实过程。 5)定义的服务是否重复,是否定义了能够得到的服务。,39,10.3.2面向对象设计的测试(OOD Test),OOD是以OOA为基础归纳出类,并建立类结构或进一步构造成类库,实现分析结果对问题空间的抽象。 OOD的测试是针对系统设计结果的测试 对OOD的测试可从如下3方面考虑: 对认定的类的测试 对构造的类层次结构的测试 对类库支持的测试,40,对认定的类的测试,是否涵盖了OOA中所有认定的对象; 是否能体现OOA中定义的属性; 是否能实现OOA中定义韵服务; 是否对应着一个含义明确的数据抽象; 是否尽可能少的依赖其他类; 类中的方法是否实现单个功能。,41,对构造的类层次结构的测试,类层次结构是否涵盖了所有定义的类; 是否能体现OOA中定义的实例关联; 是否能实现OOA中定义的消息关联; 子类是否具有父类没有的新特性; 子类间的共同特性是否完全在父类中得以体现。,42,对类库支持的测试,对类库的支持虽然也属于类层次结构的组织问题,但其强调的重点是再次软件开发的重用。 测试时关注三个方面: 首先,一组子类中关于某种含义相同或基本相同的操作,是否有相同的接口(包括名字和参数表)。 其次,类中方法功能是否较单纯,相应的代码行是否较少。 再次,类的层次结构是否是深度大,宽度小。,43,10.3.3面向对象编程的测试(OOP Test),在对OOP测试时,重点集中在类功能的实现和相应的面向对象程序架构 主要体现为以下两个方面: 1)数据成员是否满足数据封装的要求。 基本原则是数据成员是否被外界(数据成员所属的类或子类以外的调用)直接调用。 2)类是否实现了要求的功能。 测试类的功能,不能仅满足于代码能无错运行或被测试的类能提供的功能正确,应以所做的OOD结果为依据,检测类提供的功能是否满足了设计的要求,是否有缺陷。,44,小结,OOA Test和OOD Test是对分析结果和设计结果的测试,主要是对分析设计产生的文档进行测试,是软件开发前期的关键性测试。 OOP Test主要针对编程风格和程序代码实现进行测试,主要的测试内容在面向对象单元测试和面向对象集成测试中体现。,45,10.4面向对象测试部分的例子,Brickles游戏是一个交互式游戏,在Microsoft Windows环境下运行。游戏的区域是由两堵墙壁、天花板和地板围成的一个矩形。在游戏区域中有一组砖块组成的“砖堆”。游戏玩家控制一块水平移动的滑板,让一个冰球通过反射击打砖堆上的砖块。冰球碰到砖块时,砖块就会破碎。冰球在墙壁、天花板、砖头和水平滑板之间反射跳跃,当冰球碰到地板时会被没收,不再跳起。游戏开始时,游戏玩家有3个冰球,如果所有砖块都被打碎了,游戏玩家胜利。如果3个冰球用完了,而砖块还没有全部被打碎,那么玩家就输掉了游戏。,46,Brickles游戏的初始状态,47,本章总结,讨论了: 10.1从测试视角看待面向对象 10.2面向对象测试的层次 10.3面向对象测试模型 10.4面向对象测试部分的例子,48,习题,1.测试面向对象软件和传统软件有何不同? 2.什么是测试视角?从测试视角如何看待面向对象的基本概念? 3.面向对象软件的测试模型是什么? 4.面向对象软件测试的层次是怎样的?,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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