(计算机应用技术专业论文)类的数据流测试技术研究.pdf_第1页
(计算机应用技术专业论文)类的数据流测试技术研究.pdf_第2页
(计算机应用技术专业论文)类的数据流测试技术研究.pdf_第3页
(计算机应用技术专业论文)类的数据流测试技术研究.pdf_第4页
(计算机应用技术专业论文)类的数据流测试技术研究.pdf_第5页
已阅读5页,还剩61页未读 继续免费阅读

(计算机应用技术专业论文)类的数据流测试技术研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华中科技大学硕士学位论文 摘要 ( 在软件生命周期内,软件测试是保证软件质量的关键环节之一。面向对象方法学 在软件工程中的引入极大地方便了软件的设计、开发和维护,为软件质量提供了较高 的保证,但面向对象的封装、继承、多态和动态绑定等新特性的出现也给软件测试带 了新的挑战。 类测试是面向对象系统测试的重点和难点之一。将实例变量和成员函数包装成一 个类是面向对象编程的基础。对象是类的动态表现,其状态转换与成员函数作用于实 例变量的数据流过程密切相关。因而,类的数据流测试可以发现类的成员函数和实例 变量之间交互作用时发生的错误。l i 类的数据流测试从以下两方面着手研究: ( 1 ) 基于规范的类的数据流测试技术研究 基于规范的测试就是利用软件的文档规范来产生测试用例的测试策略,从而可以 揭示软件规范中存在的错误。将数据流技术引入到状态机的测试方法,产生的测试用 例可以揭示所有的实例变量的错误,而不再仅限于发现与对象状态定义有关的实例变 量的错误。另外,有限状态机测试又能为类的数据流测试提供有效的测试用例( 函数 序列) 生成方法,提高了测试效率。 ( 2 ) 基于代码的类的数据流测试技术研究 基于代码的测试就是从程序源代码产生测试用例的软件测试方法。它可以发现系 统实现中产生的错误。作为一种非常有效的基于代码的测试策略,数据流测试也可以 用于二类的代码测试中。这是基于这样种观察,即对象中的计算是实例变量上的动作 序列。基于此,提出了一种类数据流测试框架。该测试框架首先在类的范围内建立数 撼赢图,并计算出实例变量的定义使用对信息。接着通过匹配各成员函数的前置条 件和后置条件( 函数激活所必须满足的) ,为定义使用对演绎出d c 路径( 如果存在 的话) ,即函数激活序列。这种测试策略降低了数据流测试中策使用例选择的复杂性, 而且产生的测试用例可以发现成员函数和实例变量的交互作用错误。 ( c d f t e s t e r 测试系统是基于类的数据流测试策略而设计实现的,可以自动分析类 的数据流信息,并产生满足一定数据流测试准则的测试用例。同时,可以自动为测试 用例产生测试驱动。测试驱动是以友元函数的方式实现的。叫 华中科技大学硕士学位论文 a b s t r a c t i nt h el i f ec y c l eo fs o f t w a r e ,s o f t w a r et e s t i n gi so n eo f t h ek e y st oe n s u r et h eq u a l i t yo f t h es o f t w a r e t h ei n t r o d u c t i o no fo b j e c t o r i e n t e dm e t h o d o l o g yi n t os o f t w a r ee n g i n e e r i n g m a k e st h ep r o c e s so fs o f t w a r ed e s i g n ,d e v e l o p m e n ta n dm a i n t e n a n c em o r ec o n v e n i e n t ,b u t t h ec h a r a c t e r so ft h eo b j e c t o r i e n t e d ,s u c ha se n c a p s u l a t i o n ,i n h e r i t a n c e ,p o l y m o r p h i s m a n dd y n a m i cb i n d i n ga n ds oo n ,b r i n gf o r w a r ds o m en e wc h a l l e n g i n gp r o b l e m si n t ot h e s o f t w a r et e s t i n g i nt h i sp a p e r , t h et e s t i n gt e c h n o l o g yo nc l a s sl e v e li sd i s c u s s e d c l a s se n c a p s u l a t i n g i n s t a n c ev a r i a b l e sa n dm e m b e rf u n c t i o n si st h eb a s i cu n i to ft h e0 0s y s t e m t h eo b j e c ti s t h ed y n a m i cp r e s e n c eo ft h ec l a s s ,a n ds t a t et r a n s i t i o ni sc l o s e l yr e l a t e dt ot h ed a t af l o wo f m e m b e rf u n c t i o na c t i n go ni n s t a n c ev a r i a b l e s t h e r e f o r e ,t e s t i n gb a s e do nd a t af l o wm o d e l c a nd i s c l o s et h ef a u l t si nt h ei n t e r a c t i o no f t h em e m b e rf u n c t i o nw i t hi n s t a n c ev a r i a b l e s i no r d e rt og e n e r a t et e s tc a s e ,t h er e s e a r c hf o rc l a s sd a t af l o wt e s t i n gt e c h n o l o g ym a i n l y f o c u so nt h ef o l l o w i n g a s p e c t s : 1 t h er e s e a r c ho nt h ec l a s sd a t af l o w t e s t i n gt e c h n o l o g y b a s e do ns p e c i f i c a t i o n t e s t i n gb a s e do ns p e c i f i c a t i o ni st h em e t h o d t h a tm a k e su s eo ft h ed e s i g ns p e c i f i c a t i o n t op r o d u c et e s tc a s e ,w h i c hc a l ld i s c l o s et h o s ek i n d so ff a u l t sh i d i n gi nt h es p e c i f i c a t i o n i n t h i sp a p e r , d a t af l o wt e s t i n gm o d e lw h i c hi su s e dt ot e s ts t r u c t u r a lp r o g r a m m i n gf r e q u e n t l y , i s c r e a t i v e l ya d o p t e di n t o t h e t e s t i n g b a s e df i n i t es t a t em a c h i n e ( f s m ) 。t h u s ,f a u l t s i n v o l v i n gw i t h a l li n s t a n c ev a d a b l e sn o tj u s tt h ev a r i a l b e sd e f i n i n gt h es t a t ec a nb e d i s c l o s e d a tt h es a m et i m e ,f s mc a l lp r o v i d ev a l i dm e t h o dg e n e r a t i n gt e s t c a s ef o r d a t a f l o w t e s t i n g 2 t h er e s e a r c ho nt h ec l a s sd a t af l o w t e s t i n gt e c h n o l o g y b a s e do ns o u r c ec o d e t e s t i n gb a s e d o ns o u r c ec o d ei sk i n do fm e t h o dt h a tg e n e r a t et e s tc a s ef r o mt h es o u r c e c o d e s ,s oi t c a l ld e t e c tt h ed e f e c t si nt h ei m p l e m e n t a t i o n a sa ne f f e c t i v et e s t i n gs t r a t e g y b a s e do nc o d e ,d a t af l o wt e s t i n ga l s oc a nb eu s e dt ot e s tt h ec l a s s ,f o rt i l a tt h ec o m l m t a t i o n i nt h eo b j e c ti sa na c t i o ns e q u e n c eo ni n s t a n c ev a r i a b l e s b a s e do nt h i s ,w eb r i n gf o r w a r da c l a s s d a t a f l o wt e s t i n gf r a m e w o r k f i r s t l y , t h i sf r a m e w o r kc o n s t r u c t st h ed a t af l o wg r a p hi n t h ec l a s s ,a n dc o m p u t eo u tt h ed e f - u s ei n f o r m a t i o nf o re a c hv a r i a b l e t h e n ,b ym a t c h i n gt h e p r e c o n d i t i o na n dp o s tc o n d i t i o n ( i ti sn e c e s s a r yf o rt h ei n v o c a t i o no f t h ef u n c t i o n ) o fe a c h i i 华中科技大学硕士学位论文 m e m b e rf i m c t i o n ,i ti sa b l et od e d u c tad cp a t hf o re a c hd e f - u s ep a i r , n a m e l yf u n c t i o n s e q u e n c e t h o s ek i n d so ft e s t c a s e sc a nd i s c l o s et h ed e f a u l t sb i n d i n gi nt h ei n t e r a c t i o n b e t w e e nt h em e m b e rf u n c t i o n sa n di n s t a n c ev a r i a b l e s ,a n da l s or e d u c et h ec o m p l e x i t yo f t h es e l e c t i o no ft h et e s tc a s ei nt h ed a t af l o w t e s t i n g k e yw o r d s :c l a s s ;s o f t w a r et e s t i n g ;d a t af l o w ;s p e c i f i c a t i o n ;f i n i t e s t a t em a c h i n e ( f s m ) ;o b j e c t o r i e n t e ds y s t e m 1 l i 华中科技大学硕士学位论文 1 1 问题的提出 1 绪论 随着计算机科学与技术的飞速发展,其应用领域不断扩大,对各种软件的需求量 也急剧增加。软件在系统中扮演的角色愈来愈重要,软件规模和复杂性日益增加,软 件的质量管理和质量保证已引起了相应的高度重视。 软件工程的基本原则是“应按照某种生存周期模型组织软件开发项目”e l l 。软件 生存周期通常包括需求阶段、设计阶段、实现阶段、测试阶段、安装和验收阶段、运 行和维护阶段。软件测试是软件生存周期的一项重要活动,是保证软件质量的关键活 动,直接影响软件的质量。软件测试的种类和方法很多,一个软件所需进行的测试要 限据软件规模、类型、环境以及重要程度或按合同要求进行选择。 面向对象方法学的软件设计和开发思想被引入到软件工程中,极大地提高了软件 系统的质量和维护性,以致一些热i i , 的,但被误导的早期面向对象程序设计( o o p ) 的 倡导者,错误地相信:o o p 的采用将会大大减少错误的发生率,软件测试将不再需要。 实践证明这种想法是不对的。正如g e o f f i r e yj a m e r s 所说,任何程序,无论多小,都 有错误。没有错误的程序是荒唐可笑的。是不可能存在【2 】。 面向对象技术诞生以来,由于它的重用性和易维护性以及各种相应的面向对象开 发方法( 如:0 0 a o o d ,o o s e ,o m t 等) ,极大地提高了软件质量。采用面向对象 技术开发的软件系统和产品也日益增多。但是面向对象技术自身固有的特性同时也给 面向对象软件带来了新的故障风险,如非预期的绑定或对正确用法的曲解、类函数接 - i 错误和状态控制错误等【2 l 。正是这些风险故障,使面向对象测试技术的研究非常必 要。 类是面向对象系统的基本单元,因而类测试是面向对象系统测试的重点之一。相 对整个系统而言,类测试相当于传统的单元测试。类的数据流过程就是成员函数作用 于二实例变量的过程,其结果就表现为对象状态的变迁。当成员函数和实例变量之间交 作用时,往往容易产生的错误,从而导致对象状态变迁的错误。因此,在类范围内 进行数据流测试是非常必要的,这可以发现类的成员函数和实例变量之间交互作用中 ;。生的错误。类的测试可以分别从类规范和类的源代码着手,这样就可以分别发现类 的设计和实现中的这种错误。 华中科技大学硕士学位论文 1 2 国内外研究现状 1 2 1 软件测试研究的内容 软件测试经历了几十年的发展和积累,形成了许多各具特色的研究内容。 测试的基本理论:在7 0 年代中期,软件测试技术的研究达到高潮。j b g o o d e n o u g h 和s l g e r h a r t l 3 】首先提出了软件测试的理论,从而把软件测试这一实践性很强的学科 提高到理论的高度【4 】。 测试方法的研究:测试方法的研究是测试领域开展的最早,也是最基本的一个研 究方向,具体包括测试用例的生成,测试路径的选取等。人们已经提出了许多有效的 测试方法。这也是本文的主要研究内容之一。 测试的有效性分析:随着各种不同的测试方法的不断出现,客观地评价不同测试 方法的优劣成为测试研究的内容。 测试的规范语言( 包括测试预言 r e s to r a c l e ) :规范语言以及规范语言在测试中的 应用研究是一个较新的研究方向,测试的自动化以及测试方法的进一步发展都要求有 规范语言的支持,测试的规范语言也因此而成为一个活跃的研究分支。 测试过程的自动化【5j ( 包括结果行为的验证) :对软件的测试是开销很大的活动, 怎样利用测试软件自动地生成测试用例,对程序进行测试,对测试信息进行维护等问 题,都是测试自动化的研究范围。本文也将实现测试用例生成和测试驱动的自动化。 为了检验开发的软件能否符合规格说明书的要求,测试活动可以采取各种不同的 策略。这些策略的区别在于他们表明了不同的出发点、不同的思路以及采取不同的手 段和方法。 软件测试是通过对从程序潜在无穷多的执行域中选出一些有代表性的样本进行观 察,来检验程序的。就测试用样本的选取上,可以将测试方法划分成为功能性测试方 法和结构性测试方法两大类。基于程序规范选择测试数据称为功能性测试:基于程序 代码选择测试数据称为结构性测试。结构性测试以充分地覆盖软件的结构为目的,以 软件结构中的某类成分得到充分测试为标准来判定测试的充分性。 1 2 2 面向对象系统测试技术的研究 软件开发的面向对象( 0 0 ) 技术酋先于6 0 年代后期提出,b o 年代开始被人们重 视,如今面向对象的软件工程正逐步替代传统的软件开发方法,变成了许多软件产品 华中科技大学硕士学位论文 生产者、计算机工程专业人员的首迭开发模式。在软件测试领域,人们的研究对象也 开始转向对o o p 的测试。人们在研究过程式程序设计语言程序的测试技术中取得了 不斐的成绩,这些技术仍适用于测试面向对象实现。然而,对面向对象来说,各种测 试技术的重要性和有效形式不同的。例如,人们可能没有理由将数据流测试和有限状 态机测试,同时用于用过程时序设计语言写的应用;而对一个利用了o o p 必须提供 的东西的应用,则同时使用这些技术是不可避免的。 从面向对象系统的体系结构来看,面向对象的软件测试可以分为四级:成员函数 测试、类测试、类簇测试和系统测试。类是面向对象系统的基本组成单元,因而类测 试技术是面向对象系统测试的关键之一。而如何产生有效的测试用例则一真是面向对 象系统的测试技术研究的难点之一。测试用例生成策略的研究主要集中在两方面:基 于规范( s p e c i f i c a t i o n ) 的测试( 功能测试) 和基于代码的测试( 结构测试) 。 1 ) 基于代码的测试技术 基于代码的测试是一种结构测试,郎白盒测试| 6 ,”。测试用例都是来源于具体的代 码实现。基于代码的测试比较多用于单元测试或者类内部测试,因为这可以确保代码 内的语句执行比较容易实现。基于代码测试的方法策略主要包括语句覆盖,分支覆盖, 扩展分支覆盖,特殊值覆盖,域测试,符号执行,以及比较效果比较明显的数据流测 试技术1 8 。1 ”,即利用程序中的数据流信息来选择测试实例。 7 0 年代中期已经对数据流测试策略有了研究。一些论文建立了基本方法【1 4 , 1 5 。 p a r r i s h 和z w e b e n 提供了一个关于数据流测试的简明的总结性研究论文l l6 】。数据流测 试也应用到了面向对象的测试中,b i n d e r 提出了类流图测试模型口) ,h a r r o l d 和c h a n g 也分别在类的范围中实现了数据流的测试 1 7 , 1 8 】。几种数据流测试工具也出现了【t 9 - 2 2 1 , 并且其中有些工具还可用于研究数据流测试在揭示程序错误时的效率【2 m 5 1 。 基于代码的测试技术不足的就是没有考虑系统要求的规范,但是这种技术是非常 何效的,因为它考虑的是软件如何编写的,而不是我们怎么想的。 2 、基于规范的测试技术 这种测试技术是一种黑盒测试,即功能测试,因为软件被认为是基于规范的一个 黑盒子,它一边输入数值,一边输出结果。基于规范的测试一般多用于集成测试和系 统测试,以确保软件能够获得设计中要取得的效果。类测试中,类相当于一个小系统, 类的测试也就是类成员函数的集成测试,因而基于规范的测试技术同样也适合类单元 测试。 觇范测试依据所采用的方法不同可以分为基于模型的规范( m o d e l b a s e d ) ,代数 观范( a l g e b r a i cs p e c i f i c a t i o n ) 和有限状态自动机( f i n i t e s t a t em a c h i n e s ,f s m ) 。在面 华中科技大学硕士学位论文 向对象测试文献中,类就是测试的基本单元。代数规范就是由用于定义语法属性的信 号和定义成员函数属性的公理组成。在代数规范的测试中,测试用例( 函数序列) 是 依据规范中的公理系统而产生的【2 3 , 2 6 , 2 7 。基于模型的规范则是利用定义好的数学模型, 如集合和队列,来描述每个成员函数的前置条件和后置条件,并依据函数的这些条件 产生测试用例,以便能够测试成员函数对成员变量的定义和使用活动是否正确1 2 。”l 。 总的来说,基于f s m 的软件测试技术大量存在于软件测试的相关文献中p ”。自 从c h o w 3 2 1 提出基于f s m 的测试技术以来,这种软件测试技术得到了较为广泛的研 究,特别是在协议一致性的测试中【3 ”。但是,基于f s m 的类测试技术还是研究的比 较少,仍然有很大的研究空间。t u r n e r 和r o b s o n 3 a l 提出了一个通用的基于f s m 的测 试过程,他们是从类的设计中决定各成员函数的输入和输出状态。但是该技术没有考 虑从f s m 中自动生成测试用例。k u n g 等口卅提出了基于对象状态模型( o b j e c ts t a t e m o d e l ,o s d ,类似于状态图f 3 卅) 的测试技术。他们从源代码中倒出o s d ,并构造o s d 的生成树,从而产生测试用例。可以看出上面的技术主要还是考虑了f s m 的控制流。 杠文第三章将从数据流的角度来讨论基于f s m 的软件测试技术。 1 3 课题来源、目的及意义 随着面向对象软件开发方法的盛行,面向对象系统的测试技术的研究也日趋热烈。 尽管软件测试技术于7 0 年代就在理论和实践中达到了热潮,但是由于面向对象系统 的新的特点,也给传统的软件测试技术提出了新的挑战。类是面向对象系统引人的区 别于以往面向过程的系统的主要特点之一,因而类测试技术的研究一直是软件测试研 究的热点之一。 我们在国家高性能计算环境建设基金的资助下,研究了面向对象系统的软件测试 技术。开发研制工作分为三个阶段:第一阶段开发出面向对象系统中类的自动化或手 :测试系统,分别研制相应的基于规范和基于代码的测试技术( 本文所研究的内容) : 第二阶段开发出面向对象系统的集成测试策略和辅助测试工具来:第三阶段开发研制 分布式对象系统( 网格系统) 的软件测试技术和工具。 软件测试是贯穿于整个软件生存周期的活动,由于软件规模不断地扩大,系统设 讨日益复杂,软件测试有着愈来愈重要的意义。本文研究的内容是面向对象系统中的 基本组成元素类的测试技术。它是目前面向对象系统测试研究的关键和难点之, 也是我们进行第二、三阶段研究的基础。 4 华中科技大学硕士学位论文 1 4 论文的内容及组织 面向对象系统的基本单元就是类。本课题研究面向对象系统的类测试技术,重点 研究类的数据流的测试用例生成方法。研究内容可以归纳为以下两方面: 1 ) 基于规范的类数据流测试技术的研究 基于规范的测试主要是测试系统的设计规范是否存在错误。如果对象有显著的基 于事件驱动的行为,那么有限状态机将是类的动态行为最好建模工具。通过驱动一系 列成员函数,并验证最后的状态从而能检验类的行为。所以,基于状态机的测试就非 常适合于面向对象系统。 有限状态机主要是检查状态变迁和行为,而不是内部逻辑。这样可能就会漏掉数 据的错误,特别是那些不参与定义对象状态的实例变量。数据流测试可以很好地弥补 这个不足。但是,要选择满足某种数据流测试准则的测试用例,是非常复杂的,而且 还可能产生不可测试的测试用例。 本文中提出来的策略就是将数据流测试应用于基于状态机的测试技术中,即我们 可以利用状态机来产生可测试的方法序列,然后应用数据流测试准则来衡量这些测试 用例的数据覆盖率。这样,既可以避免纯数据流测试在测试用例生成方面的盲目性, 5 己可以避免纯状态机测试遗漏某些系统中的数据错误。 2 ) 基于代码的类数据流测试技术的研究 基于规范的测试技术需要有齐全的设计开发文档,而且不能提供获得代码覆盖 的测试。基于代码的测试技术可以弥补基于规范测试的这些不足。 在众多基于代码的测试策略中,数据流测试技术非常适合面向对象系统中类的测 试。类是由实例变量和作用于实例变量的成员函数构成。也就是说对象是在成员函数 和数据成员之间的交互作用之间实现状态变迁的。这就意味着成员函数可以改变数据 成员的值,而数据成员的当前值也可以影响成员函数的行为。 基于数据流的测试技术通过跟踪实例变量的定义和使用活动,来检查实例变量和 j 茂员函数之间交互作用时出现的错误。本文在传统的数据流测试技术上,利用面向对 象系统的特点,提出了基于类数据流测试框架,通过类范围的数据流分析、成员函数 闪的符号执行和自动演绎三个步骤,产生测试用例。该测试框架依据类实例变量的定 义使用对来产生测试用例。产生的测试用例能够发现传统方法难于发现的对象的成 员函数和实例变量之间的交互性怍用的错误,并能够减少测试用例,提高了测试效率。 本文共分六章。 第一章为概述,介绍了课题的来源、目的、意义及国内外研究概况。 华中科技大学硕士学位论文 第二章介绍面向对象系统测试与数据流测试的研究背景和所涉及的一些相关概 念。 第三章讨论了基于规范的类的数据流测试技术,并提出了相应测试用例产生策略。 第四章讨论了基于代码的类的数据流测试技术,提出了基于数据流的测试框架。 第五章介绍基于类数据流的软件测试系统的总体设计和实现,并介绍了测试驱动 器自动生成的原理以及测试驱动实现。 第六章是本课题的总结和展望。 6 华中科技大学硕士学位论文 2 研究背景及相关概念 2 1 面向对象系统及其测试 由于面向对象( o b j e c t o r i e n t e d ,0 0 ) 的软件开发技术的固有的优越性,目前很 多软件系统都是采用面向对象编程技术实现。但是这种新技术的特点也给软件测试和 维护工作带来了新的挑战。 2 1 1 面向对象的相关概念 对象是0 0 系统运转的基本单元,在0 0 方法中,真实世界都可以视为对象,因 而现实中的很多应用系统都可以用面向对象的思维来设计开发成面向对象系统。对象 的概念主要包括如下方面; 对象就是客观世界中的事物或者实体在具体应用中的模型。例如,现实世界 的一本书或者一个雇员都可以用对象来建模。 对象拥有一组自己的属性,可以用于标识该对象在系统中所处的状态。例如, 图书馆的书的使用状况的属性就可以有“a v a i l a b l e ”,“c h e c k o u t ”, “o n r e s e r v e ”, “m i s s i n g ”, “r e m o v e d ”等值。这些值都可以确定一本书任何时刻 的状态。在c + + 中,属性被称为实例变量。 对象也拥有一组操作,可以用于改变自己的属性值,而这或许也会导致其他 对象的属性值的改变。例如,在一个零售公司填写一张订单可能导致如下变 化:这张订单的状态从 n e wo r d e r ”改变成为“f i l l e do r d e r ;客户的收支 平衡状态发生变化;公司的存货状态被更新。在c + + 中,对象的操作被称 为成员函数。 每个对象都有唯一标识可以将自己和其他相似的对象区别开来。这样,即使 两个对象有相同的属性值,都可以被通过标识号识别他们。 类是一组具有相同或相似特征和行为的对象的集合。类是用来描述所属集合中所 茸对象的属性和方法,即对象的内部结构。对象是根据类创建的,类是创建对象的静 态模扳。类中描述了对象的内部数据结构、内部算法和外部接口。 封装就是在对象中对其属性和操作建模并储存。在传统的软件开发机制中,是将 数据和操作分开来建模的。例如,在结构化分析中,处理对象是借助数据流图来建模, 华中科技大学硕士学位论文 并在函数或过程中实现。而对象属性则用数据字典来描述,用数据结构来实现。 封装和信息隐藏的概念密切相关。信息隐藏机制建议软件模块的设计者应该试着 隐藏或者局部化数据结构和具体的实现细节之间的内部联系。封装为信息隐藏提供了 有效的方式,因为对象的数据可以声明为私有( p r i v a t e ) ,只有该对象的操作才可以访 问这些实例变量。 类是对象的静态表示。如果一个类的所有对象也是另外一个类的对象,那么前者 就是后者的一个子类,后者就是前者的超类( s u p e rc l a s s ) 。在c + + 中,超类对应于基 类,而子类就是派生类。这就涉及到面向对象的另外一个重要特性一继承。 继承意味着一个类的所有属性和操作都自动被其子类所获得。继承最吸引人的好 处是软件的复用,这一点已经被广大软件工程师广泛利用。因为超类的所有属性都自 动被子类继承,所以超类中的所有操作实现都可以被子类所复用。例如,一个d o c u m e n t 对象的p r i n t 操作就可被复用于一个技术报告对象的p r i n t 需要,如果其需要相同的 p r i n t 动作。o o p 也允许为不同类型的d o c u m e n t s 提供不同的p r i n t 方法。根据不同类 型的d o c u m e n t 对象,系统运行时会激活适当的p r i n t 方法。这就是面向对象的多态或 动态绑定技术,后面我们将会给予简单介绍。 一个类可能有多个超类,这就是多继承。例如,一个研究生助教就是学生和教职 工的子类。继承于超类的方法要重新测试,因为超类中的测试用例可能不会在子类中 起效。 多态就是一个引用可以与多个对象绑定的能力,通俗说就是可以采用多种形式的 能力,即一个属性可以具有一组或多组属性值,一个操作可以被多于一个的方法实现。 我们可以从图形学中找到一个熟悉的例子,即一个d r a w i n g 操作可以用多个d r a w i n g 方法实现,具体调用哪个d r a w i n g 方法( 如d r a wa r c ,d r a wr e c t a n g l e ) 是在程序运行 中决定的,这也就是所谓的动态绑定技术。动态绑定是多态实现的有效机制。如前所 述,一个对象的操作可能有多个实现方法,当一个方法被激活时,具体调用哪个方法 则要根据参数的类型和数目,或者函数指针所指向的函数。 2 1 2 面向对象系的统测试和维护中的问题 面向对象技术给软件的测试和维护提出了新的挑战,主要体现在理解性问题: 复杂的内部依赖问题:对象状态行为的测试问题;测试支持工具。下面将详细 给予介绍和分析。 1 ) 理解性问题 理解性问题是由类的封装和信息隐藏特性引入。这些特性导致一种离散的规划, 华中科技大学硕士学位论文 即为了取得一个预期的功能,系统可能要激活多个对象的成员函数。通常,一个类的 成员函数接着又可能激活自身的其他成员函数,这就导致了所谓的成员函数激活链问 题1 1 8 1 。 为了说明这个问题,以图2 1 为例,左边是函数激活树,函数自左到右地被激活,如 l o a n c h e c k激活 ,该函数接着依次激活_out0l o a n e h e c k _ p a 仃o n 0 p a t r o n g e t _ c a t e g o r i o 和p a t r o n c o p i e s。这样,先序遍历函数激活树,得到图21的右边_checkout() 的函数激活序列。通常,一个面向对象系统中都存在大量的成员函数及函数激活序列。 这就表明系统测试和维护人员在测试或修改系统前,必须理解这些函数序列和类的语 义。测试前足够详细地理解系统所有部分,必然给测试或维护工作增加了极大的复杂 o ? a n ,、l o a n c h e c ko u t 0 曲”。t ”h ;:淼圣基漱( , l o a nb o o k b o o k p a t r o n c o p i e s c h k o u t 0 c h e ,c k p a t r o n ( ) g e t t y p e ( ) a v a i l b l e 0 b o o k g e t t y p e ( ) i b o o ka v a i l a b l e ( ) p a t r o np a t r o n l o a n c o p y l i s tc o p y l i s t e m p t y ( ) g e t c a t e g o r y ( )c o p i e s e h k o u t 0e m p t y ( ) ( a ) 函数激活树( b ) 函数激活序列 图2 1 多个对象成员函数激活顺序的例子 度。 2 ) 复杂的依赖关系 这个问题是面向对象系统中复杂的关系所致,如继承、聚集、联合、类簇、对象 的动态创建、多态和动态绑定等等。这些关系可能会导致个类不可避免地依赖于另 外的个或多个类。例如,继承关系表示派生类要复用基类的实例变量和成员函数, 从而派生类依赖于基类。面向对象系统中存在的这些复杂关系使系统的测试或维护变 得非常困难,主要体现在: 在面向对象系统中,如果一个类依赖于其他的多个类,那么这就给这个类的理 解带来了较大的困难; 没有对系统的足够理解,测试人员将可能对一个0 0 系统的测试无从下手; 由于测试者必须理解被测试单元所调用的函数,可能还要创建和初始化某些对 象,并编写代码去模拟被调函数的行为和效果,因而构建这样的测试桩( t e s t i n gs t u b ) 代价会很大: 不可能预见和测试一个摸舨类的所有可能使用情况,同时要识别和测试多态和 动态绑定也是非常困难的: 华中科技大学硕士学位论文 3 ) 状态行为的测试 对象有自己的状态和依赖于状态的行为。这就是说,作用于一个对象的操作的效 果要取决于对象的当前状态,而这个操作又可能会改变对象的状态。这样,就必须测 试这些操作的组合效应 3 7 - 4 2 1 。对象的状态行为的测试有两种主要形式。即基于规范的 和基于代码的。这两种形式测试的重点不同,但是相互补充的,本文将在第三章和第 四章分别就这两种测试方式进行讨论,并针对目前的测试技术中存在的不足提出改进 的测试策略。 4 ) 支持工具的问题 支持o o 软件测试的c a s e 工具仍然处于未成熟阶段。很多商业工具仍然只能实 现传统的测试技术。软件测试是一种繁重的过程,它需要准备、执行和分析成千上万 个测试用例和数据集合。基于规范的测试需要依赖于严格的软件规范。这就要求软件 观范必须用形式化的语言来描述,从而测试工具可以从中获得测试用例。测试人员能 不能获得测试数据是由形式化语言描述的规范的详细程度决定。由于多方面的原因, 实践中很少用到形式化的方法,测试人员必须人工地准备测试用例和数据。所以,广 泛的工具支持对于软件测试是非常重要的,o o 测试也不例外。 2 1 3 类层次的展平 基类通过了测试或广泛的使用被证实是可靠的,并不能保证继承类具有同样的可 靠性。因而需要利用类的展平技术来解决继承类的测试问题。在o o 系统的继承树中, 一+ 个限部基类的状态模型没有继承性,所以它不需要考虑根部基类的状态模型的继承 性特征。但是继承类的行为是由继承性及局部性的特征决定的。如果在两个或多个级 别上存在顺序约束,低一级的行为( 即状态机) 就是这些级别的合成。没有继承行为 的表示,测试模型将是不完善的。为了获得继承类的这种能够表示继承性的模型,类 层次需要被展平。 本文中所讨论的测试策略可以运用于任何类,但是如果被测试类( c l a s su n d e r t e s t e r , c u t ) 是一个继承类,那么这个类就要依据类展平的原则进行展开处理,得到 一个展平类,再进行测试包的开发。个继承类展平后就具有明确的继承的特性。展 平的思想可以用图2 2 中来说明,图中表示类b 继承了类a 的一些成员函数。 类a 的范围包括a 1 、a 2 和a 3 。a 2 是一个抽象的成员函数,a 3 是一个私有的 成员函数并且不能被继承。展平的范围和类的范围是相同的。 类b 是a 的继承类。它通过扩展继承a l ,用b 2 实现a 2 的接口。b 4 和b 5 是 局部定义的特例化。b 6 是私有的。类的范围是b 2 、b 4 、b 5 和b 6 ,其展平范围是 华中科技大学硕士学位论文 a l 、b 2 、b 4 、b 5 和b 6 。 a 1a 2a 3 _缓闲 类a 縻_ - 斟 i 函数实现圈私有函数 口函数扩展 囫函数接口定义 类b 囵重载函数实现 图2 2 展平类示意图 2 2 基于状态机的软件测试 传统的结构化分析设计方法注重的是功能实现和信息传递,而面向对象技术则更 加注重对象的行为一类接受或产生消息的序列。有限状态机可以充分表现类的“状 态”,易于为类“行为”建模。同时,针对面向对象技术中状态控制分布在整个系统 的情况,基于状态的测试为发现错误提供了直接手段。因此,基于状态机的测试在面 向对象软件测试中用广泛的应用【2 l 。 状态机是一个系统,它的输出是由当前的输入和过去的输入决定的,它是有限自 动机这一数学模型的工程应用。一个状态机是事件( 输入) 、状态和动作( 输出) 组 成的抽象。当相同的输入不会总是被接受和当被接受后,可能产生不同的输出时,就 晚这个系统展现了基于状态的行为。状态机又被叫做顺序系统,也就是说它具有顺序 于为。一个状态机有4 个构成元素【2 1 : 状态概括了与过去输入有关的信息的抽象,它在决定系统收到后续输入的行为时 是必须的。 转换就是一个允许的两个状态的序列。一个转换是由一个事件引发。转换的结果 ;可能是个输出动作,一个转换必须有一个接受状态和一个结果状态。 事件指的是一个输入或者个时间间隔。 动作表示结果或跟随一个时间的输出。 一个转换使系统从一个状态到达另一个状态。初态是指在该状态下,第一个事件 破接受a 模型指明了一个初态,它不需要任何一个转换到达。一个转换有两个状态: 接受状态和结果状态,它们可能为同一状态。状态机在一个时间只能处于一个状态。 、j 前状态是指活动状态。从当前状态到结果状态就产生一个转换。终止状态是指机器 停止接受事件的状态。一个状态机可能产生的每一个唯一输x 输出对都有一个以前的 器 华中科技大学硕士学位论文 唯一顺序。 一个状态机的运行机制可以描述如下: s 1 :机器开始于初态: s 2 :机器在一个不确定的时间间隔等待个事件; s 3 :对该机器,一个事件给出它本身; s 4 :如果一个事件在当前状态没有被接受,则被忽略; s 5 :如果事件在当前状态被接受,则说指定的转换被触发:产生相关的输出动 作,并且指定的结果状态变成当前状态。当前状态和结果状态相同; s 6 :从第s 2 步开始重复这个周期,直到结果状态变成终止状态。 2 3 数据流图模型 2 3 1 有向图 一个有向图g 是一个二元组g ,e g ) ,其中,v g 为有穷集合,e g 是v g v g 即 ( v , v ) iv ev g 的子集。集合v g 中的元素称为节点,集合e g 中的元素称为边,其中对于 任意一条边e ee o 有e = ( t a i l ( e ) ,h e a d ( e ) ) 。集合v g 和集合e o 分别称为有向图g 的 节点集和边集。即e 是相邻节点组成的有序对,而这两个节点分别称为边e 的首( h e a d ) 和尾( t a i l ) 。若( n ,m ) a e g ,则1 1 是m 的先前驱,m 是1 3 的后继。g 中一条r l 到m 的 路径p 。是节点v 0 = n ,v l ,v k = 1 1 - 1 ,( v i ,v i - 1 ) e g 的有穷序列。对于两个节点x 和y , 如果存在条路径p s 棚x 芒p + p ,y c p 。- p ,则称节点x 可达节点y 。一条路径称为 简单路径,如果所有节点,除了首尾节点可能是相同的之外,都互不相同。一条路径 称为无循环的路径,如果所有的节点都是互不相同的。对于一条含有循环的路径p , 若节点v 在路径p 上出现了不止一次,则称路径p 是节点v 的循环路径。 2 3 2 程序的流图模型 流图被用于刻画程序的结构已有很长的历史,根据所描述的程序结构信息的不同, 流图又被分为控制流图和数据流图。控制流图是程序结构建模中经常采用的形式,它 直观地描述了程序中各语句依次执行的关系。 定义2 1 一个流图是一个有向图g = ,它由有限多个节点的集合n g = n l 和 节点问的有向边的有限集合e g 鱼q g x n g 构成。它还必须满足如下条件: 1 ) 流图中有且只有一个入口节点称为s t a r t ,节点s t a r t 的入度必须为0 : 华中科技大学硕士学位论文 2 ) 流图中有且只有一个出口节点称为s t o p ,节点s t o p 的出度必须为0 ; 3 ) g 中的每个顶点至多有两个后继,并令有属性“t ”( 真) 和“f ”( 假) 同该 节点的每一个发出边相关联; 4 ) 流图中任意一个节点都在从流图的入口节点到出口节点的一条路径 p s t a r t s t o p 上。 控制流图中的个节点n 表示程序中的一列顺序计算,它可抽象她看作是改变程 序状态的函数。这里程序状态是程序中所有变量的值所构成的向量( a i ,a 2 ,a 。) 。 有向边表示计算的控制转移。每一条边上都附有个谓词p 。令e 是从节点n l 到节点 n 2 的一条边,若节点r l l 上的计算结束时,谓词p 。为真,则计算控制可以从n l 转移到 n 2o 在用流图作为程序结构的模型时,程序的运行过程可以用流图中的路径来刻画。 这里,条路径是流图中的一系列节点的序列( n l ,n 2 ,r l k ) ,k 2 ,其中对任意 ;= l ,2 ,k 。1 ,( n i , n i 十1 ) 都是该流图中的条有向边。节点n - 称为该路径的起始节点, 节点n 。称为该路径的结束节点。k 一1 称为该路径的长度。 如果一条路径的起始节点就是该流图的入口节点,且路径的结

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论