面向对象软件的测试
| 软件测试技术第一门户5\.T'v4zw.}+v't$I9Q6B 用户使用低质量的软件,在运行过程中会产生各种各样的问题,可能带来不同程度的严重后果,轻者影响系统的正常工作,重者造成事故,损失生命财产。软件测试是保证软件质量的最重要的手段。什么是软件测试?1983年IEEE定义为:使用人工或自动手段来运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。 现代的软件开发工程是将整个软件开发过程明确的划分为几个阶段(参见[6]的论述),将复杂问题具体按阶段加以解决。这样,在软件的整个开发过程中,可以对每一阶段提出若干明确的监控点,作为各阶段目标实现的检验标准,从而提高开发过程的可见度和保证开发过程的正确性。经验证明,软件的质量不仅是体现在程序的正确性上,它和编码以前所做的需求分析,软件设计密切相关。软件使用中出现的错误,不一定是编程人员在编码阶段引入的,很可能在程序设计,甚而需求分析时就埋下了祸因。这时,对错误的纠正往往不能通过可能会诱发更多错误的简单的修修补补,而必须追溯到软件开发的最初阶段。这无疑增大了软件的开发费用。因此,为了保证软件的质量,我们应该着眼于整个软件生存期,特别是着眼于编码以前的各开发阶段的工作。这样,软件测试的概念和实施范围必须扩充,应该包括在整个开发各阶段的复查、评估和检测。由此,广义的软件测试实际是由确认、验证、测试三个方面组成(注:本文对后面用广义测试概念处不另加标识):软件测试技术第一门户/X)EFt;X
N;u-p3Kk 确认:是评估将要开发的软件产品是否是正确无误、可行和有价值的。比如,将要开发的软件是否会满足用户提出的要求,是否能在将来的实际使用环境中正确稳定的运行,是否存在隐患等。这里包含了对用户需求满足程度的评价。确认意味着确保一个待开发软件是正确无误的,是对软件开发构想的检测。 验证:是检测软件开发的每个阶段、每个步骤的结果是否正确无误,是否与软件开发各阶段的要求或期望的结果相一致。验证意味着确保软件是会正确无误的实现软件的需求,开发过程是沿着正确的方向在进行。 测试:与狭隘的测试概念统一。通常是经过单元测试、集成测试、系统测试三个环节。 在整个软件生存期(参见[6]中的划分),确认、验证、测试分别有其侧重的阶段。确认主要体现在计划阶段、需求分析阶段、也会出现在测试阶段;验证主要体现在设计阶段和编码阶段;测试主要体现在编码阶段和测试阶段。事实上,确认、验证、测试是相辅相成的。确认无疑会产生验证和测试的标准,而验证和测试通常又会帮助完成一些确认,特别是在系统测试阶段。软件测试技术第一门户b'}IpKc&w ${ ?)UKn+J0 面向对象技术是一种全新的软件开发技术,正逐渐代替被广泛使用的面向过程开发方法,被看成是解决软件危机的新兴技术。面向对象技术产生更好的系统结构,更规范的编程风格,极大的优化了数据使用的安全性,提高了程序代码的重用,一些人就此认为面向对象技术开发出的程序无需进行测试。应该看到,尽管面向对象技术的基本思想保证了软件应该有更高的质量,但实际情况却并非如此,因为无论采用什么样的编程技术,编程人员的错误都是不可避免的,而且由于面向对象技术开发的软件代码重用率高,更需要严格测试,避免错误的繁衍。因此,软件测试并没有面向对象编程的兴起而丧失掉它的重要性。软件测试技术第一门户v7h1x+\Z?%s
F.[![ 从1982年在美国北卡罗来纳大学召开首次软件测试的正式技术会议至今,软件测试理论迅速发展,并相应出现了各种软件测试方法,使软件测试技术得到极大的提高。然而,一度实践证明行之有效的软件测试对面向对象技术开发的软件多少显得有些力不从心。尤其是面向对象技术所独有的多态,继承,封装等新特点,产生了传统语言设计所不存在的错误可能性,或者使得传统软件测试中的重点不再显得突出,或者使原来测试经验认为和实践证明的次要方面成为了主要问题。例如:软件测试技术第一门户 qPsDt iE$D)r.?7c@t0}0 在传统的面向过程程序中,对于函数软件测试技术第一门户:ej[*d
Cc/c"O)} 面向对象程序的结构不再是传统的功能模块结构,作为一个整体,原有集成测试所要求的逐步将开发的模块搭建在一起进行测试的方法已成为不可能。而且,面向对象软件抛弃了传统的开发模式,对每个开发阶段都有不同以往的要求和结果,已经不可能用功能细化的观点来检测面向对象分析和设计的结果。因此,传统的测试模型对面向对象软件已经不再适用。针对面向对象软件的开发特点,应该有一种新的测试模型。软件测试技术第一门户"Yu Yvyb5^7c 软件测试技术第一门户T2i#UCsb6q/`^软件测试技术第一门户o.T wfj a)M SH3a#m0一、面向对象测试模型(Object-Orient Test Model) 6cd MQ3?0Yi|)c0软件测试技术第一门户dlS ^ rG8R面向对象的开发模型突破了传统的瀑布模型,将开发分为面向对象分析(OOA),面向对象设计(OOD),和面向对象编程(OOP)三个阶段。分析阶段产生整个问题空间的抽象描述,在此基础上,进一步归纳出适用于面向对象编程语言的类和类结构,最后形成代码。由于面向对象的特点,采用这种开发模型能有效的将分析设计的文本或图表代码化,不断适应用户需求的变动。针对这种开发模型,结合传统的测试步骤的划分,本文建议一种整个软件开发过程中不断测试的测试模型,使开发阶段的测试与编码完成后的单元测试、集成测试、系统测试成为一个整体。测试模型如下图所示:软件测试技术第一门户:j0Y1}K6L-U!ER*D oy] |
|
| 0 面向对象编程 o.K gE-GF
^0 OOA Test:面向对象分析的测试 OOD Test:面向对象设计的测试软件测试技术第一门户-}+LX:P#{:pvu? OOA Test和OOD Test 是对分析结果和设计结果的测试,主要是对分析设计产生的文本进行,是软件开发前期的关键性测试。OOP Test主要针对编程风格和程序代码实现进行测试,其主要的测试内容在面向对象单元测试和面向对象集成测试中体现。面向对象单元测试是对程序内部具体单一的功能模块的测试,如果程序是用C++语言实现,主要就是对类成员函数的测试。面向对象单元测试是进行面向对象集成测试的基础。面向对象集成测试主要对系统内部的相互服务进行测试,如成员函数间的相互作用,类间的消息传递等。面向对象集成测试不但要基于面向对象单元测试,更要参见OOD或OOD Test结果(详见后叙述)。面向对象系统测试是基于面向对象集成测试的最后阶段的测试,主要以用户需求为测试标准,需要借鉴OOA或OOA Test结果。软件测试技术第一门户{v2a:~w!~]*Q&B#h:V 9ZOT
^m(A"D$VM0 尽管上述各阶段的测试构成一相互作用的整体,但其测试的主体、方向和方法各有不同,且为叙述的方便,本文接下来将从OOA,OOD,OOP,单元测试,集成测试,系统测试六个方面分别介绍对面向对象软件的测试。软件测试技术第一门户[v7sgkJm _Q W| 对由OOA,OOP,OOD这三个开发阶段所构成的开发模型、各阶段应该完成的目标以及结果报告的形式等详细介绍,已经超出本文内容,请参见[1]。 #j5Z&Pc3QqOO0xovO2l\hW0二、面向对象分析的测试(OOA Test) A9no7k;h-n'i8Tj R0G0软件测试技术第一门户t~ZM0s*lr:\l7r 传统的面向过程分析是一个功能分解的过程,是把一个系统看成可以分解的功能的集合。这种传统的功能分解分析法的着眼点在于一个系统需要什么样的信息处理方法和过程,以过程的抽象来对待系统的需要。而面向对象分析(OOA)是"把E-R图和语义网络模型,即信息造型中的概念,与面向对象程序设计语言中的重要概念结合在一起而形成的分析方法"(参见[1]),最后通常是得到问题空间的图表的形式描述。软件测试技术第一门户/C2W#U1GB,B?d&Q OOA直接映射问题空间,全面的将问题空间中实现功能的现实抽象化。将问题空间中的实例抽象为对象(不同于C++中的对象概念),用对象的结构反映问题空间的复杂实例和复杂关系,用属性和服务表示实例的特性和行为。对一个系统而言,与传统分析方法产生的结果相反,行为是相对稳定的,结构是相对不稳定的,这更充分反映了现实的特性。OOA的结果是为后面阶段类的选定和实现,类层次结构的组织和实现提供平台。因此,OOA对问题空间分析抽象的不完整,最终会影响软件的功能实现,导致软件开发后期大量可避免的修补工作;而一些冗余的对象或结构会影响类的选定、程序的整体结构或增加程序员不必要的工作量。因此,本文对OOA的测试重点在其完整性和冗余性。软件测试技术第一门户
Wrc_5y6u
R
bs2Ss"US F1R4@So!yc7aM&Jj0 尽管OOA的测试是一个不可分割的系统过程,为叙述的方便,鉴于[2]中Coad方法所提出的OOA实现步骤,对OOA阶段的测试划分为以下五个方面:软件测试技术第一门户4u oq]5\K`&{t1] |
|
"q+hT:T*W"|"^01 对认定的对象的测试:软件测试技术第一门户S9u1iK8z[^8j
h0Qm uW7t"SiG%M G0 OOA中认定的对象是对问题空间中的结构,其他系统,设备,被记忆的事件,系统涉及的人员等实际实例的抽象(参见[2])。对它的测试可以从如下方面考虑: 8]zc-KN3L
x0 1.1 认定的对象是否全面,是否问题空间中所有涉及到的实例都反映在认定的抽象对象中。软件测试技术第一门户j:T8V0BFZ~*\?6h FP5n!VKD:xGX02 对认定的结构的测试 在Coad方法中,认定的结构指的是多种对象的组织方式,用来反映问题空间中的复杂实例和复杂关系。认定的结构分为两种:分类结构和组装结构。分类结构体现了问题空间中实例的一般与特殊的关系,组装结构体现了问题空间中实例整体与局部的关系。软件测试技术第一门户};HP1j%r.Nw!T w 2.1 对认定的分类结构的测试可从如下方面着手: 2.1.1 对于结构中的一种对象,尤其是处于高层的对象,是否在问题空间中含有不同于下一层对象的特殊可能性,即是否能派生出下一层对象。 }e2yO$X4dl8hUT02.2 对认定的组装结构的测试从如下方面入手:软件测试技术第一门户swPLf*E5PT? *c`
P"d"c8NT*Ly03 对认定的主题的测试 6G(E-?eu!k0 主题是在对象和结构的基础上更高一层的抽象,是为了提供OOA分析结果的可见性,如同文章对各部分内容的概要。对主题层的测试应该考虑以下方面:软件测试技术第一门户/B({r4KaY
|k 7q'}l@s:Iv O u0 3.1 贯彻George Miller 的"7+2"原则(参见[3]),如果主题个数超过7个,就要求对有较密切属性和服务的主题进行归并。软件测试技术第一门户NF{ZK7Sj ,CS*ZV"IwS.F'X0 3.2 主题所反映的一组对象和结构是否具有相同和相近的属性和服务。 3.3 认定的主题是否是对象和结构更高层的抽象,是否便于理解OOA结果的概貌(尤其是对非技术人员的OOA 结果读者)。 r#@2Jc!vu&{0 3.4 主题间的消息联系(抽象)是否代表了主题所反映的对象和结构之间的所有关联。 G5w V!n Q\$y"Q0[5^i\-P@g!s8Z"c04 对定义的属性和实例关联的测试 v+A"n
BI1`'H0 属性是用来描述对象或结构所反映的实例的特性。而实例关联是反映实例集合间的映射关系。对属性和实例关联的测试从如下方面考虑:软件测试技术第一门户1CfEA|F#L 4.1 定义的属性是否对相应的对象和分类结构的每个现实实例都适用。 5 对定义的服务和消息关联的测试软件测试技术第一门户_-f)x Y0L7s 9j[;g1bOR:k"?A0L+u ?0 定义的服务,就是定义的每一种对象和结构在问题空间所要求的行为。由于问题空中实例间必要的通信,在OOA 中相应需要定义消息关联(详细内容参见[3])。对定义的服务和消息关联的测试从如下方面进行: u7^.k
q0B"pCWn0 5.1 对象和结构在问题空间的不同状态是否定义了相应的服务。软件测试技术第一门户2R4z2n'K^X)K.L:T$P(a%R (h1h8IS/pnr`0三、面向对象设计的测试(OOD Test)软件测试技术第一门户 Vq UU5zC$JuZ G#wF/?1{8i0 通常的结构化的设计方法,用的"是面向作业的设计方法,它把系统分解以后,提出一组作业,这些作业是以过程实现系统的基础构造,把问题域的分析转化为求解域的设计,分析的结果是设计阶段的输入"(参见[1])。 而面向对象设计(OOD)采用"造型的观点",以OOA为基础归纳出类,并建立类结构或进一步构造成类库,实现分析结果对问题空间的抽象。OOD 归纳的类,可以是对象简单的延续,可以是不同对象的相同或相似的服务。由此可见,OOD不是在OOA上的另一思维方式的大动干戈,而是OOA的进一步细化和更高层的抽象。所以,OOD与OOA 的界限通常是难以严格区分的。OOD确定类和类结构不仅是满足当前需求分析的要求,更重要的是通过重新组合或加以适当的补充,能方便实现功能的重用和扩增,以不断适应用户的要求。因此,对OOD的测试,本文建议针对功能的实现和重用以及对OOA结果的拓展,从如下三方面考虑: 1 对认定的类的测试 Iw Ny"D@
N*t,G0 OOD认定的类可以是OOA中认定的对象,也可以是对象所需要的服务的抽象,对象所具有的属性的抽象。认定的类原则上应该尽量基础性,这样才便于维护和重用。参考[4][5]中所提出的一些准则,测试认定的类:软件测试技术第一门户$u}$~?"V0We 1.1 是否含盖了OOA中所有认定的对象。软件测试技术第一门户id6}(x)q$s"g2An *y{6b.jd#N3d8b02 对构造的类层次结构的测试 为能充分发挥面向对象的继承共享特性,OOD的类层次结构,通常基于OOA中产生的分类结构的原则来组织,着重体现父类和子类间一般性和特殊性。两者概念上的差异,请参见[1]。在当前的问题空间,对类层次结构的主要要求是能在解空间构造实现全部功能的结构框架。为此,测试如下方面:软件测试技术第一门户E2\:C`w%d*g UU ;`'N/g+AQ} Xj+h;c0 2.1 类层次结构是否含盖了所有定义的类。软件测试技术第一门户)f&Q
y6aj |

