面向对象测试

2024-08-02

面向对象测试(精选12篇)

面向对象测试 篇1

0 引言

“程序测试是为了发现错误而执行程序的过程”[1]。软件测试是使用人工或自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别[2]。随着开发技术的进步,相对于传统的面向过程的软件开发技术,面向对象技术使得软件产品具有高质量、稳定性好、可重用行好和可维护性好等优点。然而,由于面向对象技术的多态、继承、封装等特性,不再是传统的功能模块结构,原有集成测试方法已成为不可能,使得传统的软件测试方法不能适应具有新特性的面向对象软件的测试。同时,面向对象技术开发的软件的代码重用率高,需要更加严格的软件测试来避免错误的繁衍。由此看来,面向对象的程序设计并没有降低软件测试的难度,相反使软件的测试变得更加复杂。面向对象开发使用的不是传统的开发模式,每个开发阶段有不同的要求和结果,已经不可能用功能细化的观点来检测面向对象分析和设计的结果。因此,传统的测试模型对面向对象软件已经不再适用,应对面向对象的开发技术,需要提出新的测试策略和方法来支持面向对象的软件测试。

1 面向对象测试

面向对象测试的整体目标和传统软件测试的目标是一致的——以最小的工作量发现最多的错误。但是面向对象测试的策略和战术有很大不同,由于面向对象的特点是封装、继承和多态,测试的视角扩大到包括复审分析和设计模型,测试的焦点从过程构件转向了类。

1.1 面向对象测试模型

面向对象的开发模型突破了传统的瀑布模型,将开发分为面向对象分析(OOA),面向对象设计(OOD)和面向对象编程(OOP)三个阶段。针对这种开发模型,面向对象的软件测试可分为:面向对象分析的测试,面向对象设计的测试,面向对象编程的测试,面向对象单元测试,面向对象集成测试,面向对象系统测试[3]。

1.2 面向对象分析的测试

面向对象分析(OOA)是“把E-R图和语义网络模型,即信息造型中的概念,与面向对象程序设计语言中的重要概念结合在一起而形成的分析方法”,最后通常是得到问题空间的图表的形式描述。

OOA直接映射问题空间,全面地将问题空间中实现功能的现实抽象化,测试重点在其完整性和冗余性,OOA的结果是为后面阶段类的选定和实现,类层次结构的组织和实现提供平台。因此,对OOA的测试,应从以下方面考虑:

(1)对认定的对象的测试

(2)对认定的结构的测试

(3)对认定的主题的测试

(4)对定义的属性和实例关联的测试

(5)对定义的服务和消息关联的测试

1.3 面向对象设计的测试

面向对象设计(OOD)采用“造型的观点”,以OOA为基础归纳出类,并建立类结构或进一步构造成类库,实现分析结果对问题空间的抽象。OOD是OOA的进一步细化和更高层的抽象。OOD确定类和类结构不仅是满足当前需求分析的要求,更重要的是通过重新组合或加以适当的补充,能方便实现功能的重用和扩增,以不断适应用户的要求。因此,对OOD的测试,应从如下三方面考虑:

(1)对认定的类的测试

(2)对构造的类层次结构的测试

(3)对类库的支持的测试

1.4 面向对象编程的测试

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

2 面向对象测试实现

面向对象软件的最小的可测试单位是封装的类或对象,类包含一组不同的操作,并且某特殊操作可能作为一组不同类的一部分存在。面向对象的软件测试分为包括方法级测试、类级测试、类簇级测试和系统级测试。其中,类级测试是测试面向对象软件的关键。

2.1 示例

如图2所示类的层次结构中,基类是一个抽象类Shape,Line和Quadrangle是从Shape派生而来,并使用Point来定义其定点。其中,Quadrangle还派生了三个类:Square、Rectangle和Other。类的设计如图2所示。

Point:表示二维平面上的一个点(x,y坐标)。

Shape:表示二维平面上的基本形状,是一个抽象类,作为其余各类的基类,Point除外,并提供平面上计算长度和面积的抽象方法,提供实现不同形状的对象之间转换的方法ChangeTo()和RollBack()。

Line:表示线段,从Shape类派生而来,通过两个Point对象来定义,表示线段的两个顶点,并具体实现了所有抽象方法。

Quadrangle:表示四边形,从Shape派生而来,通过四个Point对象来定义其四个顶点,并实现了所有抽象方法。

Square:表示正方形,从Quadrangle派生而来。

Rectangle:表示长方形,从Quadrangle派生而来。

2.2 测试用例的设计

给定平面上的四个点p1(1,1), p2(3,0), p3(4,4), p4(4,1),通过Line(p1,p2), Line(p2,p3), Line(p3,p4), Line(p1,p4),由输入的四个点可以输出一个四边形:

(1)由RollBack(p2,p3)将去掉点p2,p3,四边形转换为由点p1和p4组成的线段。

(2)重置p2,p3的坐标为p2(8,1),p3(8,4),由ChangeTo(p2,p3)将p2,p3加入,正确输出是由p1,p2,p3,p4组成的长方形;若p2(4,1),p3(4,4),则由ChangeTo(p2,p3)将输出由p1,p2,p3,p4组成的正方形。

(3)置p2.x=2,p2.y=2,p1,p2,p3三点将变为特殊的共线关系,p2位于线段p1p3的线段上,四点无法组成四边形。

(4)置p2.x=1.5,四点无法组成凸四边形。

全面的测试用例设计可以采用以下策略[4]:

第一,根据方法特性将被测类的方法划分为构造函数、功能函数和接口函数。

第二,对于构造函数,列出所有前置条件和后置条件的组合,根据不同的组合设计测试用例。

第三,对于功能函数而言,对所有公有方法列出前置条件和后置条件,根据各种有意义的组合设计测试用例;对所有受保护的方法,严格区分有访问权限和无访问权限的前置条件和后置条件设计测试用例;对所有私有方法,根据实际情况选用合适的策略进行测试。

第四,对于接口函数,应绘制类的状态转换图,根据该图设计测试用例,覆盖到每种类的状态和状态的转换。

实际测试中,以上的情况都应结合多种基本的测试方法来选择测试数据。

3 结束语

面对面向对象技术开发出来的程序具有更好的结构更规范的编程风格,极大地优化了数据使用的安全性,提高了代码的重用率。同时,也影响了软件测试的方法和内容,增加了传统软件设计技术所不存在的错误,增加了软件测试的难度。面向对象测试技术能解决传统测试方法的不足,同时,更高效、快速、全面的测试技术以及自动化测试是面向对象测试技术所需解决的,以适应要求更高、功能更强大的软件系统。

参考文献

[1]Myers Glenford J,Badgett Tom,Thomas Todd M,et al.The Art ofSoftware Testing[Z].John Wiley&Sons Inc.2005.

[2]路晓丽,葛玮,龚晓庆,等.软件测试技术[M].北京:机械工业出版社,2007.

[3]柳纯录.软件评测师教程[M].北京:清华大学出版社,2005.

[4]武剑洁,陈传波,肖来元.软件测试技术基础[M].武汉:华中科技大学出版社,2008.

面向对象测试 篇2

这学期的面向对象课程对我来说是收获匪浅的一门课。通过老师课件的讲解,自己一些相关书籍的阅读和实践作业的完成,逐步对课程有了由浅及深的认识。

面向对象(Object Oriented,OO)是一门以实践为主课程,课程中可以分开两块OOA(面向对象系统分析)和OOD(面向对象系统设计)。OOA(面向对象系统分析)主要内容: 研究问题域和用户需求,运用面向对象的观点和原则发现问题域中与系统责任有关的对象,以及对象的特征和相互关系.OOA不涉及针对具体实现采取的设计决策和有关细节,独立于具体实现的系统模型。是一个完整确切反映问题域和用户需求的系统模型。OOA的优势:复用、可扩展、可维护性、弹性。

OOD(面向对象系统设计):以OOA模型为基础,按照实现的要求进行设计决策,包括全局性的决策和局部细节的设计,与具体的实现条件相关。OOD的步骤:细化重组类→细化和实现类之间的关系,明确其可见性→增加属性,指定属性的类型和可见性→分配职责,定义执行每个职责的方法→对消息驱动的系统,明确消息传递的方式→利用设计模式进行局部设计→画出详细的类图和时序图。

面向对象的分析与设计方法将致力于解决传统软件研发过程中由于软件模块化结构化程度不高带来的软件重用性差、软件可维护性差、开发出的软件不能满足用户需要等方面问题。面向对象的概念包括:对象、对象的状态和行为、类、类的结构、消息和方法。对象概念将包含对象唯一性、抽象性、继承性、多态性的重要特征。面向对象的要素包含:抽象、封装性、共享性三方面。

在设计模式的研究过程中,我们组选择的是迭代器(Iterator)的设计模式研究。完成设计研究后,我对迭代器的设计模式有了更为深刻的理解。迭代器(Iterator)提供一个方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部表示。并了解到迭代器设计模式一般在以下三类场合使用较多。

 访问一个聚合对象的内容而无需暴露它的内部表示。 支持对聚合对象的多种遍历。因为遍历状态是保存在每一个迭代器对象中的。

 为遍历不同的聚合结构提供一个统一的接口。根据实现方式的不同,效果上会有差别。同时还简化了容器的接口。但是在java Collection中为了提高可扩展性,容器还是提供了遍历的接口。在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据。面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责。Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。

在Java Collection的应用中,提供的具体迭代器角色是定义在容器角色中的内部类。这样便保护了容器的封装。但是同时容器也提供了遍历算法接口,你可以扩展自己的迭代器。至于迭代器模式的使用。客户程序要先得到具体容器角色,然后再通过具体容器角色得到具体迭代器角色。这样便可以使用具体迭代器角色来遍历容器了。

OOA和OOD之间没有明显的界限。OOA与OOD的不可分割性正好说明了OO思想的强大,即软件过程阶段的无缝连接,在交流与沟通中不会产生鸿沟,这是相对结构化思想的好处,因为从功能模块到某块详细控制逻辑设计两者之间的联系不是十分紧密,需要分析人员与设计人员的再沟通。

面向对象的软件设计技术 篇3

关键词:面向对象;特征;软件分析;设计技术

中图分类号:TP319文献标识码:A文章编号:1007-9599 (2011) 06-0000-01

Object-oriented Software Design Technology

Shi Tong

(Shanghai East China Normal University,Shanghai200062,China)

Abstract:This paper introduces an object-oriented concepts and features,as well as object-oriented software development and design of the correlation analysis,explore the object-oriented software development technology,the main content,which includes object-oriented requirements analysis techniques,surface System design technology to the object,object-oriented programming techniques and object-oriented testing techniques.

Keywords:Object-oriented;Features;Software analysis;Design technology

一、引言

随着传统结构化方法的软件开发技术的弊端不断凸现,人们逐步转向了面向对象的软件开发技术,到上世纪90年代,面向对象技术是软件开发技术中核心的开心技术,虽然近年IT界已经提出了面向服务的软件开发技术,但由于其在软件业的应用不成熟性和一些局限性,和面向对象技术的相关优势,其仍然是当今软件开发与设计的核心技术之一。

二、面向对象

(一)面向对象

1.面向对象就是把现实世界中任何一种事物看作一种可以被认识的对象,并对其具有的相关属性和行为进行发现和研究。而面向对象技术的基本思想实现了从现实世界到计算机世界的映射,即现实问题空间到计算机的解空间,其中,问题空间到解空间为自然映射的抽象,解空间到问题空间为真实而完整的反映映射。

2.对象:是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,对象表示具体的事物和抽象的规则、计划或事件。

3.类和实例:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,或者说,类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

4.消息和方法:对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。类中操作的实现过程叫做方法,一个方法有方法名、参数、方法体。

(二)面向对象的特征

1.对象唯一性。每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。

2.抽象性。抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。

3.继承性。继承性是子类可以自动共享父类的数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

三、面向对象的软件分析与设计

(一)面向对象的需求分析技术。按照软件工程角度来说,面向对象的需求分析是软件开发过程中的需求分析阶段,其主要是运用面向对象技术和面向对象的思想对问题空间进行思考,分析,研究等工作。面向对象的需求分析一般采用方法包括自顶向下和自底向上的方法进行系统建模。

(二)面向对象的系统设计技术。面向对象的系统设计技术阶段的主要任务就是计算机世界的解空间中的相关对象和对象之间的关系进行模型化,根据相互联系,将对象进行类型划分。具体来说,即根据需求分析的内容和相关说明,将需求分析阶段的工作进行形式化的说明和描述,达到功能规格说明,并进行层次地逐步地细化,直到细化到能用面向对象的程序语言设计和实现为止。系统设计阶段要围绕以数据为中心,程序设计与数据相结合的设计方法。

(三)面向对象的程序设计技术。面向对象的程序设计技术是面向对象的系统设计的后期工作,是对计算机世界的解空间进行具体地实现,其工作与具体的程序设计语言是不相关的,与解空间的实现策略是相关的。在确定策略后,实施程序设计的步骤,如图1所示。

(四)面向对象的测试技术。面向对象的测试技术就是采用面向对象的方法开发系统测试,与其他的测试没有本质的区别。系统测试的目的在于检测系统的正确性和稳定性,测试步骤是从局部测试开始,再到整体测试。局部测试是对系统中部分构件的综合测试,整体测试是对整个系统进行综合、全面和局部与局部之间的联系性、稳定性的检测。测试技术最主要的测试方法是“主攻型”的综合性测试,尤其在软件的开发期间,表现尤为重要。

四、总结

软件的质量与软件的开发技术与方法是密切相关的,人们针对软件质量的要求,提出了多种软件开发技术和方法,但都遇到了软件维护方面的多种问题,尤其在采用结构化的软件开发方法。面向对象的软件设计和方法提供了以往开发方法更好的解决办法,其以数据为软件的开发中心,结合用户需求和系统功能进行系统结构的建立和设计,最后形成软件的框架与结构。

参考文献:

[1]倪彬.面向对象的系统分析[J].软件世界,1995,96(2)

[2]陈余年,方美琪.面向对象软件工程[M].北京:清华大学出版社,1999,2

[3]张海藩.软件工程导论[M].北京:清华大学出版社,1998,1

面向对象的软件测试 篇4

1 面向对象测试与传统测试技术的异同

首先, 这两种技术的测试过程是相同的。都要对整个测试进行计划, 设计出测试用例, 运行测试用例, 根据结果进行测试分析, 最后是用户验收。其次, 这两种技术的测试目标也是相同的。测试的目的都是为了使得设计出来的软件能够达到期望的功能。再次, 测试也是为了用尽可能少的工作量测试出软件尽可能多的错误, 虽然在这三个方面这两种技术都是相同的, 但是在测试计划和设计测试用例的时候是有很大的区别的, 这主要是归结于面向对象软件和传统的软件的设计思路不同。传统的软件是由各个功能模块组成的, 那么在测试计划和设计测试用例的时候就要注意的就是这些功能模块之间的关系。他们之间的关系, 它们之间是调用的关系。而面向对象的软件, 它更加注重的是对象之间的相互交流。它们是通过对象来传递它们之间的消息。这也是在测试计划和设计测试用例的时候需要考虑的, 怎样的测试用例才能够更好使得软件的功能的优缺点体现出来。

2 面向对象测试的意义与现状

类是面向对象软件中最重要的概念, 也是面向对象程序的最基本的组成要素。传统的软件是面向过程的, 软件的推进必须是一个过程完结的输出作为下一个过程的输入, 必须这样按部就班的进行下去。计算机的功能就是模拟人的行为的。这样的一种软件的方法是不能达到前面讲的效果的。人是一种群体动物, 必须是在一个团体下才能够使得事情向更好的方向发展。也就是在团体的作用之下才能使资源更优, 而面向对象方法的出现就是应了这样的需求。类就是实现这种需求的最好方法, 它既可以是对象又可以是事件, 通过类之间的相互作用也达到了这种消息之间的传递。这是因为这种软件方法的改变也就造就了软件测试的改变, 传统的软件测试方法完全不能达到用小的工作量来测试软件的错误。针对软件方法面向对象的软件测试也就应运而生了。而面向对象测试是势在必然的。

3 面向对象测试

3.1 面向对象的测试模型

大家比较熟悉的软件开发模型就是瀑布模型, 它包括了需求分析, 设计, 实现和测试。面向对象的开发模型变为了面向对象分析 (OOA) 、面向对象设计 (OOD) 和面向对象编程 (OOP) 3个阶段。面向对象分析阶段需要做的就是将整个问题总结出来, 转换成计算机能够识别的语言, 那么在这个阶段就需要选择使用什么样的编程语言。在面向对象设计阶段则需要的是选择什么样的类结构, 也就是需要些什么类, 这些类能够完成些什么工作。最后的面向对象编程阶段, 用选定的编程语言来实现设计出来的类结构。这种方法有个很大的优点就是在用户需求发生变化的时候, 能够不改变原有程序。测试模型如图1所示:

从上面的图中可以看出, 对面向对象开发模型的各个阶段都进行了测试的, 对面向对象分析的测试和面向对象设计的测试是非常必要的。如果把软件的前期工作做好了, 那么后续的工作进行的才有意义, 进行完了面向对象编程测试以后, 还有三个非常重要的测试, 就是面向对象单元测试, 面向对象集成测试和面向对象系统测试。其中面向对象单元测试和面向对象集成测试是两个工作量比较大的地方。而最后的面向对象系统测试就是要参考前面两个阶段测试结果了, 主要是以用户的需求为主的。六个阶段的测试是相辅相成的, 但是在每个阶段又有不同, 它们采用的方法也会不尽相同。下面就分别介绍单元测试, 集成测试和系统测试。

3.2 面向对象的单元测试

3.2.1 基础类测试

什么是基础类, 就是我们在面向对象设计时, 设计的类, 这些类可能是些对象, 也可能是些事件, 这里并不包括那些需要继承的类, 就是一些独立的类, 没有任何的消息传递。软件的测试就是要构造测试用例, 构造的这些测试用例必须满足两个条件:前置条件和后置条件。所谓前置条件就是发生这些测试用例要满足什么样的条件, 后置条件就是使用了这些测试用例会产生什么样的后果。测试用例既要满足前置条件又要满足后置条件。在设计测试用例的时候需要根据状态转换图, 因为状态转换图中的节点代表的是状态, 而节点与节点之间的连线则表示的是一个动作, 而测试用例就是需要了解如何促使这些动作发生。满足这些动作的发生应该是在一定的范围进行的, 那么对于临界值的设计是至关重要的, 在选择测试用例的时候临界值是非常好的一个标志。设计好了测试用例需要的是怎样来使它运行, 那么就还需要一个测试用例驱动程序。测试用例驱动程序主要的工作就是运行测试用例和得到运行结果。目前用的最多的测试驱动程序是Tester类。Tester类是抽象的概念, 使用这个类的最大好处就是能够为所有的测试人员提供默认的实现。测试人员可能会有如下的操作:运行其他所有类的测试驱动程序的公共函数, 记录下这些测试用例的结果, 必须运行所有要测试的类的测试用例, 检查所有类的所有常量。具体的Tester类主要负责实现测试用例的方法, 并将它们作为测试系列不可缺少的一部分来运行。

3.2.2 交互对象测试

面向对象的程序顾名思义就是由很多的对象构成的, 这些对象相互作用来解决某类问题的。程序中的这些对象有条不紊的相互工作这是这个程序成功的关键。完成了上面提到的单元类的测试, 那么交互对象测试则是为了这些单元类之间的消息传递能够正常的进行。交互测试有两种方法:一种是把设计的测试用例嵌入到程序的交互对象中去, 另一种方法则是用上面提到的Tester类提供的测试环境, 在这个环境下使得对象之间相互作用。这种测试的前提条件就是发送对象能不能够满足接受对象的要求。单位类测试的时候采用了临界值的方法, 这里是一些动作的发发生, 临界值的方法不并不适用。如果采用穷举的方法, 那么工作量将会变得很大, 也有可能出现无穷的情况, 交互对象的测试采用的是正交阵列的方法, 这种方法就是从影响交互对象的所有因素中选出那些对所有交互对象都有影响的子集中来确定测试用例。

如何选出这个子集是正交阵列提供的一种特殊方法, 该方法首先要设计出交互对象配对的方法, 选择的组合方式必须要限制组合数量的急剧递增。正交阵列就如下表1所示是一个数值矩阵。表中的每一行都是一个变量, 这个变量在测试的软件中就是表示的那些具有相同特性的类群。变量则会有一定的取值, 每一个取值则代表了某一个特定的类。把每个变量的所有取值都列举出来就成为了一个矩阵, 也列举出了所有可能的情况。

3.2.3 层次结构类测试

面向对象程序有一个很重要的特征就是继承, 继承的好处可以减少工作量, 不会使得工作变得冗余, 大大的提高程序的性能, 这是因为这些特点也使得继承具有一定的缺点, 那就是错误的传播率提高。继承是面向对象软件新出的概念, 那么在测试的时候对这一部分怎样设计测试用例是新的问题。如果对某个类的父类已经做了完整的测试, 那么对它的子类如何进行测试呢, 为了达到测试的目标就是用尽可能少的工作量来完成测试, 那么就需要复制对父类的某些测试部分, 又因为子类不仅仅继承了父类还有自己一些新的动作或者规范, 因此除去复制的部分再添加一些对新的动作或规范起作用的测试部分即可。这样就会大大的提供工作效率。

3.3 面向对象的集成测试

面向对象的集成测试即涉及到面向对象的结构集成又涉及到面向对象的功能集成。要实现结构和功能的集成则会有类之间的关联、聚合、多态、继承。那么在测试的时候可以分成以下几种情况:

1) 关联和聚合关系的测试:将所有具有关联和聚合关系的类放到一起, 这里不需要涉及新的测试用例, 只需要找到这些类中哪个类是最开始发出动作的, 最先发出动作类的测试用例作为这种关系的测试用例, 应用驱动程序来运行这个测试用例, 观察类之间的消息传递情况。

2) 继承关系的测试:在前面的层次结构类中提到了继承关系的测试, 参照前面的方法即可。

3) 多态/动态绑定的测试:面向对象中的多态增加了程序的运行路径的多样性, 那么在设计测试用例的时候就要考虑到这个因素, 由于运行的轨迹不同那么测试用例的设计可能就会出现变化。那么测试用例的数量就会发生变化, 应该包括所有的执行路径。

3.4 面向对象的系统测试

面向对象的系统测试和传统的系统测试是一样的, 都是为了验证设计出来的软件有没有达到用户的需求, 在满足了用户需求的前提下再考虑软件的性能是不是满足了最开始面向对象分析时提出的要求。系统测试的时候可以采用传统的系统测试的方法, 但是在设计测试用例的时候还是会有不同的, 测试用例的设计还是需要考虑从对象入手。

4 总结

通过对面向对象测试过程方法的分析, 根据本文中的图1就可以了解到测试并不是和开发过程分开的, 它们之间是密不可分的。在整个开发过程要随时都做到随时测试, 这样做的好处就是能够尽早的发现问题, 这样就会及时作出修改。该文中提到了很多解决不同阶段的测试方法, 但是这些都是在理论层次的探讨, 在实施的过程中仍然会遇到这样或那样的问题, 因此后面的研究就着重在如何使理论和实际达到高度的统一。

摘要:软件的测试时软件开发的重要部分, 是保证软件质量提高软件性能的关键。面向对象的软件测试具有它自己的特点, 需要与传统的软件测试相区别, 因此面向对象的软件测试则被分成不同的阶段, 本文将面向对象软件测试层次划分为六个个层次, 主要介绍了面向对象软件测试的以下三个层次:类测试、集成测试和系统测试。

关键词:面向对象,单元测试,集成测试,系统测试

参考文献

[1]武海丽.面向对象的软件测试[J].中国高新技术企业, 2008 (12) .

[2]李伟龙.面向对象的软件测试[J].科技资讯, 2008 (26) .

[3]刘维光.面向对象软件测试的方法研究[J].电脑知识与技术, 2006 (29) .

面向对象编程的总结 篇5

OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。

面向对象有三大特性,分别是:封装、继承、多态。封装是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。任何类都可以从另外一个类继承,即这个类拥有它所继承类的所有成员。被继承的类称为父类或基类。C# 只支持单继承,不支持多重继承,即在C# 中一次只允许继承一个类,不能同时继承多个类。在C# 中,接口允许多继承,可以通过继承多个接口来实现类似于C++中的多重继承。

多态是同一个类在不同场合下表现出不同的行为特征。

使用抽象方法与虚方法都可以实现多态性。抽象方法是一个未实现的方法,使用abstract关键字修饰,含有抽象方法的类必然是抽象类。抽象方法要在其子方法中通过override关键字重写。

面向对象的软件开发方法分析 篇6

【关键词】面向对象 软件开发方法 问题 分析

相比传统的软件开发方法,面向对象的软件开发方法(OMT)实现了质的飞跃,采用了一种自底向上的归纳、自顶向下的分解方法,通过对对象建模的建立,彻底解决了软件开发在需求分析、可维护性以及可靠性三大环节上的问题,同时也大大提高和改善了系统的可维护性。可见,面向对象的软件开发方法,作为一种归纳和演绎思想的综合体现,其对软件设计、软件开发所起的促进作用是毋庸置疑的。

一、传统软件开发方法存在的问题

(一)软件复用性差

在软件开发工程所追求的目标当中,软件复用性是重点之一,同时也是节约人力和提升软件生产率的重要渠道。虽然近年来软件当中的结构化分析、结构化设计和结构化程序开发给软件产业带来了巨大的进步,但是还不足以从根源上解决软件重复使用的问题。

(二)软件可维护性差

传统的软件开发方法过于侧重一致、完整的文件合成最终的产品,以致在整个开发过程中,软件的可测试性、可读性和可修改性成了衡量一个软件产品优劣的重要标准。事实上,在软件的实际应用中,我们可以发现这类产品的维护性差,且所消耗的成本相当高。

(三)开发出的软件不能满足用户需要

传统的结构化方法所涉及的知识领域比较广泛,以致使用它开发大型软件时,一旦遇到系統需求模糊或者系统发生动态变化,就会影响开发效率,导致最终开发出来的软件脱离用户实际需求。

(四)软件质量难以保证

传统的软件开发方法所开发出来的复杂型大型软件,或者是需求模糊的系统,绝大多数都是难以成功投入市场使用的。归其原因,主要有以下两大因素:第一,软件开发人员对用户的实际需求理解不够透彻,以致最后开发出来的软件和用户的期待不相符;第二,所开发出来的软件灵活性低,无法适应用户需求的经常性变化,再加上部分用户有时会在软件的一些使用性能方面提出部分要求,倘若系统的设计和开发是基于过程中,那么软件系统的可扩充性和稳定性就会无法适应变化,而这种变化也会对软件系统自身的机构造成影响,设计、开发的成本也会随之提高。

二、面向对象的软件开发方法

现阶段,面向对象的软件开发方法的研究已经日趋成熟,市场上也不断有新产品涌现。面向对象的软件开发方法有Coad方法、Booch方法和OMT方法等。

(一)Booch方法

Booch方法的最突出特点就是它能够反映出系统的各个方面是如何相互联系和作用的。在一系列的面向对象的软件开发方法中,Booch方法是最早描述当中的基础问题的,其首先提出面向对象是区别于传统软件开发的一种方法。Booch方法认为面向对象的软件分解更接近人们对客观事物的认知,它并没有对各个开发阶段进行明确的周期划分,把主要的工作都集中在软件设计阶段。

(二)Coad方法

Coad方法是通过多年来大型系统开发的经验与面向对象概念的有机结合,该方法在对象、结构、属性和操作的认定方面,提出了一套系统化的原则,并完成了从客户需求角度进一步进行类和类层次结构的认定。Coad方法把软件系统的开发划分为分析和设计两个阶段,虽然说Coad方法没有引入类和类层次结构的术语,但事实上它已经在分类结构、消息关联等概念中呈现了类和类层次结构的特征。从某种程度上来说,Coad方法的概念虽然简单易懂,但是它对各个面向对象和行为的描述不够全面,对象模型的语言表达能力也不突出。

(三)OMT方法

OMT方法是一种跟随OOP向OOD和OOA发展而形成的面向对象的软件开发方法,它的方法涵盖了软件分析、软件设计以及软件实现三大步骤,贯穿于软件开发的全程。OMT还建立了对象模型、动态模型和功能模型三个模型,这三个模型在一定程度上完善了软件,使软件开发更加清晰,也更易于维护。可以说,作为一种以真实世界为对象建模而进行的独立语言设计,OMT方法彻底实现了传统软件开发方法没有完全实现的目标,为绝大多数领域的应用软件提供了一种实际的、高效的、可操作的保证。

(四)UML语言

UML语言是一种建模语言,它是软件工程领域的重要成果之一,在未来,UML语言将会成为面向对象技术领域内的标准建模语言。UML不仅结合了Booch方法、OMT方法、OOSE方法的优势,而且还对其做了进一步的发展,汲取了面向对象技术领域中的其他流派优秀的开发思想,融入了软件工程领域的新思想、新方法、新技术。总而言之,UML是一种通用的标准建模语言,适用于以面向对象技术为基础的任何类型的软件系统,而且还能够在系统开发的不同阶段使用,从需求规格描述直至系统完成后的测试和维护。

综上所述,由于面向对象的软件开发方法所具备的诸多优点,相信面向对象的软件开发方法在未来会有更广阔的前景。可见,开展面向对象的软件开发方法的研究工作,也有着十分重要的现实意义。

【参考文献】

[1]唐黎黎.面向对象的软件工程应用研究[J].现代商贸工业,2010(22).

面向对象测试 篇7

关键词:UML,测试用例,类测试,面向对象,状态图

1 引言

面向对象软件测试的主要目标与传统软件测试目标相同,既是用最小的工作量发现最多的错误。由于面向对象所独有的多态、继承、封装等新的特点,使面向对象测试的策略和技术与传统测试有所不同,测试的视角扩大到包括复审分析和设计模型,测试焦点从模块转向类。类是构成面向对象程序的基本成分,类的测试无疑成为面向对象测试的重要环节。基于对象状态的测试是根据被测试的类的对象所处的状态以及状态之间的转移来构造测试用例,它侧重于对象的动态行为,这种动态行为依赖于对象状态。测试对象动态行为能检测出对象成员函数之间通过对象状态进行交互式产生的错误。

2 基于对象状态的测试方法的发展

现在面向对象测试中基于对象状态的测试方法一般是采用扁平状态机和状态迁移图。扁平状态机能很好的提示出一些类中的错误,但是随着类的状态属性的增加,对象状态的数目会迅速膨胀,大大增加测试的复杂度。状态转移图用于刻画对象响应各种事件时状态发生转移的情况,容易借助于自动机理论来选择测试时所用的时间序列和预测对象的状态变化结果序列,但是,它难于描述继承的对象动态行为、并发的动态行为以及由数据成员和成员函数构成的对象状态和对象状态转移。基于UML的状态图可以很好的描述对象动态行为、并发的动态行为,可以把状态的复杂度控制在和状态属性相关的线性级别,下面我们主要介绍利用UML状态图如何描述对象动态行为、并发的动态行为,以及如何产生测试用例。

3 UML状态图

UML状态图(State Diagram)是UML中对系统的动态行为进行建模的表示方法,它包括对反应型对象的行为建模。它展现了对象生命周期内可能处于的状态以及在这些状态间转换的激发条件。UML状态图中引起状态迁移的原因通常有两种,一种是在状态图中相应的迁移上未指明事件,这表示当位于迁移箭头源头的状态中的内部动作全部执行完后,该状态迁移被自动触发;另一种是,当出现某一事件时会引起状态的迁移,在状态图中把这种一起状态迁移的事件标在改前一的箭头上,如图1。

状态迁移的形式化语法为:

event_signsture[guard_condition]/action_expression^send_clause

其中事件特征event_signsture是由事件名后括号括起来的参数表组成,它指出触发迁移的事件以及与该事件相连接的附加数据。guard_condition警戒条件是一个布尔表达式,如果状态迁移中既有事件又有警戒条件,则表示仅当这个事件发生并且警戒条件为真时,触发状态迁移。动作表达式action_expression是一个触发状态迁移时可执行的过程表达式,表达式中可引用该状态所拥有的对象中的属性、操作或事件特征中的参数。发送子句send_clause是动作的一种特殊情况,用来说明在两个状态的迁移期间发送的消息。

UML状态图的优点在于它支持嵌套和并发。UML状态图中包含基本状态(basic state)和复合状态(composite state),复合状态分为或状态(or-state)和与状态(and-state)。或状态的子状态之间是相互排斥的或关系,表示在任一时刻这些子状态中只有一个子状态为真;与状态的子状态之间是并发的非相互排斥关系,与状态表示一个状态可以有多个并发的子状态,并发子状态之间用虚线分隔,用虚线分隔的每个区域表示一个并发的子状态。把状态属性看成并发的子状态,从而可以把状态图的复杂度控制在线性级别上。并发状态图中一个事件可能引起多个子状态的状态迁移。如图2中的CVM就是一个或状态,它的子状态OFF和ON之间是相互排斥的关系,ON状态就是一个与状态,当处于ON状态时,就意味着同时处于COFFEE和MONEY两个子状态。

由于UML状态图支持嵌套和并发,这就使得它比以往的状态转移图能更好的描述继承的对象动态行为、并发的动态行为以及由数据成员和成员函数构成的对象状态和对象状态转移。UML状态图中可以包含复合状态这就使得它可以把状态的复杂度控制在和状态属性相关的线性级别。下面我们讨论如何从UML状态图构造一棵复合状态测试树。

4 构造复合状态测试树

与以往的测试树不同的是复合状态测试树的每个节点代表对象的复合状态既对象的各个属性的集合,边表示状态间的迁移,根节点代表对象的初始属性集合。

构造一个队列queue来存放复合状态测试树的各个节点。

1)把UML状态图的起点读入队列queue。

2)以UML状态图的起点定义根节点Test Tree root,同时把节点标识tree Node置为对象的初始状态,nodelevel置为0,t和child Tree置为NULL,把root放入队列中。

3)取队列头部的节点设为head,搜索从head节点所对应的状态(head.tree Node)发出的状态前移以及前移置的目标状态,分别填充head.t和head.child Tree,即把迁移至的状态作为head的子节点;同时置好各个子节点的属性值,node Level=head.node Level+1,从root节点开始层次遍历测试树(从第0层至head.node Level层),如果在head的子节点中存在某个节点n,其所对应的状态已经在第0层至head.node Level层中出现过,则该节点n不再扩展,即为叶子节点。把其他没有出现过的子节点加入到队列的尾部。

4)head指向队列中的下一个节点,重复第二步,直至队列为空。

在3)中,如果某个迁移对应的目标状态已经在测试树中出现过,就不再考虑这个状态,不加入到队列尾部。这样有效地避免了重复构造节点,同时又不降低测试的覆盖率。通过上述步骤就可以构造出UML状态图对应的测试树。

复合状态树构造算法能很好的支持多个并发的子状态的情况,只是节点表示为并发子状态的合集;如果某个事件触发其他事件从而引起一系列的状态迁移时,只要把最终的状态作为节点加入到测试树中。比以往的插入桩模块更容易实现。

通过测试树可以很容易的构造出测试用例。从根节点开始沿着各个分支往下知道叶子节点,每条这样从根节点开始到某个叶子节点结束的路径上的事件按顺序组合在一起,就成为基于对象状态测试的一个测试用例。如果增加对象属性可以很容易的在复合状态测试树中增加,增加属性后可以把状态的复杂度控制在和状态属性相关的线性级别,测试时不仅可以单独的对对象的每一个属性和所有属行进行测试,也可以对对象的所有属性任意选择组合进行测试。大大增加了测试的灵活性。

5 结束语

UML的状态图支持潜逃和并发,把状态的复杂度控制在和状态属性相关的线性级别;其次UML状态参数图是在面向对象软件开发的生命周期中的早期设计阶段确定的,是对对象状态的完整的描述,并不依赖于源代码,既保证了状态描述的完整性,又可以在开发早期进行测试,尽早发现与状态相关的错误,避免将错误带入到后面的开发阶段。因此可以用UML的状态图来产生有效的测试用例,这大大提高了测试的灵活性和有效性。

参考文献

[1]张克东,庄燕滨.软件工程与软件测试自动化教程[M].北京:电子工业出版社,2002.

[2]刘金艳,蔺娟茹,尹治本.面向对象软件测试的探讨[C]//2002年全国软件与应用学术会议(NASAC)论文集.北京:机械工业出版社,2002:262-266.

[3]杨小平.面向对象软件测试探讨[J].计算机工程与应用,2000,36(1):44-46.

[4]姬莹,罗钧昊,钟联炯.面向对象软件测试主要问题的探讨[J].西安工业学院学报,2001(1).

[5]Fewster M,Graham D.软件测试自动化技术与实例详解[M].舒智勇,译.北京:电子工业出版社,2000.

[6]叶仁召,郑玉墙,鲁汉榕.面向对象软件测试及度量的研究[J].计算机工程与设计.2001,22(4):21-24.

面向对象的软件测试方法研究 篇8

信息技术的飞速发展,使软件产品应用到各个领域,其质量优劣问题成为开发者和使用者共同关注的焦点。质量不佳的软件不仅会导致后期高昂的维护费用,还可能造成灾难性后果。要实现高质量、高可靠的软件,特别是保证安全关键系统(如银行结算系统、自动飞行控制软件、军事防御和核电站安全控制系统等)的正常运行,一方面依赖于软件开发技术与过程的改进,另一方面则需要全面的程序分析、代码检查和充分的测试等途径去主动地发现潜伏在软件中的缺陷。正如任何生产过程都离不开产品检验一样,软件测试工作是软件开发中必不可少的一步,在软件的整个开发过程中占有非常重要的地位,是保证软件质量、提高软件可靠性的关键[1]。大量的统计资料表明,软件测试阶段投入的成本和工作量往往要占软件开发总成本和总工作量的30%~50%甚至更多。软件测试是对软件功能、设计和实现的最终审定,是发现软件故障、保证软件质量、提高软件可靠性的主要手段。通过对软件进行测试能在一定程度上保证其在应用环境中正常运行。

传统的测试计算机软件的策略是从单元测试开始,然后逐步进入集成测试,最后是有效性和系统测试。近年来,随着新的软件开发技术如面向对象技术、软件重用技术的不断普及,以及网络和Internet的广泛发展,软件测试技术遇到了新的挑战。目前,针对新软件开发技术开展的软件测试技术研究已成为软件测试技术领域内的研究热点。例如近年来,随着面向对象范型在研究界和工业界的广泛应用,面向对象的软件测试技术越来越受到人们的重视。面向对象程序的结构不再是传统的功能模块结构,作为一个整体,原有集成测试所要求的逐步将开发的模块搭建在一起进行测试的方法已不可能。而且,面向对象软件抛弃了传统的开发模式,对每个开发阶段都有不同以往的要求和结果,已经不可能用功能细化的观点来检测面向对象分析和设计的结果。因此,传统的测试模型对面向对象软件已经不再适用。

1 传统的软件测试

软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。

1.1 软件测试方法的分类

结构化分析设计方法是最早形成的软件系统化开发方法,被称之为传统软件开发方法。其侧重于功能分解、自顶向下逐步细化、模块化的设计。相应的对于传统的软件的测试方法亦侧重于功能测试,模块测试。从是否需要执行被测软件的角度软件测试可分为静态测试和动态测试;从是否针对系统的内部结构和具体实现算法的角度动态测试又分为黑盒测试和白盒测试。

1.1.1 静态测试

静态测试的基本特征是在对软件进行分析、检查和测试时不实际运行被测试的程序。它可以用于对各种软件文档进行测试,是软件开发中十分有效的质量控制方法之一[2]。静态测试在主机上完成,不需目标系统支持,测试的主要内容有编程标准验证、数据流分析技术、质量度量信息、代码结构可视化显示、测试外壳的创建。经验表明,使用这种方法能够有效地发现30%~70%的逻辑设计和编码错误。

1.1.2 动态测试

动态测试是使被测代码在相对真实环境下运行,从多角度观察程序运行时能体现的功能、逻辑、行为、

结构等行为,以发现其中的错误现象。在测试过程中,根据产生测试数据的来源,动态测试可分成以下2种测试方法:

1.1.2.1 黑盒测试

黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能情况下,通过测试来检测每个功能是否都能正常使用。在测试时,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息并且保持外部信息(如:数据库或文件)的完整性。黑盒法着眼于程序外部结构,不考虑内部逻辑结构,只针对软件界面和软件功能进行测试,它主要用于软件验收测试。黑盒法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。测试情况实际上有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。

1.1.2.2 白盒测试

白盒测试也称结构测试或逻辑驱动测试,它是一种按照程序内部的逻辑结构和编码结构设计并执行,测试用例的测试方法。测试人员对软件的逻辑路径进行测试,将程序视为一个透明的箱子,即需要了解程序的内部构造和处理过程,并且根据其内部构造设计测试用例。这时测试人员可以完全不顾程序的功能,通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都能按预定要求正确工作。

1.1.2.3 两种测试比较

这两类动态测试方法是从完全不同的起点出发,并且是两个完全对立的出发点,可以说反映了事物的两个极端。两类方法各有侧重,在测试的实践中都是有效和实用的。一般地说,在进行单元测试时大都采用白盒测试,因为外部特性本身有问题或规格说明的规定有误,用黑盒测试方法是发现不了的;而在确认测试或系统测试中大都采用黑盒测试,因为白盒测试无法发现程序逻辑中的错误和遗漏。黑盒测试与白盒测试各有自己的优缺点,构成互补关系,在规划测试时需要把黑盒测试和白盒测试结合起来。

1.2 软件测试策略

软件测试策略把软件测试用例的设计方法集成到一系列经周密计划的步骤中去,从而使软件的测试得以成功地完成。回顾软件的开发过程,最初,通过系统工程确定待开发软件的总体要求和范围,以及与之相关的硬件、支持软件的要求。然后,经需求分析,确定待开发软件的功能、性能数据、界面等要求,再经设计和编码得到待开发软件的程序代码。所得到的程序代码必须经过严格的测试才能交付使用。一种测试策略就是将测试过程按4个步骤进行,即单元测试、集成测试、确认测试和系统测试,过程如图1所示。

单元测试是针对程序中的模块或构件,主要揭露编码阶段产生的错误。经单元测试的模块或构件需集成为软件系统,集成测试针对集成的软件系统,主要揭露设计阶段产生的错误。而确认测试是根据软件需求规约对集成的软件进行确认,主要揭露不符合需求规范的错误,对于纯软件的系统,经确认测试后的软件就可交付使用。对于基于计算机系统中的软件,还需要将它集成到基于计算机的系统中,并进行系统测试,以揭露不符合系统工程中对软件要求的错误。

2 面向对象的软件特点及其测试策略

面向对象是一种依赖于几个基本原则的思维方法。对象是类的实例,类是具有相同属性和操作的一类对象集。继承是面向对象中的一个重要方面,对象继承了所属类的属性和操作,类同样也可以继承其他类的属性和操作。多态性是另一个重要的方面,它是指不同的类中可以有相同名字的操作,并且这个操作在每个类中都能以各自不同的方式执行。对象对其他对象和外部世界隐藏了其操作的执行过程。每个对象都要提供一个让其他对象(和人)用来执行该对象中操作的接口。面向对象的程序是通过一系列对象协同工作来解决问题的,这一协作是通过对象之间互相传送消息来完成的。

2.1 面向对象软件的特殊性

从程序的组织结构方面来讲,传统测试技术不完全适用于面向对象软件的测试。传统程序的测试过程是选定一组数据,交给待测程序处理,通过比较实际执行结果和预期执行结果,判断程序是否含有错误。因此,传统软件测试技术与过程式程序中数据和操作分离的特点相适应。而面向对象软件不是把程序看成是工作在数据上的一系列过程或函数的集合,而是把程序看作是相互协作而又彼此独立的对象的集合,在面向对象程序中,对象是一组属性以及这组属性上的专用操作的封装体,每个对象就像一个传统意义上的小程序,有自己的数据、操作、功能和目的[3]。

而在面向对象的系统中,系统的功能体现在对象间的协作上,相同的功能可能驻留在不同的对象中,操作序列是由对象间的消息传递决定的。不同对象有自己的不同状态,而且同一对象在不同的状态下对消息的响应可能完全不同。

为实现某一特定的功能,有可能要激活调用属于不同对象类的多个方法(C++中的成员函数),形成方法的启用链。显然,基于功能分解的自顶向下或自底向上的集成测试策略并不适用于以面向对象方法构造的软件。

编程语言的改变对测试有影响,开发过程的变化以及分析和设计重点的改变也会对测试产生影响。许多面向对象的软件测试活动都可以在传统的过程中找到对应的活动。我们仍旧使用单元测试,尽管在这里“单元”的意义己发生了改变:我们仍将做集成测试以确保各个子系统能够一致正常地工作;我们仍将作回归测试以确保对软件最后一轮的修改不会对软件以前的功能造成负面影响。

面向对象软件语言特有的一些概念和机制,如数据抽象、继承、多态、动态绑定和消息传递都对测试有着深刻的影响。其中有的因素使测试复杂化,导致测试工作量加大,有的因素有助于测试过程中重用已有的测试资源,从而有利于减少测试的工作量,有的因素两方面兼而有之。但总的来讲,在这些因素的共同作用下,测试面向对象比测试传统软件更加困难。

2.2 面向对象测试模型

面向对象程序的结构不再是传统的功能模块结构,作为一个整体,原有集成测试所要求的逐步将开发的模块搭建在一起进行测试的方法已成为不可能。而且,面向对象软件抛弃了传统的开发模式,对每个开发阶段都有不同以往的要求和结果,已经不可能用功能细化的观点来检测面向对象分析和设计的结果。因此,传统的测试模型对面向对象软件已经不再适用。针对面向对象软件的开发特点,应该有一种新的测试模型。

面向对象的开发模型突破了传统的瀑布模型,将开发分为OOA(面向对象分析),OOD(面向对象设计),和OOP(面向对象编程)三个阶段[4]。针对这种开发模型,结合传统的测试步骤的划分,我们把面向对象的软件测试分为:面向对象分析的测试,面向对象设计的测试,面向对象编程的测试。

2.2.1 面向对象分析的测试

传统的面向过程分析是一个功能分解的过程,是把一个系统看成可以分解的功能的集合。这种传统的功能分解分析法的着眼点在于一个系统需要什么样的信息处理方法和过程,以过程的抽象来对待系统的需要。OOA是“把E-R图和语义网络模型,即信息造型中的概念,与面向对象程序设计语言中的重要概念结合在一起而形成的分析方法”,最后通常是得到问题空间的图表的形式描述。OOA直接映射问题空间,全面的将问题空间中实现功能的现实抽象化。将问题空间中的实例抽象为对象,用对象的结构反映问题空间的复杂实例和复杂关系,用属性和操作表示实例的特性和行为。对一个系统而言,与传统分析方法产生的结果相反,行为是相对稳定的,结构是相对不稳定的,这更充分反映了现实的特性。OOA的结果是为后面阶段类的选定和实现,类层次结构的组织和实现提供平台。因此,面向对象分析对问题空间分析抽象的不完整,最终会影响软件的功能实现,导致软件开发后期大量可避免的修补工作;而一些冗余的对象或结构会影响类的选定、程序的整体结构或增加程序员不必要的工作量。尽管面向对象分析的测试是一个不可分割的系统过程,为实现的方便我们将面向对象分析阶段的测试划分为五个方面:对认定的对象的测试,对认定的结构的测试,对认定的主题的测试,对定义的属性和实例关联的测试,对定义的服务和消息关联的测试。

2.2.2 面向对象设计的测试

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

2.2.3 面向对象编程的测试

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

面向对象程序是把功能的实现分布在类中。能正确实现功能的类,通过消息传递来协同实现设计要求的功能。正是这种面向对象程序风格,将出现的错误能精确的确定在某一具体的类。因此,在面向对象编程阶段,忽略类功能实现的细则,将测试的目光集中在类功能的实现和相应的面向对象程序风格,主要体现为以下两个方面:数据成员是否满足数据封装的要求,类是否实现了要求的功能。

2.3 面向对象软件的测试策略

针对面向对象软件的开发特点,同时与传统的面向过程的测试相对应,面向对象软件测试的层次划分如图2。

2.3.1 面向对象的单元测试

面向对象程序的基本单位是类。类测试是由那些与验证类的实现是否和该类的说明完全一致的相关联的活动组成。类测试与传统测试过程中的单元测试大体相似,而且它们还有许多相同的问题必须说明。对于类的测试,可以通过代码检查或执行测试用例来进行。在某些情况下,用代码检查代替基于执行的测试方法是可行的,但代码检查有两个不利之处:易受人为错误的影响、在回归测试方面明显需要更多的工作量。基于执行的测试方法克服了这些缺点,但确定测试用例和开发测试驱动程序也需要很大的工作量。在某些情况下,为某个类构造一个测试驱动程序所需要的工作量可能比开发这个类所需要的工作量多好几个数量级。但假如一个类是某个类库不可缺少的部分,那么即使测试驱动程序的开发成本可能很高,对它进行充分的类测试也是值得的。

在类测试过程中,不能仅仅检查输入数据产生的结果是否与预期的吻合,还要考虑对象的状态,整个过程应涉及对象的初态、输入参数、输出参数以及对象的终态。

2.3.2 面向对象的集成测试

面向对象的类簇测试把一组相互有影响的类看作一个整体称为类簇。类簇测试主要根据系统中相关类的层次关系,检查类之间的相互作用的正确性,即检查各相关类之间消息连接的合法性、子类的继承性与父类的一致性、动态绑定执行的正确性、类簇协同完成系统功能的正确性等等。类簇测试有两种不同策略:基于类间协作关系的横向测试和基于类间继承关系的纵向测试。

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

面向对象的程序是由若干对象组成的,这些对象互相协作以解决某些问题。对象的协作方式决定了程序能做什么,从而决定了这个程序执行的正确性。例如,可信任的原始类,它的实例可能不包含任何错误,但是如果那个实例的服务不被其它程序组件正确使用的话,那么这个程序也就包含了错误。因此,一个程序中对象的正确协作,即交互对程序的正确性是非常关键的。

类中的方法大多数能和其它类的实例进行交互。这种被测试的交互发生在运行期的各个对象之间。交互包含单向或双向的消息传送。交互测试的重点是确保对象(这些对象的类以已被单独测试过)的消息传送能够正确进行。交互测试的执行可以使用到应用程序中的交互对象,或者在独立的测试工具(例如一个Tester类)提供的环境中,交互测试通过使得该环境中的对象相互交互而执行。

2.3.3 面向对象的系统测试

通过单元测试和集成测试,仅能保证软件开发的功能得以实现。但不能确认在实际运行时,它是否满足用户的需要,是否大量存在实际使用条件下会被诱发产生错误的隐患。为此,对完成开发的软件必须经过规范的系统测试,测试它与系统其他部分配套运行的表现,以保证在系统各部分协调工作的环境下也能正常工作。

系统测试是对所有程序和外部成员构成的整个系统进行整体测试,检验软件和其他系统成员配合工作是否正确。另外,还包括了确认测试内容,以验证软件系统的正确性和性能指标等是否满足需求规格说明书所制定的要求。在整个面向对象的软件测试过程中,集成测试可与单元测试同时进行,以减少单元集成时出现的错误。对已经测试通过的单元,在集成测试或系统测试中,可能发现独立测试没有发现的错误。

系统测试应该尽量搭建与用户实际使用环境相同的测试平台。系统测试时,应该参考面向对象分析的结果,对应描述的对象、属性和各种服务,检测软件是否能够完全“再现”问题空间。系统测试不仅是检测软件的整体行为表现,从另一个侧面看,也是对软件开发设计的再确认。这里说的系统测试是对测试步骤的抽象描述。它体现的具体测试内容包括以下几个方面:

2.3.3.1 功能测试

测试是否满足开发要求,是否能够提供设计所描述的功能,是否用户的需求都得到满足。功能测试是系统测试最常用和必须的测试,通常还会以正式的软件说明书为测试标准。

2.3.3.2 强度测试

测试系统的能力最高实际限度,即软件在一些超负荷的情况,功能实现情况。如要求软件某一行为的大量重复、输入大量的数据或大数值数据、对数据库大量复杂的查询等。

2.3.3.3 性能测试

测试软件的运行性能。这种测试常常与强度测试结合进行,需要事先对被测软件提出性能指标,如传输连接的最长时限、传输的错误率、计算的精度、记录的精度、响应的时限和恢复时限等。

2.3.3.4 安全测试

验证安装在系统内的保护机构确实能够对系统进行保护,使之不受各种非常的干扰。安全测试时需要设计一些测试用例试图突破系统的安全保密措施,检验系统是否有安全保密的漏洞。

2.3.3.5 恢复测试

采用人工的干扰使软件出错,中断使用,检测系统的恢复能力,特别是通讯系统。恢复测试时,应该参考性能测试的相关测试指标。

2.3.3.6 可用性测试

测试用户是否能够满意使用。具体体现为操作是否方便,用户界面是否友好等;安装/卸载测试等等。系统测试需要对被测的软件结合需求分析做仔细的测试分析,建立测试用例。

3 结束语

面向对象技术是一种新兴的软件开发技术,正逐渐代替被广泛使用的面向过程开发技术。虽然面向对象技术的基本思想保证了软件应该有更高的质量,但编程人员的错误仍是不可避免的。软件测试并没有因面向对象技术的兴起而失去其重要性。对面向对象软件的测试,其测试策略或测试方法都需要出现相应的变革或更新。我们必须结合面向对象技术的特点,研究新的面向对象软件的测试理论、方法来与之适应。在软件工程领域,面向对象软件测试是一个重要的研究方向,在这方面的深入研究将对软件测试的理论与实践产生积极的意义。

参考文献

[1]叶仁召,郑玉墙,鲁汉榕.面向对象软件测试及度量的研究[J].计算机工程与设计,2001,22(4):21-24.

[2]张克东,庄燕滨.软件工程与软件测试自动化教程[M].北京:电子工业出版社,2002.

[3]王静.面向对象软件测试技术的研究[D].天津:天津大学,2006.

面向对象测试 篇9

关键词:UML类图,有向赋权图,面向对象软件集成测试,ODDWG

集成测试的目的是通过测试来发现和接口有关的错误,即把通过了单元测试的模块组装起来测试。类间存在的多种关系是测试顺序的一个重要依据。选择不同的测试顺序将决定着测试的结果,如何寻找使得测试最为有效的测试顺序是面向对象软件集成测试的一个重要问题[1,2]。

本文将类图中的类内信息,类间信息提取出来,并计算每个类的内聚度,以及类间耦合度,同时把每个类看作有向图的结点,类的内聚度作为结点的权值,类间耦合度作为关系的权值,并根据动态绑定存在的条件,添加可能的类间动态线索。最后利用深度与广度结合的遍历算法遍历该有向图生成集成测试的测试序列。

1 扩展有向图模型的定义

一个有向图G是一个三重组<V(G), E(G),Φ(G)>其中V(G)是一个非空的结点集合;E(G)是边的集合,此处为序偶的集合;Φ(G)是从边集E到结点偶对集合上的函数。对于此图进行扩展,使得图G变为一个四重组<V(G), V_W (G),E(G),E_W (G)>,其中V_W={v_w1, v_w2,…, v_wk}是结点权值的有限集;E_W={ e_w1, e_w2,…, e_wm}是边的权值,扩展后的图成为了一个有向的赋权图DWG(Directed Weight Graph)[3]。

上述DWG图只是考虑了类之间的静态依赖关系,而没有考虑类之间的动态依赖关系。在DWG的基础上,依据动态绑定的特点,给出类之间完整关系图 ODDWG (Object Dynamic Directed Weight Graph)。图中的结点权值由类的内聚度和类间耦合度计算,边由出度个数和关系的强弱共同决定。

2 ODDWG的定义和实现

2.1 类的内聚度计算

类的内聚度反映了一个类的内部各成分联系的紧密程度[4]。在UML类图中,类由类名、属性和方法3部分组成。属性又可以分为公有属性、私有属性和受保护属性。同样的,方法也可以分为公有方法、私有方法和受保护方法[5,6]。

定义1:UML中的一个类=<类名,属性,方法>,其中属性由私有、公有、保护类型的属性3个集合构成,方法由私有、公有、保护类型的方法3个集合构成。

定义2:内部边集表示属性或方法间存在着引用性访问或定义性访问的关系,有方法对属性的使用和方法对其他方法的调用。

定义3:类的属性内聚度=类的私有属性的个数/所有属性的个数(值越大,类的属性内聚度越好)。

定义4:类的方法内聚度=类的私有方法的个数/所有方法的个数(值越大,类的方法内聚度越好)。

定义5:类的内聚度(C_coh)=方法内聚度×M_P+属性内聚度×A_P +内部边集×E_P。其中M_P表示方法内聚度的权值;A_P表示属性内聚度的权值;E_P表示内部边集的权值。

最后将计算出的类的内聚度作为ODDWG中结点的权值。

2.2 类间访问耦合度计算

类间耦合度是影响类复杂程度的一个重要因素。类间耦合度受3个因素影响:联系方式,即类间通过什么方式联系;来往信息的作用,即类间来往信息作什么用;数量,即类间来往信息的多少。在面向对象的系统中根据类间联系紧密程度的强弱,由弱到强可划分为如下6 种:依赖关系(C_DE)、关联关系(C_AS)、实现关系(C_AC)、聚合关系(C_SA)、组合关系(C_CO)、继承关系(C_IN)。

定义6:类的访问度(C_Access)=访问出度(CA_OUT)+访问入度(CA_IN)。

定义7:类的耦合度(C_COu)可定义类与其他类的关系度量及其访问度函数,即:

式中:PD表示依赖关系的权重;PA表示关联关系的权重;PC表示实现关系的权重;PI表示继承关系的权重;PS表示聚合关系的权重;PO表示组合关系的权重;PIN表示访问入度的权重;POUT表示访问初度的权重。

如何获得类,以及类间的信息,本文利用RationalRose提供的接口,读取出每个类图的信息,包括属性和方法的信息,把读取出的类的信息用7元组表示[7]<类名,私有属性集合,保护属性集合,公有属性集合,私有方法集合,保护方法集合,公有方法集合>,同时提取出类间的信息。把从UML类图中得到的类间关系用一个5元组表示<类ID,起始类,结束类,类间耦合出度,类间耦合入度>。同时要将具体详细的类间关系提取出来存储到数据库中,以方便计算耦合出度和耦合入度。

3 ODDWG的实现及测试序列生成算法

3.1 ODDWG的获取

存在如下的一个类图。具体内容如表1所示:

类间存在的关系为:类A是类B与类C的父类,公有派生;类B是类H的父类,公有派生;类A和类D之间为双向关联关系;类D依赖于类G;类D与类E之间为单向关联,从D指向E;类D类F之间为单向关联,从D指向F;类E与类I之间为单向关联,从E指向I;类I单向关联类C,从I指向C。

对每个类计算类的内聚度,结果为A_C_coh> F_C_coh > D_C_coh> E_C_coh> B_C_coh >C_C_coh>G_C_coh> I_C_coh >H_C_coh。进行类间耦合度计算,按照降序排列D_C_COu>A_C_COu> H_C_Cou> B_C_COu>C_C_COu>I_C_Cou> E_C_COu>F_C_COu >G_C_COu;根据计算的类间耦合度,类内聚度和类的耦合出度,生成如图1所示的ODDWG图。

图中A_W,B_W,C_W,D_W,E_W,F_W, G_W,H_W,I_W分别代表节点的权值,等于每个类的内聚度与类耦合度的综合。结点之间边的权值由每个类的访问出度获得。例如AD表示从A到D的边的权值,图中的虚线表示可能存在的动态绑定关系。

3.2 生成算法及测试序列输出

从图中根据遍历算法,从每一个结点开始遍历,生成测试序列[8,9]的描述如下:

(1) 从UML类图中提取每个类的信息计算类的内聚度。

(2) 从UML类图中提取类间关系,并计算每个边的类间耦合度,并用三元组记录每个类的内聚度和类间耦合度<类名,类内聚度,类间耦合度>进行存储。对类间耦合度和类内聚度进行加权平均计算,计算结果作为ODDWG图的每个结点的权值。

(3) 在计算类间耦合度的同时记录每个类的耦合出度,作为结点的边的权值。

(4) 如果类间存在继承关系,并且为公有继承,那么从父类到子类用虚线标示,如果存在类和顶层父类之间存在关联关系,则也有可能存在动态绑定的可能性。如图1中D_AB,D_DA,D_BH,D_AC。

(5) 从每个结点出发(首先从权值最大的结点出发)进行遍历,如果两条边的权值一样,则参考结点,选择结点中权值大的结点为下一个遍历结点。直到不存在下一条边结束。

(6) 然后重复第五步,直到和该结点相关的路径全部已经被遍历过。

(7) 从类的集合中去除该类,然后重复步骤(5)、步骤(6),直到每个结点至少被遍历1次。

(8) 对所得测试线索进行排除,去除掉重复的线索,如果某个线索是另一个线索的子串,去除该子线索。

(9) 最后输出,存储集成测试测试序列。

针对图1进行遍历,生成测试序列如下:

①A→D→E→I→C;②D→A→B→H

③D→A→C;④D→E→I→C→A

⑤A→D→F;⑥A→D→G

4 结 语

本文针对UML类图中提取的信息,计算与类相关的信息,获得对象动态加权有向图,然后从有向图中进行遍历,生成集成测试测试序列。该算法不需要去除图中的环,生成方法简单有效,在实际需要中得到了验证,但随着类图的增加,测试序列数量会加大,导致序列的生成速度有所影响。因此下一步的工作是研究如何进行更有效的遍历,同时在下一步工作中进一步研究类间耦合度和类内聚度,使得图中每个结点的权值获取和边的权值获取更加的科学。

参考文献

[1]JORGENSEN P C,ERICKSON C.Object-oriented integra-tion testing[J].CACM,1994,37(9):30-38.

[2]吴静莉,韩松峰.基于UML集成测试模型的生成方法[J].微电子学与计算机,2008(7):9-13.

[3]陈树峰.面向对象软件的依赖性分析与回归测试[J].计算机应用,2009(6):29-32,54.

[4]林红昌,胡觉亮.基于Petri网的软件测试用例的产生和分析[J].计算机工程与应用,2009(10):30-33.

[5]FOWLERM.UML精粹-标准对象建模语言简明指南[M].徐家福,译.北京:清华大学出版社,2005.

[6]AI K C,DANIELS F J.Interclass test order for object-oriented Software[J].Journal of Object-Oriented Program-ming,1999,12(4):18-25.

[7]LE T Y,JERON T,JEZEQUEL J M,et al.Efficient ob-ject oriented integration and regression testing[J].IEEETrans on Reliabilitu,2000,49(1):12-25.

[8]WU Ye,CHEN Mei-hua,OFFUTT Jeff.UML-based inte-gration testing for component-based software lecture notesin computer science[C]//Proceedings of the Second Inter-national Conference on COTS-Based Software Systems.London,UK:Springer-Verlay,2003:251-260.

面向对象测试 篇10

随着现代软件工程的不断发展, 人们对软件质量和生产力的要求越来越高。软件测试技术和框架复用技术作为提高软件质量和生产力的有效手段, 近年来倍受人们的重视。

传统的“黑盒”、“白盒”测试技术主要应用于面向过程的程序设计中。随着面向对象技术的发展, 这种技术已不能满足软件测试的需要。自动化单元测试框架应用于面向对象单元测试中, 通过它来实现单元测试自动化。

单元测试是对软件进行正确性检验的测试工作, 是软件设计的最小单位。单元测试的目的主要是发现每个程序模块内部可能存在的错误。程序员的基本职责是单元测试, 单元测试能力是程序员基本能力的体现, 程序员必须对自己所编写的代码认真负责, 软件的质量与程序员的工作效率直接受程序员单元测试能力高低的影响。

单元测试是一项很重要而且必要的工作。在实际工作中, 许多程序员并不愿意对自己编写的代码进行测试。软件开发的工作压力大, 大多数程序员们因为没有时间测试自己的代码, 使程序的代码质量得不到保证, 有些代码还需重新编写, 程序员根本没有时间对代码进行测试。自动化单元测试框架能够从根本上解决这个问题, 它可以使测试工作变得简单, 这样更有助于程序员进行代码开发工作。

1 自动化单元测试框架设计目标

自动化单元测试框架的设计应达到以下目标:首先, 框架简单, 可以使测试程序的编写更简化。框架使用常见的工具设计, 测试工作操作简单;其次, 测试框架应能够使除作者以外的其他程序员进行代码测试, 并能解释其结果, 即将不同程序员的测试结合起来, 且不发生相互冲突。最后, 测试用例可以复用, 可以以现有的测试为起点形成新的测试。

本文将以这些目标为指导, 讨论如何用以Kent Beck和Ralph Johnson提出的“模式产生体系结构”的方式来设计框架系统。自动化单元测试框架的设计思想是从0开始根据设计问题应用设计模式, 一个接一个逐步设计, 直至获得最终合适的系统架构。其中实现部分采用Java语言来实现, 并会使用UML图来表示各种类及类间关系。

2 面向对象自动化单元测试分析

自动化测试定义为:管理与实施各种测试活动, 包括开发测试脚本、执行测试脚本, 这样使验证测试需求更加方便, 通过这些脚本实现了自动测试, 可以把它称为自动测量工具。使用这种自动测试工具对增量软件集成测试提供了巨大的方便, 增加了巨大的价值。每一个新的构件可以重用先前开发的测试脚本, 即使需求和软件有变更, 作为一个重要的控制机制, 自动测试也能够确保每一次重新构建的稳定性与准确性。

3 面向对象自动化单元测试框架

自动化测试框架实质是一种自动测试工具, 单元测试的核心问题是实现测试自动化。一个完整的自动化测试过程通常包括5个测试活动, 分别是测试标识、测试设计、测试实现、测试执行与评估。测试用例针对被测试系统的各项功能准确地开发与设计, 而且每一个测试用例都要按顺序执行这5个测试开发活动, 测试开发活动如图1所示。

测试标识与测试设计这两个测试活动主要为智力活动, 分别标识测试条件和设计测试用例。测试执行与测试比较这两个活动属于比较机械的活动, 它们的功能分别为:执行测试用例、将测试输出结果并与期望输出结果值相比较。前两个活动决定了测试用例的质量, 后两个活动适合自动化。在单元测试中, 测试执行和测试比较这两个活动要重复多次, 测试标识与测试设计通常只执行一次。因此, 在单元测试过程中, 重复性的活动特别需要自动化执行。

4 自动化单元测试设计与实现

首先构建对象来表达基本概念:Test Case (测试用例) , 然后将对象发送到测试框架, 再由测试框架执行, 最后报告测试结果。

采用Command命令模式将一个请求封装成一个对象, Command模式可以为每一个操作生成一个与之对应的对象, 同时能够给出一个对应的执行方法。这样可以对多个用户请求进行排队, 也可以将多个请求记录到日志, 并使用不同的请求对客户进行参数化。具体实现方法如下:

其中的run () 方法为模式中的执行方法, 可以通过继承来重用该类, 为了便于在测试失败时能够识别出失败的测试, 每一个Test Case在创建时都要给出与之对应的名称, 这样即可判断出失败的测试。

图1展示了测试框架组成部分的快照, 也展示了应用于TestCase中的标记。

5 单元测试用例执行流程

在实际测试过程中, 构造参数或资源、测试、释放资源为测试的业务逻辑过程。例如, 在测试数据库的插入、更新、删除、查询等操作时, 首先要对数据库进行连接, 然后测试, 最后释放连接。这样, 在一个Test Case中有多个测试, 需要反复书写代码, 这增加了测试人员的工作量, 不符合设计目标。

建立测试支架即为所有的测试建立一个共同的结构, 可以解决以上问题, 初始化代码、测试代码和释放资源的代码均放在测试支架上, 每次运行测试代码之前, 首先都运行初始化代码, 最后运行释放资源代码。这样, 每一个测试都会和与之对应的支架一起运行, 而且测试结果互不影响, 每一个结果都不会影响其它的测试结果。这样便实现了代码的复用, 大大提高了软件单元测试的工作效率。

以上通过模板方法实现, 模板方法的Template Method静态结构如图3所示。

Template Method实现如下:

其中, setUp方法初始化测试信息, 如数据库的连接, cleanUp方法的功能是测试结束后释放资源。runTest方法的功能是进行测试业务逻辑。TestCase的方法的功能为进行测试逻辑框架的设计, run为模板方法。在这里, setUp和cleanUp可以被用来重写, 由框架来进行调用。

6 测试结果收集

创建对象TestResult来收集运行的测试结果, 实现代码如下:

UTF使软件开发者们更愿意接受测试代码的工作。有种种好处:UIT使测试用例的实现简单、一致且模块化;测试实现与执行的特性支持迭代、增量开发;重新运行测试包的便利使高频率的回归测试成为可能;同时它还能保证单元测试的持久性。此外, 单元测试框架UTF也是可扩展的, 例如, 利用Decorator模式, 可以不断向UTF添加新的功能;TestResult类也是框架的一个扩展点。客户能够自定义它们的TestResult类, 例如, HTMLT-estResult可将结果上报为一个HTML文档等。

摘要:以面向对象自动化单元测试的设计目标为指导, 结合面向对象自动化单元测试理论分析, 采用Kent Beck和Ralph Johnson提出的模式产生体系结构方式架构框架系统。运用模式设计体系结构的思想, 设计了一个用于面向对象软件单元测试的自动化测试框架。该测试框架易学好用, 能方便程序员开发测试用例, 保证测试用例的持久性和可复用性, 适合迭代开发单元测试。

关键词:软件工程,软件质量,单元测试,测试框架,面向对向程序

参考文献

[1] (美) 普雷斯曼.软件工程:实践者的研究方法[M].北京:机械工业出版社, 2011.

[2] (美) 麦格雷戈.面向对象的软件测试[M].北京:机械工业出版社, 2002.

[3]刘中兵Java研究室.Java Web核心框架[M].北京:电子工业出版社, 2009.

面向对象测试 篇11

关键词:农业;学习对象;粒度;语义结构;分类法

中图分类号:TP311.52;S126 文献标志码:A 文章编号:1002-1302(2014)03-0357-03

作为一种可重用、易获取、适应性强的数字化教学内容构件,学习对象(learning object)正受到国内外教育技术界的日益关注,并已逐渐应用于高校、企事业单位的E-learning平台和知识管理系统等。学习对象的核心特性是可重用性[1],其理想状态是可供不同时间、不同地点的不同使用者出于各种目的而使用。但纵观当前各类E-learning平台,学习资源多以课程为单元进行整体设计,课程结构一般由篇或章节构成,在实际使用时缺乏可重用性和灵活性,往往造成网络教学资源的重复建设。因此,本方案拟结合客户(某大型农业企业培训学校)的实际需求[2],改变传统的课程加工模式,尝试采用基于知识模块的学习对象模型,即按照一定的粒度和方式,将知识分解为内容相对完整的模块,同时,根据具体的学习和授课需求又可以将这些模块灵活组装,针对不同学习者呈现不同的学习路径和页面风格,从而构建出一个多层次、多粒度的可重用知识体系(图1)。

1 研究背景

1.1 学习对象理论

学习对象是结合了面向对象的计算机科学思想和有关教学理论而产生的一种新型计算机辅助教学构件。学习对象较典型的定义是任何具有可重用特性并用来支持学习的数字化资源[3]。根据该定义可知,学习对象可以是一个小程序、动画、文本块、视频流或其他形式,也可以是在技术支持学习的过程中用到的多媒体内容、教学内容、学习图标、教学软件及软件工具,所涉及到的人、组织或事件等。

学习对象的核心特性是可重用性,其实现需要内容设计、技术手段和应用方法3个方面的因素保证[4]。内容设计因素是指一个学习对象应该尽量独立完成知识点或知识块的教学目的,无需过多地求助于其他教学资源或学习对象;技术设计因素是指学习对象采用数字化设计,易被搜索获取到,能够跨平台使用,并具有兼容性技术构造;应用方法因素是指学习对象要具有灵活性、适应性,如能够适应学习者的特征、实现个性化定制、能够被灵活改制等。

1.2 需求分析

本研究的目标是对客户现有知识资源进行分析评价,制定基于知识模块的可重用学习对象模型的设计原则,为实现课件模块的开发、重用和共享提供基本流程规范和设计层面的支持,从而建立具有独到竞争优势的高效在线培训体系,进而成为未来构建智能知识服务系统的数据基础。

通过分析结果可知,该农业企业培训学校知识资源的主要特点表现为:(1)信息量大。从知识的领域范围来看,涵盖了农业系统、管理、教育在内的多个领域,是一个跨领域综合的知识集合。(2)信息的表现形式多。信息形式多种多样,包括教学及相关辅助资源在内的多种知识资源,如制度、案例、记录、报告、标准、规范等。(3)信息格式复杂。包括文本、音频、图片、PPT等多种格式的信息混杂在一起。(4)信息收集地点分散。信息来源丰富,如教师的课堂录音、课件PPT、相关管理部门、网络等。(5)使用信息的用户不同。用户类型包括企业普通员工、企业管理部门、普通企业客户等。每种类型的参与者都有各自的信息需求,需要的信息范围、侧重点都不一样。(6)资源数量和资源类型不断扩展,内容不断变化更新。

根据上述资源特点,可分析得出在该项目中学习对象的应用需求,具体包括:(1)支持微型学习。微型学习是指随时随地可能发生的、可持续性地处理碎片化学习内容的学习活动,要求课程学习内容和资源的获取具有随意性,课程学习内容具有实效性、可操作性和可再生性。有别于传统的以1节课为最小粒度的学习对象,学习者可能只需要学习知识体系中一个很小的片段。(2)支持个性化学习。该需求打破了传统固有的课程结构,学习者可以根据自己的学习起点、学习层次等实际需求,进行跳跃式或查漏补缺式的学习等,同时可以根据实际学习效果自主调整学习策略和学习路径。(3)支持自主组课。组课的过程是面向特定教学群体的知识重用过程。该需求要求对知识资源的内在逻辑结构进行梳理分类,同时能够对学习对象的语义结构进行准确描述。

1.3 研究重点

根据上述应用场景得出学习对象的分析流程(图2)。由图2可知,在学习对象的分析流程中需要考虑若干问题。其中,设计合理的知识粒度层次、对其语义结构属性进行准确表达,同时对知识资源进行分类梳理,是本试验重点研究的关键问题。具体研究重点如下:(1)粒度。学习对象的力度大小是决定学习对象重用共享的重要因素。目前对学习对象的粒度缺乏明确规定[5]。粒度划分过大,重用性会降低;粒度太小,知识体系结构的复杂度会增加;如何根据用户的实际教学需要,确定适宜的学习对象粒度是大家需要解决的首要问题。(2)描述。应采用最本源的概念形式对学习对象进行简明清晰的描述,以准确表达学习对象的语义内容,对粒度划分进行指引,减少加工人员的主观性偏差,同时为教师组课提供辅助。(3)分类。为了实现学习资源的交换、共享和重用,需要对各类知识资源的逻辑关系、耦合关系进行梳理、整合,建立科学合理的类目体系,以便对资源进行分类组织。

2 模型设计

2.1 学习对象粒度

当一个学习对象规模越大时,它的内容就能越完整,更有利于实现教学目标,所表现出的教学意义也就会越高;但同时,它的灵活性与可重用性却随着规模的增大而相应变小。在综合分析用户需求及资源特点的基础上,本项目提出以知识模块为最小教学单元的多粒度学习对象模型(图3)。其中,知识模块是模型中最小粒度层级;章节指若干知识模块的组合;课时为若干章节组合所得的一节课;课程是具有完整教学意义的多个课时组合;课程体系则指一门完整知识体系的教学结构集合。学习对象各个层次的聚合特性如表1所示。

nlc202309032002

从表1可以看出,当一个学习对象规模越大时,它所包含的教学信息越多、内容越完整,更有利于实现教学目标,所表现出的教学意义也就会越高;但同时其灵活性随着粒度的增大而相应变低。

本研究所提出的知识模块是学习对象模型的基础与核心。将原始文献拆分为若干相对独立的知识模块,从而使知识点脱离原有的上下文语境,可以单独使用,也可以与其他模块组合成章节,在知识的表达和传递上更加灵活,具有更强的适应性。

将知识模块的划分原则设定为:(1)知识模块相对独立。模块内容应表达单一的知识含义,即与语言中的“语素”含义近似,模块内容只包含一个单一的知识含义,不存在一个知识模块中多重表意的现象。(2)知识模块已是最小知识单元,不能再细分。

2.2 知识模块描述

根据上述粒度原则可知,知识模块是最小知识单元,每个模块都可以从若干角度对某个概念进行说明,大家将这些角度称为概念的属性[6]。每一概念的属性和包含的知识内容就是一个知识模块,它单独表意,没有再细分的必要。有研究表明,当一个知识点的粒度处于不可再拆分状态时,其内容往往是围绕着一个特定概念的某种属性而进行论述的,换句话说,一个概念加一个属性就可以完整表达一个基本的知识内涵,因此为了实现知识处理的简单化和关系描述的标准化,可以将每个知识单元的描述概念化,即定义一个2元组:知识模块=(概念|属性)。此外,一个知识模块还有可能同时描述多个概念,对于这种情况则将知识模块定义为:知识模块=(概念1,概念2,…,概念N|属性|概念间关系)(图4)。

一篇文献中可能有多个概念,一个概念也可能有多个属性,概念和属性之间是“一对多”的关系。可以通过对现有知识资源进行分析,总结出一些通用属性以作指引。例如,从知识阐述形式的角度可以总结出定义、背景、解释、分析、比较等属性;从知识约束内容的角度可以总结出条件、目的、范围、影响、优缺点等属性。此外,一般来说,不同类型的文档都有其通用的层次结构,可以针对资源的不同类型总结其结构属性。知识模块的语义描述对用户的检索和精确定位、自主组课都至关重要,同时也为原始课程文档的拆分确定了依据和原则。

2.3 知识资源分类

为了有效地创建、组织和编列学习对象,有必要对各类知识资源的逻辑关系、耦合关系进行梳理、整合,建立科学合理的类目体系[7]。目前常用的线性分类法层次性好,能较好地反映类目之间的逻辑关系;实用方便,既符合手工处理信息的传统习惯,又便于电子计算机处理信息。但其缺点在于结构弹性较差,分类结构一经确定,不易改动。同时,当分类层次较多时,代码位数较长、效率较低。分面组配分类法可以较好地解决电子资源分类问题,而且本身建设成本较低,能够适应资源的变化,揭示细小专深的主题。但是绝对的组配也会带来类目及其不均匀,临时组合对标引要求较高的问题。因此,本方案采用半分面组配式分类法,结合线性分类法和分面组配法的优点,在有效控制分类法规模的同时,提高分类体系的适应性和灵活性,降低标引难度。

笔者以《中国农业百科全书》《中图分类法》等为参考,首先从知识内容的角度切入,以学科脉络为主要依据,按照信息资源描述的主题内容建立分类主分表,以涵盖知识资源的全部领域范围(表2)。

3 总结

本研究提出了一种面向农业领域的可重用学习对象模型,针对当前企业E-learning和知识管理系统中存在的可重用性需求,重点对学习对象的粒度、知识模块描述、知识资源分类等关键问题进行研究,为学习对象最大程度的重用和个性化学习提供支持,为下一步技术平台开发和应用奠定良好的基础。

参考文献:

[1]胡小勇,祝智庭. 可重用学习对象的分类法[J]. 电化教育研究,2003(8):9-12,17.

[2]李建龙,李 鹤,刚成诚,等. 5S一体化集成技术及其在农业科学中的应用进展[J]. 江苏农业科学,2010(5):26-29.

[3]David A W. Connecting learning objects to instructional design theory:a definition,a metaphor,and a taxonomy[EB/OL]. [2013-05-08]. http://archive2.nmc.org/projects/lo/sap_pa_wiley.shtml.

[4]祝智庭,胡小勇. 学习对象理念的发展历程[J]. 电化教育研究,2002(9):14-19.

[5]Reusable Learning-Glossary[EB/OL].(2010-10-08)[2013-05-08]. http://www.innovativelearning.ca/archive/resources/examples/glossary.htm.

[6]Information mappin[EB/OL]. [2013-05-08]. http://www.namahn.com/resources/documents/note-IM.pdf.

[7]马张华. 信息组织[M]. 3版.北京:清华大学出版社,2008:74-130.

[8]陈洪澜. 论知识分类的十大方式[J]. 科学学研究,2007,25(1):26-31.

面向对象测试 篇12

空中交通管制的业务主要包括了空中交通管制业务、飞行情报和告警业务, 作用是对在空中活动的航空器进行相应的管理和控制。主要任务是:防止航空器的相撞, 防止航空器跟附近空域中的同障碍物相撞, 同时对空中的交通秩序进行维护, 进而保障空中交通的畅通, 从而能够保证飞行的安全以及提高飞行的效率。空中交通管制的方法主要是程序管制和雷达管制两类, 程序管制主要是根据飞行员对飞行的位置和状态进行及时的报告, 管制员依据报告进行简单的分析和预测飞行中可能出现的冲突, 同时通过管制指令给飞行员下达指令, 起到空中交通安全维护和空中交通流量加速的作用。雷达管制主要是对雷达进行二次监视来确定飞行的位置、高度、速度和航向等信息, 管制员对其进行分析和决策之后发出调度的指令, 从而对航空器安全有序的运行有着引导作用。程序管制是雷达管制的基础, 雷达管制相比程序管制显得更高效。由于空中交通管制系统本身具有的复杂性, 传统的面向过程开发方法已不能够满足空中交通管制系统开发时的需求, 因此, 面向对象技术的选用显得很重要。

2 面向对象的测试技术

2.1 空管系统的类测试

在以往的单元测试中, 由于每个程序块都可以完成一定的功能, 因此只需测试它的相关函数和过程就可以。根据单元测试这个理念, 在进行相关测试时其实际上是测试的类成员函数。而以往的测试方法则更多的是针对面向对象而进行的, 例如可以采用逻辑覆盖法、边值分析法以及因果图法等。如果程序是面向对象的, 那么这个程序一般都不是很大, 而且其功能也比较简单, 但是在不断调用这些函数时, 就难免会出现一些无法估计的错误, 比如在语句if (-1==write (fid, buffer, amount) ) error_out () ;中, 可以看出, 在对write子函数进行检查时, 发现其没有具体的返回值, 这就会导致这样的问题———数据是否写入。

面向对象的开发模型突破了传统的瀑布模型, 将开发分为面向对象分析 (OOA) , 面向对象设计 (OOD) , 和面向对象编程 (OOP) 三个阶段。针对这种开发模型, 结合传统的测试步骤的划分, 我们把面向对象的软件测试分为:面向对象分析的测试, 面向对象设计的测试, 面向对象编程的测试, 面向对象单元测试, 面向对象集成测试, 面向对象系统测试。在传统的面向过程程序中, 对于函数y=Function (x) ;只需要考虑一个函数 (Function () ) 的行为特点, 在面向对象程序中, 你不得不同时考虑基类函数 (Base::Function () ) 的行为和继承类函数 (Derived::Function () ) 的行为。

面向对象程序的结构不再是传统的功能模块结构, 作为一个整体, 原有集成测试所要求的逐步将开发的模块搭建在一起进行测试的方法已不可能。面向对象软件测试是根据面向对象的软件开发过程结合面向对象的特点提出的。它包括分析与设计模型测试技术、类测试技术、对象交互测试技术、类层次结构测试技术、面向对象系统测试技术5大部分。OOA中认定的对象是对问题空间中的结构, 其他系统, 设备, 被记忆的事件, 系统涉及的人员等实际实例的抽象。对它的测试可以从如下方面考虑:

(1) 抽象的对象是否全面, 是否问题空间中所有涉及到的实例都反映在认定的抽象对象中。

(2) 认定的对象是否具有多个属性。只有一个属性的对象通常应看成其他对象的属性, 而不是抽象为独立的对象。对认定为同一对象的实例是否有共同的, 区别于其他实例的共同属性。

(3) 对认定为同一对象的实例是否提供或需要相同的服务, 如果服务随着不同的实例而变化, 认定的对象就需要分解或利用继承性来分类表示。

(4) 认定的对象的名称应该尽量准确, 适用。结构表示问题空间的复杂程度。标识结构的目的在于管理问题域模型。在OOA中, 结构是指泛化-特化结构 (is a) 和整体-部分结构 (has a) 两部分的总和。对于结构中的一种对象, 尤其是处于高层的对象, 是否在问题空间中含有不同于下一层对象的特殊性可能, 即是否能派生出下一层对象。对于结构中的一种对象, 尤其是处于同一低层的对象, 是否能抽象出现实中有有意义的更一般的上层对象对所有认定的对象, 是否能在问题空间内向上层抽象出在现实中有意义的对象;高层的对象的特性是否完全体现下层的共性;低层的对象是否有高层特性基础上的特殊性;主题是一种知道研究和处理大型复杂模型的机制。有助于分解系统, 区分结构, 避免过多的信息量同时出现所带来的麻烦。主题的确定可以帮助人们从一个更高的层次上观察和表达系统的总体模型。主题如同文章对个部分内容的概要。属性是用来描述对象或结构所反映的实例的特性。而实例关联是反映实例集合间的映射关系。

2.2 空管系统的类簇测试

静态测试, 主要对程序的结构进行检测, 考察程序的结构是否满足设计的要求。现有的一些测试软件都可以提供一种称为“可逆性工程”的检测功能, 即通过原程序所得到的类关系图和函数功能来调用关系图。

动态测试, 对用例进行设计测试时, 一般是需要上述的功能来调用结构图、类关系图或者实体关系图, 将这些关系图作为参考, 进而确定不需要被重复测试的部分, 从而达到优化测试用例的作用, 同时减少测试的工作量, 使测试能够达到一定的覆盖标准。

2.3 空管系统的系统测试

系统测试的测试平台应该尽量与用户实际的使用环境想接近, 同时要保证被测系统具有完整性, 暂时缺少的系统设备部件, 也应该有相应的模拟手段。对空管系统进行最后的系统测试阶段, 应该从不同的方面来对空管系统进行测试。然而, 系统测试的正确性关键在于测试平台的模拟环境是否与实际的使用环境具有一致性。

空管系统的模拟测试环境与实际环境的相近是很关键的, 主要体现在以下两个方面:一方面, 首先对雷达数据进行模拟信号的产生, 该模拟的雷达数据主要是通过通讯数据转换卡进行获取的, 通讯数据来自本地与异地雷达的信息交换, 然后对雷达目标的信息进行实时探测, 多雷达进行数据获取同时进行融合产生飞行器的航迹;另一方面, 对飞行情报的数据进行模拟信号的产生, 该模拟数据主要是通过飞行情报网 (FIN) 获得的, 利用航行信息数据库来进行翻译各种报文, 根据报文信息对飞行计划进行及时的处理和调整, 最终完成动态飞行航迹的关联系统测试, 将处理的结果进行分析并生成飞行器的轨迹信息以及飞行的一些统计数据, 管制员同时还将制定的飞行信息发送到对应的管制中心。

3 结束语

随着我国经济的快速稳定发展, 民航运输事业的不断发展, 本文通过对空中交通管制系统的介绍和分析, 对空中交通管理系统中的面向对象测试技术进行分析。由于空中交通管制系统本身具有的复杂性, 传统的面向过程开发方法已不能够满足空中交通管制系统开发时的需求。空中交通管制系统的发展, 依赖于众多的工程技术和学科的进一步研究和发展。目前, 面向对象的技术是比较适合空中交通管制系统的软件工程方法。

摘要:随着我国经济的快速稳定发展, 民航运输事业的不断发展, 空中交通管制系统在航空部门的空中交通控制和管理系统中也得到了广泛的应用, 主要用于管理飞行事务, 防止发生飞行交通事故。通过对空中交通管制系统的介绍和分析, 对空中交通管理系统中的面向对象测试技术进行研究。

关键词:空中交通管制,面向对象,技术,研究

参考文献

[1]施凤鸣.基于UML状态图的类测试用例自动生成方法, 2003.[1]施凤鸣.基于UML状态图的类测试用例自动生成方法, 2003.

上一篇:马铃薯质量检测论文下一篇:测量坐标系