首页 百科知识 面向对象软件测试

面向对象软件测试

时间:2022-10-09 百科知识 版权反馈
【摘要】:相比之下面向对象软件的结构不再是传统的功能模块结构,而是作为一个整体,原先的集成测试所要求的逐步搭建模块来测试的方式已不适用。当考虑面向对象软件时,单元的概念发生了变化。面向对象集成测试的动态视图更加重要。面向对象测试的整体目标,即以最小的工作量发现最多的错误,这和传统软件测试的目标是一致的,但是面向对象测试的策略和战术有很大不同。

6.2.5 面向对象软件测试

传统的软件开发是一种分解的思想,对应的软件测试也是这样,将复杂的整体分解成多个简单的局部进行开发和测试,然后逐步添加,最终形成一个完善的整体。相比之下面向对象软件的结构不再是传统的功能模块结构,而是作为一个整体,原先的集成测试所要求的逐步搭建模块来测试的方式已不适用。而且,面向对象软件抛弃了传统的开发模式,对每个开发阶段都有全新的要求和结果,不可能采用功能细化的观点来检验面向对象分析和设计的结果。因此,传统的测试模型对面向对象软件已经不再适用。

一、面向对象的软件测试模型

面向对象的开发模型突破了传统的瀑布模型,将开发分为面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)三个阶段。针对这种开发模型,结合传统的测试步骤的划分,把面向对象的软件测试分为:面向对象分析的测试(OOAT),面向对象设计的测试(OODT),面向对象编程的测试(OO-PT),前两者主要对分析和设计得到的文档进行测试,而OOPT则主要对编程风格和代码进行测试,又可分为面向对象的单元测试(OOUT),面向对象的集成测试(OOIT),面向对象的系统测试(OOST)。

img126

图6.9 验收测试工作流程图

1.面向对象分析的测试

传统的面向过程分析是一个功能分解的过程,是把一个系统看成可以分解的功能的集合。这种传统的功能分解分析法的着眼点在于一个系统需要什么样的信息处理方法和过程,以过程的抽象来对待系统的需要。而面向对象分析(OOA)是“把E-R图和语义网络模型,即信息造型中的概念,与面向对象程序设计语言中的重要概念结合在一起而形成的分析方法”,最后通常是得到问题空间的图表的形式描述。OOA直接映射问题空间,全面地将问题空间中实现功能的现实抽象化。将问题空间中的实例抽象为对象,用对象的结构反映问题空间的复杂实例和复杂关系,用属性和操作表示实例的特性和行为。对一个系统而言,与传统分析方法产生的结果相反,行为是相对稳定的,结构是相对不稳定的,这更充分反映了现实的特性。OOA的结果是为后面阶段类的选定和实现、类层次结构的组织和实现提供平台。因此,对OOA的测试,应从以下方面考虑:

①对认定的对象的测试。

②对认定的结构的测试。

③对认定的主题的测试。

④对定义的属性和实例关联的测试。

⑤对定义的服务和消息关联的测试。

2.面向对象设计的测试

通常的结构化的设计方法,用的“是面向作业的设计方法,它把系统分解以后,提出一组作业,这些作业是以过程实现系统的基础构造,把问题域的分析转化为求解域的设计,分析的结果是设计阶段的输入”。而面向对象设计(OOD)采用“造型的观点”,以OOA为基础归纳出类,并建立类结构或进一步构造成类库,实现分析结果对问题空间的抽象。由此可见,OOD不是在OOA上的另一思维方式的大动干戈,而是OOA的进一步细化和更高层的抽象。所以,OOD与OOA的界限通常是难以严格区分的。OOD确定类和类结构不仅是满足当前需求分析的要求,更重要的是通过重新组合或加以适当的补充,能方便实现功能的重用和扩增,以不断适应用户的要求。因此,对OOD的测试,应从如下三方面考虑:

①对认定的类的测试。

②对构造的类层次结构的测试。

③对类库的支持的测试。

3.面向对象编程的测试

典型的面向对象程序具有继承、封装和多态的新特性,这使得传统的测试策略必须有所改变。封装是对数据的隐藏,外界只能通过被提供的操作来访问或修改数据,这样降低了数据被任意修改和读写的可能性,降低了传统程序中对数据非法操作的测试。继承是面向对象程序的重要特点,继承使得代码的重用率提高,同时也使错误传播的概率提高。多态使得面向对象程序对外呈现出强大的处理能力,但同时却使得程序内“同一”函数的行为复杂化,测试时不得不考虑不同类型具体执行的代码和产生的行为。

面向对象程序是把功能的实现分布在类中,能正确实现功能的类,通过消息传递来协同实现设计要求的功能。因此,在面向对象编程(OOP)阶段,忽略类功能实现的细则,将测试的目光集中在类功能的实现和相应的面向对象程序设计风格,主要体现为以下两个方面:

①数据成员是否满足数据封装的要求。

②类是否实现了要求的功能。

二、面向对象的单元测试

传统的单元测试的对象是软件设计的最小单位——模块。单元测试的依据是详细设计描述,单元测试应对模块内所有重要的控制路径设计测试用例,以便发现模块内部的错误。单元测试多采用白盒测试技术,系统内多个模块可以并行地进行测试。

当考虑面向对象软件时,单元的概念发生了变化。封装驱动了类和对象的定义,这意味着每个类和类的实例(对象)包装了属性(数据)和操纵这些数据的操作,而不是个体的模块。最小的可测试单位是封装的类或对象,类包含一组不同的操作,并且某特殊操作可能作为一组不同类的一部分存在,因此,单元测试的意义发生了较大变化,不再是孤立地测试单个操作,而是将操作作为类的一部分。

三、面向对象的集成测试

传统的集成测试是通过自底向上或自顶向下集成完成功能模块的集成测试,一般可以在部分程序编译完成以后进行。但对于面向对象程序,相互调用的功能是分布在程序的不同类中,类通过消息相互作用申请并提供服务。类相互依赖极其紧密,根本无法在编译不完全的程序上对类进行测试。所以,面向对象的集成测试通常需要在整个程序完成编译以后进行。此外,面向对象的集成测试需要进行两级集成:一是将成员函数集成到完整类中,二是将类与其他类集成。

面向对象的集成测试能够检测出单元测试无法检测出的那些类相互作用时才会产生的缺陷。单元测试可以保证成员函数行为的正确性,集成测试则只关注系统的结构和内部的相互作用。

面向对象的集成测试可以分为静态测试和动态测试两步进行。静态测试主要针对程序结构进行,检测程序结构是否符合要求,通过静态测试方式处理由动态绑定引入的复杂性。动态测试则是测试与每个动态语境有关的消息。面向对象集成测试的动态视图更加重要。

四、面向对象的系统测试

通过单元测试和集成测试,仅能保证软件开发的功能得以实现,但不能确认在实际运行时,它是否满足用户的需要。为此,对完成开发的软件必须经过规范的系统测试。系统测试应该尽量搭建与用户实际使用环境相同的测试平台,应该保证被测系统的完整性。对临时没有的系统设备部件,也应有相应的模拟手段。在系统测试时,应该参考OOA分析的结果,对应描述的对象、属性和各种服务,检测软件是否能够完全“再现”问题空间。系统测试不仅是检测软件的整体行为表现,从另一个侧面看,也是对软件开发设计的再确认。

面向对象测试的整体目标,即以最小的工作量发现最多的错误,这和传统软件测试的目标是一致的,但是面向对象测试的策略和战术有很大不同。测试的视角扩大到包括复审分析和设计模型,此外,测试的焦点从过程构件(模块)移向了类。不过,不论是传统的测试方法还是面向对象的测试方法,都应该遵循相同的测试原则。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈