(计算机软件与理论专业论文)基于函数调用图的面向对象软件的修改影响分析研究.pdf_第1页
(计算机软件与理论专业论文)基于函数调用图的面向对象软件的修改影响分析研究.pdf_第2页
(计算机软件与理论专业论文)基于函数调用图的面向对象软件的修改影响分析研究.pdf_第3页
(计算机软件与理论专业论文)基于函数调用图的面向对象软件的修改影响分析研究.pdf_第4页
(计算机软件与理论专业论文)基于函数调用图的面向对象软件的修改影响分析研究.pdf_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

两南人学硕 :学f t 论史摘要 基于函数调用图的面向对象软件的 修改影响分析研究 计算机软件与理论硕士研究生彭中莲 指导教师丁晓明副教授 摘要 软件测试是保证软件质量、提高软件可靠性的关键手段,是实施软件项目不可缺少的环 节,其目的是以最少的时间和人力找出软件中潜伏的各种错误和缺陷。回归测试是软件测试 的重要组成部分,是对软件进行修改之后进行的测试,其目的是检验软件修改是否正确以及 修改是否引入新的错误。同归测试的研究对提高同归测试效率,降低测试成本有重要意义。 在回归测试中,不管在成本还是在时间上“重测所有”都是不可行的,尤其是在修改很 小部分时“重测所有”就造成成本浪费,但修改可能会影响到其他的部分,因此,软件开发 人员需要一种机制来理解一个修改是怎样影响系统其它部分,我们把这种机制称为修改影响 分析。修改影响分析使得软件开发人员知道一个特定的修改会多人范围影响系统,从而让他 们知道只需要重测那些修改的和修改所影响的部件,以达到减少测试成本。因此,增强修改 影响分析功能对减少回归测试成本非常重要。 本文针对面向对象方法的特性,采用类成员分析方法找出类成员之间的关系。首先定义 类成员函数之间的调用关系,构造基于类层次分析的函数调用图,然后约减该函数调用图, 最后提出各种修改类型算法找出程序修改所影响的类成员。这样在程序同归测试中,只需重 新测试受影响的成员,以达到减少测试成本。通过与w h i t e 和r o t h e r m e l 等算法比较,它比 在类之间作修改影响分析要精确,比在语句级分析中构造依赖模型要简单。 本文提出基于调用图的面向对象软件的修改影响分析算法,设计了一个j a v a 源程序分 析框架,实现了修改影响分析原型系统。 关键词:面向对象回归测试修改影响分析函数调用图 两南人学硕f 学位论文 a b s t r a c t ! i i 一i l 量曼曼量曼曼曼曼曼皇! 曼曼曼量曼曼曼曼皇詈曼曼曼曼曼曼舅量曼曼曼曼曼置曼曼! 量曼曼曼曼 r e s e a r c hi n t oc h a n g e i m p a c ta n a l y s i si n o b j e c t o r i e n t e ds o f t w a r eb a s e d o nc a l lg r a p h m a j o r :c o m p u t e rs o f t w a r ea n dt h e o r y r e s e a r c hd i r e c t i o n :s o f t w a r et e s t i n gt e c h n o l o g i e sa n d t h e o r y sup e r v i s o r :a s s o c i a t ep r o f e s s o rd i n gx i a o m i n g a u t h o r :p e n gz h o n g l i a n a b s t r a c t s o f t w a r et e s t i n gi sac r u c i a lm e a n st oe l l s u t es o f t - w a r eq u a l i t ya n di m p r o v et h er e l i a b i l i t yo f s o f t w a r ep r o d u c t s a n di ti si n d i s p e n s a b l ei nas o f t w a r ep r o j e c t t h eg o a lo fs o f t w a r et e s t i n gi st o f r e do u te r r o r sa n db u g sw i t hl e a s tt i m ea n dm a n p o w e r r e g r e s s i o nt e s ti sa ni m p o r t a n tp a r to f s o f t w a r et e s t i n g i tr e t e s t st h em o d i f i e dp r o g r a mt od e t e r m i n ew h e t h e rc h a n g e sh a v eb e e nm a d e c o r r e c t l ya n dt oi n v e s t i g a t ew h e t h e rt h o s ec h a n g e sw i l lc a u s ea n ya d v e r s ee f f e c to nt h ep r o g r a m b e h a v i o r i ti sv i t a lf o rt h er e s e a r c ho fr e g r e s s i o nt e s tt oi m p r o v et h ee f f i c i e n c yo fr e g r e s s i o nt e s t a n dt or e d u c et h et e s tc o s t d u r i n gr e g r e s s i o nt e s t ,“r e t e s t a l l ”i si m p o s s i b l ei ne i t h e rc o s to rt i m e e s p e c i a l l yw h e na s o f t w a r es y s t e mh a sb e e nc h a n g e dal i t t l e ,“r e t e s t a l l ”w i l lw a s t ec o s t b u tm o d i f i e dp a r t sm a y a f f e c tt h eo t h e rp a r t s s os o f t w a r ed e v e l o p e r sn e e dam e c h a n i s mw h i c hi sc a l l e dc h a n g ei m p a c t a n a l y s i st ou n d e r s t a n dh o wac h a n g ei m p a c t st h er e s to f t h es y s t e m i ta l l o w sas o f t w a r ed e v e l o p e r t ok n o ww h i c ho ft h ea r e a si nt h es o f t w a r es y s t e ma r ep o s s i b l ya f f e c t e db yt h ec h a n g ea n dr e t e s t o n l yt h o s ec l a s s e sa f f e c t e di n s t e a do ft h ew h o l es y s t e mt or e d u c et e s tc o s t i ti si m p o r t a n tf o r r e d u c i n gr e g r e s s i o nt e s tc o s tt oi m p r o v ec h a n g ei m p a c ta n a l y s i s a c c o r d i n gt ot h ef e a t u r e so ft h eo b j e c t o r i e n t e dt e c h n o l o g y , w eu s ec l a s sm e m b e ra n a l y s i s m e t h o dt o g e tt h er e l a t i o no fc l a s sm e m b e r s w ed e f i n et h ec a l lr e l a t i o no fc l a s sm e m b e r s , c o n s t r u c tac a l lg r a p hb a s e do nc l a s sh i e r a r c h ya n a l y s i s ,r e d u c et h ec a l lg r a p ha n dp u tf o r w a r d a l g o r i t h m so fc h a n g et y p e st oc l a s sm e m b e r sa f f e c t e db yt h em o d i f i e dp r o g r a m c o m p a r e dw i t h w h i t ea n dr o t h e r m e l sa l g o r i t h m , t h ea l g o r i t h mi nt h ep a p e ri sm u c hp r e c i s e rt h a nc l a s sd i a g r a m , m u c he a s i e rt h a ns t a t e m e n t d e p e n d e n c em o d e l t h ep a p e ri sp u tf o r w a r da na l g o r i t h mo fc h a n g ei m p a c ta n a l y s i sb a s e do i lc a l lg r a p ho f 1 t 两南人学硕l 学位论文 a b s t r a c t o b j e c t - o r i e n t e ds o f t w a r e ,d e s i g n e d a l la n a l y s i sa r c h i t e c t u r ef o rj a v ap r o g r a ml a n g u a g ea n d i m p l e m e n t e dap r o t o t y p es y s t e m k e y w o r d s :o b j e c t o r i e n t e d ,r e g r e s s i o nt e s t ,c h a n g ei m p a c ta n a l y s i s ,c a l lg r a p h 独创性声明 本人提交的学位论文是在导师指导下进行的研究工作及取得的 研究成果。论文中引用他人已经发表或出版过的研究成果,文中已加 了特别标注。对本研究及学位论文撰写曾做出贡献的老师、朋友、同 仁在文中作了明确说明并表示衷心感谢。 学位论文作者:盔中蒸签字日期:2 d 眇c f 年6 月z 2 日 学位论文版权使用授权书 本学位论文作者完全了解西南大学有关保留、使用学位论文的规 定,有权保留并向国家有关部门或机构送交论文的复印件和磁盘,允 许论文被查阅和借阅。本人授权西南大学研究生部可以将学位论文的 全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫 描等复制手段保存、汇编学位论文。 ( 保密的学位论文在解密后适用本授权书,本论文:口不保密, 口保密期限至年月止) 。 学位论文作者签名:岛牢逮 导师签名:碰户砂 签字日期:如口呷年5 月2 日 签字日期:加夕年厂月砂日 两南大学硕f j 学位论文第1 帝绪论 第1 章绪论 软件测试是保障软件质量、提高软件产品可靠性、减少软件错误的重要手段,是实施 软件项目不可缺少的环节。从计算机诞生起,计算机安全问题就伴随其左右,尤其是软件方 面,层出不穷的软件故障以及由此带来的严重后果使人们意识到软件测试对软件质量具有重 要的意义。许多计算机科学家在展望二十一世纪计算机科学的发展方向和策略时,都十分注 重提高软件质量。因此,作为保证软件质量最有效手段的软件测试技术,已成为令人关注的 一个研究领域。 软件测试是软件上程的重要组成部分。软件测试的直接目的是尽可能发现并改正被测 试软件中的错误,提高软件的可靠性。它是软件生命周期中一项1 f 常重要且非常复杂的工作。 大量测试文献表明,通常花费在软件测试和排错上的代价大约占软件开发总代价的5 0 以 上【l 】。软件测试工作做得怎样,直接决定着软件产品质量的好坏。美国质量保证研究所对软 件测试的研究结果表明:越早发现软件中存在的问题,开发费用就越低:在编码后修改软件 缺陷的成本是编码前的1 0 倍;软件质量越高,软件发布后的维护费用越低。随着软件规模 的迅速扩人和广泛应用,软件的可靠性要求日益突出,软件测试在软件开发过程中的作用显 得越来越重要。统计表明,在典型的软件开发项目中,软件测试工作量往往占软件开发总工 作量的4 0 以上。而在软件开发的总成本中,用在测试上的开销要占3 0 到5 0 【2 】o 如果把 维护阶段也考虑在内,讨论整个软件生存期时,测试的成本比例还会增加,因为维护工作相 当于二次开发,乃至多次开发,其中必定还包含有许多测试工作,主要是同归测试。 1 1 研究背景 1 1 1 软件测试与回归测试 软什测试的内涵是必须包括软件开发生命周期中每一个阶段的每一个交付产品,必须考 虑每一个交付产品的每一个预期特性,包括每一个测试步骤。软件测试是根据软件开发各阶 段的规格说明和程序的内部结构而设计一批测试用例( 即输入数据及其预期的输出结果) , 并利用这些测试用例去运行程序发现错误的过程。软件测试的基本流程如图1 1 所示。 1 9 8 3 年,i e e e 提出的软件r 程标准术语中对软件测试的定义为:使用人工或自动手段 来运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实 际结果之间的差距。 软件测试过程主要包括测试用例的编写,测试环境的配置,然后执行测试用例,分析测 试结果,如果符合要求就完成软件测试,如果错误,则要进行错误修改,为了保证修改后的 软件的止确性,又要进行测试,这些测试是为了确认修改的正确性以及修改不会有负面影响, 即同归测试。同归测试的主要目的是验证系统的变更没有影响系统的功能,并保证当前功 两南大学硕l ! 学化论文第l 章绪论 li 软件配置 媾涅 修正的软件回 r 测试结果 排 归 执结 n 错裳 错 测 测试环境配置 行 果试 l 测分 测试工具试析 预测的 可 可靠性 + 靠 性 预期结果 分 析 正确 图i 1 软件测试基本流图 能的变更是正确的。回归测试可以发生在任何一个阶段,包括单元测试、集成测试和系统测 试。在软件的维护阶段,系统也会出现一些错误或添加功能,所以修改后必须进行回归测试。 回归测试和开发过程中的测试明显的不同是测试用例的来源和两者进行的频率。回归测 试的大部分测试用例是从开发过程中的测试用例库中取得,只有少部分新增加的功能的测试 用例需要重新编写;回归测试在每一次修改后都要进行,其目的是为了确保软件的正确性, 而开发过程中的测试是在软件每一阶段完成后进行的一次性测试,不需重复进行。 1 1 2 面向对象软件的回归测试 面向对象编程( o o p ) 近年来已经广为流行,已逐渐代替被广泛使用的面向过程的开 发方法,被看成是解决软件危机的新兴技术。o o p 适用范围非常广,提供了抽象方法和类 库来支持各个领域的应用程序开发。从理论上来说,面向对象编程技术应该能够保证软件有 更高的质量,但实际情况却并非如此。因为无论采用什么样的编程技术,程序的错误都是不 可避免的,而且由于面向对象编程技术的特征( 抽象) 使得程序代码重用率增高,因此更需 要严格测试,以避免错误的繁衍i 4 j 。面向对象软件具有面向过程软件所没有的特点,与传统 顺序结构式方法在开发思想上有着根本的不同,面向对象软件具有类、继承、封装等特性, 而面向过程软件则以功能模块间的控制流程为重点。这些特点决定了测试面向对象软件需要 新的策略,使得面向对象测试在测试步骤的划分以及测试策略的选择上有别与传统的测试。 由于面向对象软件的复杂性,给基于程序代码的测试带来困难,同样也使面向对象软件的回 j r l 测试的难度增加。 通常,回归测试有西种常见的策略,一种是重新测试所有部分的方法,它运行所有的测 试用例,但这种策略可能消耗大量的时间及资源;另一种是同归测试选择技术,通过选择某 2 两南大学硕l j 学f :i :论丈第l 章绪论 些现存的测试库的子集去重新测试修改的程序,以降低时间需求。而回归测试选择技术也有 两种方法:安全方法和最小化方法。安全方法是选择所有覆盖了受影响的测试用例,而最小 化方法是选择测试刚例的最小子集,使得每一个受影响的部分被覆盖至少一次。对于同j j 测 试选择技术,首先考虑的是如何高效的识别软件修改和修改所影响的部分,从而集中精力对 这些修改和修改受影响的部分进行测试,因此我们要理清程序代码中的各种关系,然后考虑 如何重用现存的测试用例和测试库。总之,同归测试可遵循以下基本过程进行: ( 1 ) 识别出软件中被修改的部分; ( 2 ) 从原测试用例库中,排除所有不再适用的测试用例,确定那些对新的软件版本依 然有效的测试用例,其结果是建立一个新的测试用例库。 ( 3 ) 依据一定的策略从新的测试用例库选择用例测试被修改的软件。 ( 4 ) 如果必要,生成新的测试用例集,用于测试原测试库无法充分测试的软件部分。 ( 5 ) 用新的测试用例集执行修改后的软件。 第( 2 ) 和第( 3 ) 步测试验证修改是否破坏了现有的功能,第( 4 ) 和第( 5 ) 步测试 验证修改工作本身。 1 1 3 修改影响分析 一个简单的修改在系统内部可能会对其它部分带来严重影响。因此,软件开发人员需要 一种机制来理解一个修改是怎样影响系统的其它部分,这个过程就兀l i 做修改影响分析。经验 表明,如果对一个软件做修改而不知道修改会产生哪些影响,这将会导致进度计划延迟、糟 糕成本估计和不可靠的软件产品。 从代码上看,对象系统中的修改主要有: ( 1 ) 不修改系统中的对象属性,只对方法进行修改,包括对方法协议和方法体的修改t ( 2 ) 修改系统中对象的属性。 通常,面向对象系统中对象的属性是不会改变的,但由于设计的原因,可能会造成对象 系统中某个甚至多个对象的方法的修改,这种修改的影响是巨大的,它意味着,该对象以及 系统中所有与该对象发生交互的对象都要进行完全新的测试,这种测试代价是很高的。 协议的修改实质是对方法的重定义,这时,同归测试应包含两方面的含义:一方面是必 须构造足够的测试用例,按其测试准则,对该方法进行充分测试;另一方面是对所有与该方 法有依赖关系的类,必须构造新的测试用例并对它们的交互进行充分测试,在方法体修改中, 如果修改语句会对某一对象状态产生影响,那么,所有与此对象存在数据依赖的对象都必须 进行回归测试。因此,程序修改后,为进行回归测试,需要找出修改及修改影响的部分,只 需对它们进行重新测试,从而达到与完全钡0 试相同的测试覆盖。 在软件测试和维护阶段有两个重要活动,第一,要理解问题或需要作修改的描述。第二, 了解被维护软件系统的内部相关性,并且掌握修改可能产生影响。修改影响分析能提高测试 两南人学硕 j 学化论文第l 章绪论 成本的精度,帮助作出更好的进度计划和减少不需要重新测试没有错误导入的组件。例如千 年虫( y 2 k ) 问题,在过去,由于内存和磁盘都是珍贵资源,一些1 只系统使用两位来表示年 份日期,随着时间推移和软件技术发展,这些系统已不能适应新世纪的需求。到了2 0 0 0 年, 软件系统使用0 0 表示2 0 0 0 年,这将使人们认为比9 9 ( 1 9 9 9 ) 要小,因此就常常产生错误 结果。些组织和机构想解决千年虫问题,但他们没有发现影响分析是解决问题的根本途径。 没有有效的分析修改日期变量产生的影响,他们花了人量时间去手t 检测源代码中的日期变 量,修改它们,并测试它们。仅仅找出使用日期变量的其他变量就是很复杂的事,何况还有 使用修改日期变量的其它软件,这些:f 作来同不停做。如果使用修改影响分析,将大大降低 成本。 1 2 修改影响分析研究现状 1 2 1 面向过程软件的修改影响分析 回归测试需要解决四个基本问题【5 】:1 怎样鉴别那些受到修改影响的部分( 修改影响分 析) ;2 采用什么策略来重测受到影响的部分;3 重测部分的覆盖标准是什么;4 怎样选择、 重用和更改存在的测试用例库( 测试用例库的维护) 。 第一个问题就是修改影响分析,它最初讨论是在1 9 8 8 年,文献 6 】介绍了一种关于模型 的修改影响分析技术,主要观点是使用数据流图米鉴别受影响的定义一使用( d e f - u s e ) 对和 子路径。和这种技术不同,有一些基于程序功能控制流图的研究,文献【7 】介绍一种控制流 图( c o n t r o lf l o wg r a p h ) 分析方法,他的观点是一个程序的c f g 是由程序中简单的或有条 件的状态作结点,构造结点之间的边描述了状态之间的控制流( 控制路经) ,使用它来鉴别 模型中的受影响的控制路径。后来,文献 8 】提出的防火墙技术( f i r e w a l lt e c h n i q u e ) 的方法, 防火墙的作用是将程序改变的所受影响的模块与其它模块分割开来。防火墙内的模块可以是 与修改的模块交互的模块,也可以是被修改模块的直接祖先子孙模块。在1 9 9 2 年,文献【9 】 又描述了一个数据相关的防火墙,它基丁数据流图( d a t af l o wg r a p h ) 把所有受修改影响的 数据相关模块包含起来。文献 1 0 使用另外一种方法:程序切片( p r o g r a ms l i c i n g ) ,程序切 片技术( p r o g r a ms l i c i n gt e c h n i q u e s ) 定义一个选择重测技术的集合,对每一个测试用例t e t ,每种选择重测技术创建一个切片。认为切片技术有四种不同的类型:执行切片、动态 切片、相关切片和近似相关切片。利用这四种切片技术任何一种,为测试用例t 创建切片s l , 如果s l 包含一个修改的状态,那么切片技术就选择测试t 作为重测测试用例。2 0 0 3 年,文 献【1 1 】提出的基丁状态模型( s t a t e m e n t b a s e dm o d e l ) 的切片技术,他的研究侧重于系统测 试,利用形式化语言基于模型测试来测试软件系统模型,使用e f s m ( e x t e n d e df i n i t es t a t e m a c h i n e ) 模型依赖性分析给定的测试组件以达剑减少回门测试用例。 正 两南人学硕i j 学位论丈第l 章绪论 1 2 2 面向对象软件的修改影响分析 随着面向对象语言迅速发展,面向对象同门测试 1 2 a 3 是最近儿年的热门研究。面向对象 的同! j _ 1 测试修改影响 1 4 , 1 5 a 6 , 1 7 大致是集中在类和对象的研究。 r o t h e r m e l 和h a r r o l d 1 8 】将修改影响分析技术运用丁面向对象的环境中,他们的算法是构 造程序或类依赖图,用程序依赖图( p r o g r a md e p e n d e n c eg r a p h ) 表示数据和控制依赖。这 里强调当一个类发生改变,通过图找出关于继承、多态、动态绑定和封装构造关系的子类及 其它类和使用该类的应用程序。 1 9 9 7 年,a b d u l l a hk 和w h i t el d g 将以前用于过程语言软件中的防火墙的概念扩展到 面向对象的软件。面向对象程序中的防火墙把修改的类或对象以及它们交互的类或对象圈剑 防火墙内。由丁类之间关系和对象之间的关系( 对象之间的关系是消息) 不同,所以构造类 防火墙【2 0 】和对象的防火墙的方法是不同。 1 9 9 8 年, j a n ey i c ,c h a eh s ,k w o ny r 和b a ed h 1 2 l 】介绍了一种在类层次上的修 改影响分析方法。他们的方法是基于类防火墙方法,但与文献 1 4 1 使用的技术不一样。该方 法使用成员函数作为测试单元,处理与各种面向对象特征相关的修改影响,象出现在数据成 员、函数成员、类和继承关系的修改类型。他们采用成员依赖图( m e m b e rd e p e n d e n c eg r a p h ) 模型描述类中成员的依赖关系,成员依赖分为数据依赖和控制依赖。先创建成员依赖图 ( m d g ) ,然后根据图分析数据成员、函数成员、类的依赖关系极其继承关系,如果对其中 之一作出修改那么修改所影响的部分就可以被分析出来。 2 0 0 1 年,b a r b a r agr y d e r 和f r a n kt i p l 2 2 1 认为修改影响分析对一系列程序修改在语义 上的影响提供反馈信息。这种分析能用来决定修改所影响的同归测试用例。而且,如果一个 测试火败,修改的子集能鉴别出错误,同时,修改子集能与没有受到影响的安全测试用例组 合在一起。 杨芙清【4 】等针对面向对象软件,通过分析对象系统的特性,定义了对象之间的依赖关系, 通过这个依赖关系,导出测试对象的方法序列,并应用程序切片技术,标识那些受到程序修 改影响的测试用例,只有这些测试崩例才需要住同归测试中重新执行。 h s i a t 2 3 】等所针对的问题如文献【4 】中所提的,但h s i a 等提出了一种完全不同的简单方法, 不象r o t h e r m e la n dh a r r o l d t l s l 所提的分析面向对象程序的源程序和修改的版本,而是插入一 些探针到源程序中,这些探针能够记录每个测试用例所涉及剑的类,利用这些信息可以建立 测试用例与类之间的对应关系,当修改和修改影响的类标识出来后就可以知道哪些测试用例 需要重新运行来测试修改的程序,对于新加的功能也需要增加新的测试用例。 总之,k u n g 2 0 1 等的方法仅使 j 了类之间的关系米鉴别改变和改变所影响的部分,因此 比较简单,但所重测的测试用例不是最小的测试子集,其中有部分测试【 j 例根本没有涉及到 改变和改变所影响的部分,很显然这部分测试用例是可以不用重新运行的。杨芙清 4 1 等的切 片和r o t h e r m e l t 2 4 1 等的方法考虑剑了语句一级,分析了所有语句与方法之间的控制依赖与数 5 两南人学硕f 学位论文菊1 章绪论 据依赖,这些细节的分析可以充分的减少回归测试中不必要的重测部分,但复杂度太高,尤 其是对丁面向对象技术的程序。h s i a 2 3 1 等的方法是简单,但也必须先知道改变和改变所影响 的类,而且也是在类一级的,重测的子集也不是最小的。 1 3 本文的研究内容 随着软件产品在现代社会中的广泛使用,软件的质量受剑更人的关注。为了确保软件的 质量,软件测试和回归测试受到了重视,尤其是在软件测试和同归测试的成本节约方面,国 内外做了很多研究。本文的重点是围绕回归测试四个基本问题中的第一个,即如何鉴别修改 影响的部分,做了以下几方面的r t 作: ( 1 ) 深入研究现有的面向对象软件的修改影响分析方法。 ( 2 ) 针对一段j a v a 源程序,本文构造了其对应的调崩图。但是,该调用图在处理虚函 数调用点的问题上效率不高,从而降低了调用图的精度,本文针对这个问题,约减了调片j 图。 ( 3 ) 针对面向对象软件的特点,本文提出了一种鉴别由于修改对面向对象软件所造成 的影响的方法。这是一种基于程序的回归测试,并且是基于类成员粒度。该算法以约减后的 调用图为基础,讨论了三种类成员函数修改的类型,并提出了其相应的修改影响分析算法。 ( 4 ) 本文中提出了一种面向对象软件的修改影响分析原型系统,并以目前较为流行的 面向对象编程语言j a v a 所编写的一般应用程序为研究对象,实现这个原型系统。首先把源 程序语言的语法规则转化为j j l h e 的输入脚本,得多j j j t 脚本文件,然后运行j j t r e e ,得剑j j 脚本文件,最后运行j a v a c c ,就得到我们所需要的词法语法分析器。只要把源程序通过这 个词法语法分析器就可以得到与源程序相应的语法树,通过遍历语法树就可以得到我们所需 要的信息。通过信息加工、调用图的构造与约减后,找出修改和受修改影响的部分。 本文的组织结构如下:第二章讨论了面向对象软件的特点及这些特点对测试和修改分 析的一些影响;第三章详细介绍基于类成员函数调用图的面向对象修改影响分析算法;第四 章设计实现了一个面向对象软件的修改影响分析原型系统,并对j a v a 源程序进行分析;最 后得出结论并展望了下一步工作。 6 两南人学硕i j 学位论艾第2 章面向对象软f 的修改影响分析 ii i i 皇曼! 皇曼曼曼皇! 喜! 皇! 曼曼曼曼曼曼曼! ! 曼! 曼曼曼曼皇曼曼曼曼曼曼! 曼曼曼曼曼曼量曼曼曼曼鼍曼曼曼皇曼! 曼! 曼曼! 曼曼曼曼! 曼曼皇曼皇! 曼曼曼曼皇 第2 章面向对象软件的修改影响分析 面向对象软件测试技术的研究是面向对象开发方法中不可缺少的一个环节,是保让软件 质量、提高软件可靠性的关键。软件测试的任何阶段均涉及剑同9 测试问题。而修改影响分 析为同归测试用例的选择提供了理论依据。在同! | 1 1 测试阶段,只重新测试修改和修改受影响 的部分,从而达到与完全测试相同的测试覆盖效果。在面向对象的语言中,由于鼓励类的继 承和使用过程,冈此面向对象程序具有模块化、层次化、利于代码重用和系统设计等优点, 则程序修改的扩散效应很明显,如果进行完全的【亓l 归测试不仅没有必要,而且从测试代价上 讲也是不现实的,所以为了减少同归测试的成本,就必须增强程序的修改影响分析。总之, 修改影响分析对面向对象程序的测试和维护具有重要意义。下面,我们首先分析面向对象程 序设计语言的特征。 2 1 面向对象软件的特点 面向对象程序设计语言提供信息封装、多态性、继承和动态绑定等基本特征。它通常由 一系列类组成,在类定义中封装了数据( 用于表示对象的状态) 及作用在数据上的操作( 方 法) ,数据和操作统称为特征。对象是某个特定类的实例。类和类之间按继承( i n h e r i t a n c e ) 关系组成一个有向无圈图结构。继承是面向对象的核心特征,提供了从现有类派生新类的能 力。父类中定义了共享的公共特征,子类( 派生类) 继承了父类( 基类) 所有的数据和行为 ( 方法) ,并且可以添加新的数据和方法或重定义方法。特别地,允许对继承的方法进行重 定义,从而可产生类似功能的不同实现。封装( e n c a p s u l a t i o n ) 可以使用已定义的接口来访 问对象属性,从而避免直接访问对象的内部代码。在面向对象程序中,计算是通过向对象发 送消息,即调用该对象所属类中所定义的方法来进行的,调用方法可以改变对象的状态并向 其它对象发送消息,动态绑定机制将对象和方法之间动态地联系起来。在强类型语言中,允 许将子类c d 的对象赋给具有父类c 类犁的对象x 。这样,向对象x 发送消息就对应于调用 c d 中定义的方法,从而产生面向对象程序设计中独特的“包含多态”。继承和动态绑定的结 合是面向对象程序设计语言与其他语言相比最为有力之处,使程序具有较大的灵活性,特别 是当用户需求变动时,设计良好的面向对象程序变动相对较小。我们现在详细讨论面向对象 编程的封装性、继承性和多态性等属性。 2 1 1 封装性 面向对象软件的一个重要特征就是封装性,即把数据和对数据操作的方法封装在一起形 成类。类的封装限制了对象属性对外的透明性和外界对它的操作权限,这在一定程度上避免 了不合理的操作并能有效地防止错误的扩散,从而改善和提高了软件的可靠性。 封装是一种信息隐蔽技术。用户只能见到对象封装界面上的信息,对象内部对用户是隐 7 两南人学硕i 学位论文 第2 章面向对象软件的修改影响分析 蔽的。其目的在于将对象的使用者与设计者分开,使用者不必了解对象行为的具体实现,只 需用设计者提供的消息来访问该对象。 封装应该具有如下几个条件: ( 1 ) 具有一个清楚的边界,对象私有数据、内部程序( 成员函数) 细节都被限定在这 个边界内。 ( 2 ) 具有一个接口,这个接口描述对象和其它对象之间的相互作用、请求和响应,即 消息。 ( 3 ) 对象内部的实现细节受封装壳保护,其它对象不能直接修改对象所拥有的数据和 代码。 另一方面,面向对象软件系统运行时由一组协调丁作的对象组成,对象具有一定的状态, 测试应涉及对象的初态、输入、输出、对象的终态,信息隐蔽机制给对象状态的观察、测试 用例的生成、测试点的选取等带来了障碍,测试者往往要添加一些表明对象内部状态的函数。 因此,信息隐蔽和封装加大了测试的难度。 2 1 2 继承性 在面向对象的程序中,继承性是一种概括对象共性和组织结构的机制,使得面向对象设 计更具自然性和直观性,是一种有效的重朋手段。由于继承的作用,个函数可能被封装在 多个类中,子类不但继承了父类中的特征( 数据与方法) ,子类中还可以对继承的特征进行 重定义。问题是,未重定义的继承特征是否还需要进行测试呢? 重定义的特征需要重新测试 是显然的,但应该如何测试重定义的特征呢? p e r r yd e 与k a i n s e rg e 2 5 1 根据w e y u k e r t 2 q 测 试充分性公理对这些问题进行了讨论,认为子类中继承的方法和重新定义的方法都必须在子 类环境中重新测试,对被继承方法是充分的测试数据集未必对重定义的方法是充分的。 在面向对象系统中,良好的类层次结构有助于提高软件可重用性。但多重继承( m u l t i p l e i n h e r i t a n c e ,一个子类有多个父类时) 和多重继承( r e p e a t e di n h e r i t a n c e ,类层次图中一个子 类能通过多条路径继承同一父类的特征) 虽然使软件的共享程度有所增加,但也提高了子类 的复杂性,并且会导致一些从功能角度很难发现的隐含错误。总之,继承性使测试更加复杂。 继承是面向对象描述类之间相似性的一个重要机制。在现实世界中人量的实体都存在一 定程度的相似性。这种相似性可能表现在实体的外形上,也可能表现在实体的行为和内在特 性上。人们总是希望能够最大程度地利用种种相似性,不仅在管理系统的类的时候,还是在 定义新的类的时候都希望通过利崩这种相似性来简化工作,并重用以前的:r 作。面向对象利 用继承表达这种相似性,使得可以利用继承来管理类,同时也使得在定义一个与先前已经定 义的类相似的类时能简化类的定义工作。 继承也刻画了类的一般性和特殊性,被继承的类可称父类或超类,继承的类可称为子类。 可以看出,继承这种机制使得类的描述具有了层次结构,处于同一层次结构中的类共享顶层 8 西南夫学硕 :学位论文第2 章面向对象软件的修改影响分析 曼曼! ! 曼曼曼曼! 曼曼曼! ! ! 曼皇曼曼曼曼曼曼! 曼曼曼! 曼曼曼曼皇舅曼皇曼量曼蔓曼皇i i i;iiii l l 曼曼皇曼舅曼曼! 苎曼 类所定义的属性和操作。因此继承机制使类从一开始就具有了继承和被继承的能力,简而言 之,就是具有了重用和被重用的能力。 2 1 - 3 多态性和动态绑定 同一消息可以根据发送消息对象的不同采用多种不同的行为方式,这就是多态的概念。 运行时系统能自动为给定消息选择合适的实现代码,这给程序员提供了高度柔性、问题抽象 和易丁维护的好处。多态性是指对象的某个行为具有多种形态的特性。行为的多种形态封装 在对象内部,外界并不知道。一个行为的多种形态从外界看来具有相同的行为名称( 也即相 同的消息名) ,因此外界看到的只是一种行为。具体应该执行哪种形态由对象自己根据接收 到消息里的相关参数决定。但多态性和动态绑定所带来的不确定性,使得传统测试实践中的 静态分析法遇到了不可逾越的障碍。而且它们也增加了系统运行中可能的执行路经,加大了 测试用例的选取难度和数量。 2 2 面向对象软件的特点对测试的影响 从1 9 8 2 年在美国北卡罗来纳入学召开首次软件测试的正式技术会议至今,软i t - 澳0 试理 论迅速发展,并相应出现了各种软件测试方法,使软件测试技术得到极大的提高。然而,一 度实践证明行之有效的软件测试对面向对象技术开发的软件多少显得有些力不从心。尤其是 面向对象技术所独有的多态,继承,封装等新特点,产生了传统语言设计所不存在的错误可 能性,或者使得传统软件测试中的重点不再显得突出,或者使原来测试经验认为和实践证明 的次要方面成为了主要问题。 面向对象程序的结构不再是传统的功能模块结构,作为一个整体,原有集成测试所要求 的逐步将开发的模块搭建在一起进行测试的方法己成为不可能。而且,面向对象软件抛弃了 传统的开发模式,对每个开发阶段都有不同以往的要求和结果,已经不可能用功能细化的观 点来检测面向对象分析和设计的结果。因此,传统的测试模型对面向对象软件已经不再适用。 针对面向对象软件的开发特点,在文献 2 8 】中提出了一种新的测试模型。 面向对象的开发模型突破了传统的瀑布模型,将开发分为面向对象分析( o o a ) ,面向 对象设计( o o d ) ,和面向对象编程( o o p ) 三个阶段。分析阶段产生整个问题空间的抽象 描述,在此基础上,进一步归纳出适用丁面向对象编程语言的类和类结构,最后形成代码。 由丁面向对象的特点,采用这种开发模型能有效的将分析设计的文本或图表代码化,不断适 应用户需求的变动。针对这种开发模型,结合传统的测试步骤的划分,提出一种整个软件开 发过程中不断测试的测试模型,使开发阶段的测试与编码完成后的单元测试、集成测试、系 统测试成为一个整体。测试模型如2 1 图所示: 9 两南人学硕f j 学位论文第2 章面向对象软件的修改影响分析 o o a t e s t :面向对象分析的测试 o o dt e s t :面向对象设计的测试 o o pt e s t :面向对象编程的测试 o ou n i tt e s t :面向对象单元测试 o oi n t e g r a t et e s t :面向对象集成测试 o os y s t e mt e s t :面向对象系统测试 图2 1 面向对象测试模型 o o at e s t 和o o dt e s t 是对分析结果和没计结果的测试,主要是针对分析设计产生的文 本,它们是软件开发前期的关键性测试。o o pt e s t 主要针对编程风格和程序代码实现进行 测试,其主要的测试内容在面向对象单元测试和面向对象集成测试中体现。面向对象单元测 试是对程序内部具体单一的功能模块的测试,如果程序是用j a v a 语言实现,主要就是对类 成员函数的测试。面向对象单元测试是进行面向对象集成测试的基础。面向对象集成测试主 要对系统内部的相互服务进行测试,如成员函数间的相互作用,类间的消息传递等。面向对 象集成测试不但要基于面向对象单元测试,更要参见o o d 或o o dt e s t 结果。面向对象系 统测试是基于面向对象集成测试的最后阶段的测试,主要以用户需求为测试标准,需要借鉴 o o a 或o o at e s t 结果。面向对象的回归测试是与上面的测试都穿插在一起,每一阶段测试 完成后有错误就要修改,修改后就要进行相应的回归测试。 以上是关于面向对象技术对测试的整体影响,下面讨论面向对象的几项常见的特点对测 试的影响。 2 2 1 封装性对测试的影响 类的封装机制给软件测试带来了困难。类的重要特征之一是封装性,它把数据和操作数 据的方法封装在起,限制对象属性对外的可见性和外界对它的操作权限,从而有效地避免 了类中有关实现细。仃的信息被错误地使用,而这样的细:市性信息止是软件测试所不可忽略 的。由于面向对象的软件系统在运行时由一组协调工作的对象组成,对象具有一定的状态, 所以对面向对象的程序测试来说,对象的状态是必须考虑的冈素,测试应涉及对象的初态、 输入参数、输出参数、对象的终态。对象的行为是被动的,它只有在接收有关消息后才被激 活来完成所请求的上作,并将结果返回给发送消息者。在工作过程中,对象的状态可能被修 1 0 - 两南人顾i j 学位论文第2 章面向对象软件的修改影响分析 改,产生新的状态。面向对象软件测试的基本上作就是创建对象( 包括初始化) ,向对象发 送一系列消息,然后检查结果对象的状态,看其是否处于正确的状态。但是,对象的状态往 往是隐蔽的。若类中未提供足够的存取函数米表明对象的实现方式和内部状态,则测试者 必须增添这样的函数【2 5 1 。例如:在1 个堆栈类s t a c k 中,其成员变量h 代表了栈顶的高度。 当堆栈不满时,每执行1 次p u s h ( x ) ,h 加l ;当堆栈不空时,每执行1 次p o p 0 ,h 减l 。 但h 是私有成员,对外界不可见,如何能够了解剑程序执行后h 的值是否正确地得到了改 变呢? 可以在s t a c k 类中添加1 个成员函数r e t u m h 0 ,用于返回h 的值,这样便能观察剑 程序的执行结果。但这种方法增加了测试的1 :作量,在一定程度上破坏了类的信息隐蔽性和 封装性。 2 2 2 继承性对测试的影响 类的继承机制增加了软件测试的复杂性。继承由扩展、覆盖和特例化三种基本机制实现, 其中扩展是子类自动包含父类的特征:覆盖是子类中的方法与父类中的方法有相同的名字和 消息参数以及相同的接口,但方法的实现不同;特例化是子类中特有的方法和实例变量。在 面向对象的软件测试中,未重定义的继承特征是否还需要进行测试? 重定义的特征需要重新 测试是显然的,但应该如何测试重定义的特征呢? w e y u k e r 曾经提出了1 l 条基于程序的测 试数据集的充分性公理【2 6 1 ,p e r r y 与k a l s e r 根据w e y u k e r 公理对这些问题进行了讨论【2 7 1 。 w e y u k e r 的非外延性公理认为:若有两个功能相同而实现不同的程序,对其中一个是充 分的测试数据集未必对另一个是充分的。这一公理表明,若在子类中重定义了某一继承的方 法,即使两个函数完成相同的功能,对被继承

温馨提示

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

评论

0/150

提交评论