(计算机软件与理论专业论文)软件单元测试技术研究.pdf_第1页
(计算机软件与理论专业论文)软件单元测试技术研究.pdf_第2页
(计算机软件与理论专业论文)软件单元测试技术研究.pdf_第3页
(计算机软件与理论专业论文)软件单元测试技术研究.pdf_第4页
(计算机软件与理论专业论文)软件单元测试技术研究.pdf_第5页
已阅读5页,还剩52页未读 继续免费阅读

(计算机软件与理论专业论文)软件单元测试技术研究.pdf.pdf 免费下载

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

文档简介

华中科技大学硕士学位论文 摘要 随着信息技术的飞速发展,软件产品在社会的各个领域中得到了广泛应用, 软件产品的质量成为人们共同关注的焦点。软件测试是保证软件质量的重要手段, 单元测试是软件测试过程中最基本的测试。结合目前软件单元测试技术的研究现 状,我们将深入研究单元测试中源文件的模块依赖问题和测试用例的自动生成问 题。 软件代码的规范化、层次化及模块之间的依赖关系的合理化,是软件质量的 重要方面。分析模块依赖关系之后,需对源代码中各个模块设计测试用例,以达 到一定的测试覆盖标准,保证测试的完整性。可以将单元测试分为代码审查和执 行测试两个步骤完成,具体过程为扫描源文件,进行代码审查,分析模块依赖的 特点,生成测试用例,最后运行测试。为了提高单元测试的效率和准确率,有必 要将这一过程自动化,减少手工干预。 在分析单元测试问题的基础上,研究与实现一个单元测试系统。针对程序源 文件中的代码审查问题,借助l e x 与y a c c 工具对源文件进行词法语法分析。针对 模块依赖问题,需在语法分析程序中添加代码,生成描述依赖关系的有向图,将 累积模块依赖c m d 作为衡量代码质量的度量标准,它与单元测试中的增量式模 块测试的开销紧密联系,由此对代码质量进行定量分析。针对测试用例的生成问 题,指出一个基于谓词切片的算法的不足之处,分析其中的关键步骤即线性约束 系统的建立,提出改进算法以判定线性约束系统的相容性,并对不相容的系统进 行变换,以便有效地找到测试数据。 最后以对几个实例的测试结果的分析证明该系统的有效性。 关键词:软件质量,软件测试,单元测试,模块依赖,测试用例 华中科技大学硕士学位论文 a b s t r a c t w i t ht h e f l y i n gd e v e l o p m e n to fi n f o r m a t i o nt e c h n o l o g y , s o f t w a r ep r o d u c t sa r e p r o l i f e r a t e d i nv a r i o u ss o c i a lf i e l d s ,a n dt h eq u a l i t yo ft h e mh a sb e c o m et h ef o c u s p e o p l ep a yg r e a ta t t e n t i o nt o s o f t w a r et e s t i st h em a i nm e a n st o g u a r a n t e es o f t w a r e q u a l i t y ,a n du n i tt e s ti st h ee l e m e n t a r yt e s ti nt h ep r o c e s so f s o f t w a r et e s t a c c o r d i n gt o t h ec u r r e n tr e s e a r c hs t a t u so fs o f t w a r eu n i tt e s tp r o b l e m s ,w ew i i l i n v e s t i g a t em o d u l e d e p e n d e n c i e si nt h es o u r c ef i l ea n d t h ea u t o m a t e dt e s tc a s eg e n e r a t i o n t h es t a n d a r d i z a t i o na n dt h es t r a t i f i c a t i o no fc o d ea n dt h er a t i o n a l i z a t i o no ft h e d e p e n d e n c yr e l a t i o n sa m o n g m o d u l e sa r ei m p o r t a n tf a c t o r so fs o f t w a r eq u a l i t y a f t e r a n a l y z i n gm o d u l ed e p e n d e n c i e s ,t e s tc a s em u s tb ed e s i g n e df o re a c hm o d u l ei nt h e s o u r c ef i l e ,t oa c h i e v es o m et e s tc o v e r a g ec r i t e r i a ,m a dt oe n s u r et e s ta d e q u a c y u n i t t e s tc a l lb ed i v i d e di n t ot w op r o c e s s e sn a m e l yc h e c k i n gt h ec o d ea n d e x e c u t i n gt h et e s t , w h i c hd e t a i l e d l yi n c l u d e ss c a n n i n gt h es o u r c ef i l e ,c h e c k i n gt h ec o d e ,a n a l y z i n gt h e s p e c i a l i t yo f m o d u l ed e p e n d e n c i e s ,g e n e r a t i n gt e s tc a s e sa n df i n a l l ye x e c u t i n gt h et e s t i no r d e rt o i m p r o v et h ee f f i c i e n c y a n dt h ev e r a c i t yo fu n i tt e s t ,i ti se s s e n t i a lt o a u t o m a t ea b o v e p r o c e s s e s ,s ot or e d u c em a n u a l w o r k t h e nw er e s e a r c ha n di m p l e m e n tau n i tt e s ts y s t e mo nt h eb a s i so f p r o b l e ma n a l y s i s f o rt h ec o d ec h e c k i n gp r o b l e m ,w ep u tt h es o u r c ef i l ei n t ol e x i c a la n a l y s i sa n ds y n t a x p a r s i n gb yu s i n gl e xa n dy a c ct o o l s f o rt h em o d u l ed e p e n d e n c i e sp r o b l e m ,w ea d d s o m ec o d ei n t o p a r s i n gp r o g r a m ,t og e n e r a t e d i g r a p hd e s c r i b i n g t h em o d u l e d e p e n d e n c i e sr e l a t i o n s ,t h e nu s eam e a s u r e m e n tc r i t e r i o nn a m e dc u m u l a t i v em o d u l e d e p e n d e n c y ( c m d ) t ow e i g h t h ec o d eq u a l i t y ,w h i c hi sa s s o c i a t e dw i t ht h es p e n d i n go f i n c r e m e n t a lm o d u l et e s ti nt h eu n i tt e s tc l o s e l ya n dc a na n a l y z et h ec o d eq u a l i t y q u a n t i f i c a t i o n a l l y f o rt h et e s tc a s eg e n e r a t i o np r o b l e m ,w e i n d i c a t et h ed e f i c i e n c yo fa p r e d i c a t e s l i c eb a s e dm e t h o d ,a n a l y z et h ep r i m a r yp r o c e s sn a m e l ye s t a b l i s h i n gt h e l i n e a rc o n s t r a i n ts y s t e m ,a n df i n a l l yp r o p o s ea ni m p r o v e da l g o r i t h mt oe s t i m a t et h e c o n s i s t e n c yo f l i n e a rc o n s t r a i n ts y s t e m ,t ot r a n s f o r mt h ei n c o n s i s t e n ts y s t e m ,s ot of i n d t e s td a t ae f f e c t i v e l y i i 华中科技大学硕士学位论文 f i n a l l y ,t h ev a l i d i t yo f t h es y s t e mi sp r o v e db ya n a l y z i n gt h et e s tr e s u l t so fs e v e r a l i n s t a n c e s k e yw o r d s :s o f t w a r eq u a l i t y , s o f t w a r et e s t ,u n i tt e s t ,m o d u l ed e p e n d e n cy ,t e s tc a s e i i i 独创性声鹬 本人声明所璺交的学位论文是我个人在导师指导下进行的研究工作及取得 的研究成果。尽我所知,躲文中已经标明引用的内容夕 ,本论文不包含援俺其他 个人或集体已经发袈或撰写过的研究成果。对本文的研究做出贡献的个人和集体, 均已在文中以明确方式括暖。本人完全意识到本声明瓣法簿维果惠本人承怒。 学位论文作者签名:余靶 嚣期:2 0 0 4 军每月;o 强 学位论文版权使用授权书 本学位论文作者完全了解学校有关像馨、使用学位论文的规定,即:学校 有权保留并向国家有关部门或机构邀交论文的复印件和电子版,允许论文被查阅 和倦阅。本人授投华中科技大学可以耀本学位论文蛇全嫠藏部分内容编入鸯关数 据魔进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 撩密口,在 年解密屠逶孺本授权书。 本论文属于 不嫖密固。 ( 请在以上方框内打“4 ”) 学位论文馋者签名:金毒长 翻期:工o 。午年印月,口日 瓣粼躲碣财 日期:勘bl 年r 月e 囡 华中科技大学硕士学位论文 1 1 课题背景 1 绪论 随着计算机应用日益普及和深化,现代软件的规模越来越庞大,复杂程度 也越来越高。在软件开发过程中,可能出现许多意想不到的严重问题。如果设 计方法不当或编程习惯不良,轻则可能造成费用失控、进度延迟、执行代码臃 肿、低效,重则可能导致开发项目完全失败。因此如何提高软件质量,保证软 件安全性是一个涉及面广、难度大的课题。高质量软件的开发技术将是打开2 1 世纪高技术市场的钥匙,而软件测试则是软件质量保证中的关键技术。 软件必须通过测试才能确保其在应用环境中工作正常。软件测试是使用为 发现错误所选择的输入和状态的组合而执行代码的过程。具体的说,软件测试 是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例 ( 即输入数据及其预期的输出结果) ,并利用这些测试用例去运行程序,以发现 错误的过程。软件测试在开发成本中占有4 0 以上的比例,它是保证软件质量 的重要手段。软件测试的目的是尽早尽可能多地发现软件中的缺陷,提高软件 产品的质量。同时软件测试也应是高效的,尽可能占有时间少且开销小。因此 有必要研究和开发一定的测试工具以使测试更加全面、彻底和精确,并提高测 试效率。 软件开发规模的增大、复杂程度的增加,使得以寻找软件中的错误为目的 的测试工作更加困难。然而,为了尽可能多地找出程序中的错误,生产出高质 量的软件产品,加强对测试工作的组织和管理就显得尤为重要。为了保证测试 的质量,将测试过程分成单元测试、集成测试、确认测试和系统测试几个步骤1 2 j 。 图1 1 表示了测试过程和软件开发的关系。 测试是一项烦琐复杂的工作,它具有工作量大、重复性高的特点。为了更 有效地进行单元测试,可将测试的部分过程自动化,减少手工工作量和由于手 工干预可能产生的错误。单元测试通常放在编码阶段,集中在检查软件设计的 最小单位模块上,通过测试发现实现该模块的实际功能与定义该模块的功能说 明不符合的情况,以及编码的错误。而在实际的测试工作中,测试的单位是可 华中科技大学硕士学位论文 能包含多个模块的程序源文件,在这种情况下可将单元测试的范围扩大到对源 文件的测试,需对源文件进行模块划分,提取出源文件中各模块之间的依赖关 系,研究一个具有词法语法分析功能的工具自动完成模块依赖分析过程,模块 依赖关系是否合理也将影响代码质量的衡量,因此还需形式化地研究依赖关系, 根据分析结果可对代码做一定的修改以提高其质量。对每个模块需进行测试, 设计测试用例对其进行查错,测试用例自动生成算法的研究是测试自动化中的 关键步骤,生成有效的测试用例可提高测试完整性和正确性,将这一过程自动 化则可减少测试开销、提高测试效率。 图1 1 软件开发与测试过程 本课题研究软件单元测试技术。它的目的在于自动分析代码文件的结构, 说明它的模块依赖关系和编码质量,并研究软件测试用例生成算法。它的意义 在于减少单元测试的复杂程度和开销,增加在有限时间内的测试,提高单元测 试的效率和自动化程度。 1 2 国内外研究概况 1 2 1 软件测试的方法和过程研究 近3 0 年来软件测试的重要性越来越得到人们的认同,软件测试的研究也有 了一定的发展。测试活动可以采用各种不同的策略,即表明不同的出发点、不 华中科技大学硕士学位论文 同的思路以及采用不同的手段和方法。白盒测试和黑盒测试是很广泛使用的两 类测试方法p j 。 白盒测试又称基于代码的测试,通过检测软件代码结构生成测试用例 。进 行白盒测试首先要分析程序结构,可以对控制流或数据流分析。白盒测试的一 个重要问题是测试进行到什么地步就达到目标,可以结束测试了,即需要给出 测试的覆盖标准。常用的覆盖标准有:语句覆盖、判定覆盖、条件覆盖、判定 一条件覆盖及路径覆盖,其中路径覆盖是最全面的测试覆盖。因此,路径分析 也是白盒测试中最典型的问题。路径测试是所有测试技术的基础 5 ,最常用于单 元测试。 黑盒测试又称基于规格说明的测试,依靠反映程序输入输出关系和程序功 能的规格说明书确定测试用例 4 l 。黑盒测试包括等价类划分、因果图、正交实验 设计法、边值分析等方法。 单元测试对模块进行测试,主要发现编码和详细设计中产生的错误。作为 测试过程的一个最基本而重要的步骤,单元测试得到了越来越深入的研究。文 献 6 】中研究单元测试的覆盖问题和测试完整性,指出测试质量的客观度量是软 件测试中的一个关键课题,对于单元测试,测试覆盖问题和测试完整性是测试 质量的衡量标准。人们提出了大量的测试数据完整性标准,并引入各种测试原 理来支持相应的测试标准。该文献分类详细评述了各种测试标准的特点、覆盖 率及测试能力,包括基于代码的结构测试和基于规格说明的测试标准、基于缺 陷的完整性测试标准、基于错误的完整性测试标准和域分析,并对它们各自的 可靠性、有效性和开销等进行定量分析和比较。这些理论分析是单元测试实施 的基础依据。 文献 7 】中通过与传统结构化方法中单元测试的比较,对面向对象方法中的 单元测试、类测试进行分析。文献指出在结构化软件系统测试中,首先进行的 是模块测试,在保证模块正确的基础上才能进行集成测试、验收测试。模块测 试的目标是保证模块作为一个单元能正确运行,所以通常又称为单元测试。面 向对象的测试也是从小型测试到大型测试,即从单元测试开始。面向对象软件 系统中最小的单位是类,在面向对象软件系统中,单元测试指的也就是类的测 试。传统的单元测试主要评价模块的五个特性:与外界的接口、局部数据、重 要的执行通路、出错处理通路、影响上述各方面特性的边界条件。这五个特性 华中科技大学硕士学位论文 在面向对象中依然存在。传统的单元测试只需运行单个模块,而对象中存在多 个方法实现各自的功能,需要测试每个方法是否实现了预定的功能以及方法之 间的协作是否有效。该文献还说明了虽然类测试是复杂的,但关于重用的研究 发现重用可以大大降低代码的出错率。 以上对单元测试的任务和常用方法的研究,对于单元测试以至整个软件测 试的过程都有重要的指导意义。 1 2 2 单元测试用例生成方法的研究 测试活动可以采用各种不同的策略,即表明不同的出发点、不同的思路以 及采用不同的手段和方法。实际上只有对每一个运行环境、语句、条件分支、 路径等进行穷举测试,才能确保测试的彻底性【8 】。穷举测试要求每一个可能值和 输入序列被应用于被测系统的每一个可能的状态,从而检测每一条可能的执行 路径。然而穷举测试是不可能的,软件测试必须是穷举测试包的一个小的子集。 测试用例的设计和生成是单元测试的一个主要研究内容。根据代码文件设计的 测试用例应详细说明被测试的代码的预测试状态及其环境,测试的输入条件以 及预期结果【9 1 。测试用例的生成是指确定一个测试数据集合,使之满足一个特定 测试标准,达到一定的测试覆盖率和完整性。 到目前为止,大部分测试用例生成的研究都是基于代码的。文献1 0 】中研究 了程序测试的可行路径】分析应用,描述了一个结构化测试系统的设计和原型 实现,这个系统使用一个定理校准来决定测试要求的可行性,并使达到测试覆 盖所需的测试用例数量最小。该文献还详细描述了如何将测试标准形式化为控 制流程图的路径表达,标准又如何映射到逻辑规则上,如何控制推论任务的复 杂度。由于在测试集自动生成中可能包含不可执行的测试用例,将影响测试的 准确性,文献 1 2 1 中研究了可执行化处理中所涉及谓词可满足性问题的复杂度和 测试路径可执行性问题,在此基础上进一步提出并实现了“可执行参数化”的 算法,提高了一个测试集自动生成系统的实用性和执行效率。 文献 1 3 中研究了软件测试数据生成的链接方法,这种方法是在被测程序实 际执行的基础上产生测试数据的,运用了数据相关性分析来自动识别语句,指 导搜索过程。这一研究使得测试数据生成的效率得到提高。 4 华中科技大学硕士学位论文 文献 1 4 中介绍了软件结构测试数据生成的研究现状,指出当时按路径生成 测试数据的方法主要有符号执行和程序直接执行两种。符号执行是指静态地分 析给定路径的有关变量和谓词,对路径上赋值语句的左部变量及分支谓词的变 量依次用输入的符号表达式进行替换,使该路径的分支谓词为有关输入的符号 值的等式或不等式方程组,求解这些路径的限制条件的方程组即可产生测试数 据。程序直接执行是指在对被测程序的有关信息了解不充分的条件下,通过实 际执行被测程序,经过多次循环探测,并对测试结果进行评价后,最终确定测 试数据。该文献探讨了一种采用程序直接执行方式,用遗传算法作为搜索策略 生成结构测试数据的方法,并用初步的实验表明该方法是有效的、可行的。 文献【15 】中研究了基于程序图的路径测试,将程序流程图简化为程序图,它 是一个有向图,结点代表流程图中的各种框,有向边代表程序流程。接着提出 了基于程序图的路径测试覆盖标准,及路径数的计算方法。这种计算方法可以 比较准确地定出具有复杂判断语句的程序图的路径数上下界,还可以很好地解 决带循环的程序图的路径数计算。作者认为路径测试的关键是计算路径数,根 据路径数设计测试用例,但这显然考虑地不够全面。路径数的确定只是生成测 试用例的第一步,要选择具体的测试输入还需要其它大量的工作;并且路径数 会随着判断语句的数目呈指数增长,要设计如此多的测试用例以做到路径覆盖 几乎是不可能的,所以在测试用例的选择上就需要一定的取舍。 文献 1 6 中研究了基于域错误的数据生成算法。程序错误分为计算错误和域 错误,计算错误是特定的输入通过了正确的路径但计算结果是错误的,而域错 误是对特定的输入程序通过了错误的路径。该文献在较早的域测试策略基础上 进行改进,提出一种测试点( o n o f f 点) 的搜索算法,并在此基础上通过重复 应用o n o f f 点,逐步挑选程序路径,生成测试数据。将路径选择和数据生成 结合起来研究,减小了产生不可达路径的可能性,提出了第一个自动生成数据 的完整算法。 g u p t a 等人提出了一种基于程序执行的方法t 1 7 】,使用松弛迭代法生成测试数 据。这种方法采用程序谓词切片的思想,在给定域中任意选择一组输入数据, 对路径上的每个谓词分支,确定其谓词切片和输入依赖集,推导出各谓词函数 关于输入变量的线性约束,建立输入变量增量的线性方程系统,用高斯消元法 求解后得到各输入变量的增量,从而获得一组新的输入。若路径上各谓词分支 华中科技大学硕士学位论文 都是输入变量的线性函数,该方法或者通过一次迭代找到解,或者保证路径不 可行。若至少有一个谓词分支是非线性函数,则可能需要迭代多次。 在此基础上g u p t a 等提出了基于u n a 方法的测试数据生成方法【1 8 l 。u n a 方法即统一数值方法( u n i f i e dn u m e r i c a la p p r o a c h ) ,是用于求解线性不等式系 统的一种方法。u n a 方法改进了线性方程系统的求解方法,用最小二乘法代替 高斯消元法求解线性方程系统,避免由于自由变量取值而导致的线性方程系统 不相容。 单锦辉等改进了g u p t a 方法【1 9 _ 2 ”,省略了该方法中构造谓词切片和输入依 赖集的过程,直接计算各谓词函数的线性算术表示,建立输入变量的线性方程 系统,求解后获得一组新的输入。 文献 2 2 1 中分析了u n a 方法【1 8 1 的缺点,指出u n a 方法的迭代次数并不能 由待解系统的大小决定,而是依赖于输入的组成结构。也就是说,即使对于由 一个变量组成的简单系统,也可能达到超过一千次的迭代。该文献还形式化证 明了当系统存在解时,u n a 并不总能找到混合整数解。 可以看出,基于代码的测试生成优点是能针对程序结构进行调查查错,易 于控制被测程序的测试覆盖,其缺点是不便于从用户角度检查软件系统功能实 现的完整性和正确性,但这正是软件测试的根本要求和终极目标,为此,人们 提出了一些基于功能规格说明【2 3 】的软件测试方法。 文献 2 4 1 中研究了基于规格的适应性测试用例生成策略,提出了对于开放性 操作系统的标准环境中的测试方法s b a t c g ,这种方法从基于模型的规格说明 中推导出抽象状态转换的模板描述,它比单纯的基于规格说明的生成方法具有 更高的揭错能力【25 1 。研究中使用的是z 规格说明语言【2 “。基于规格的测试生成 存在的不足之处是,它完全不涉及到程序的内部结构,如果外部特性本身有问 题或规格说明有误则发现不了。因此将基于规格说明和基于代码的测试结合起 来,可以发挥它们各自的优点,使测试更加有效。 测试可以看成是一个搜索问题,要在数百万计的输入及其状态组合中,寻 找那些极少数的能够发现错误的状态及其组合,应用建模技术可以达到这一要 求,模型支持输入及其状态组合的系统枚举【9 1 。于是基于模型的测试成为一种重 要的测试方法,测试模型的开发技术开始得到研究,其中较为广泛的是状态机 【2 ”、组合逻辑和统一建模语言u m l 等技术。文献 2 8 中研究了基于程序执行状 6 华中科技大学硕士学位论文 态图的软件测试方法,即从程序的执行状态出发,从系统功能的角度,按照一 定的覆盖准则,用形式化的方法生成测试用例。文献2 9 中研究了基于u m l 的 完整性测试,提出了用u m l 建立模型、生成测试用例的方法。该文献的研究结 果表明这种方法减少了测试开销。u m l 是面向对象建模语言,使用这种方法进 行测试建模对面向对象系统的测试有着重要的作用。 文献 3 0 中研究了对于包含过程的程序自动生成测试数据,指出当时存在的 测试数据生成方法局限于单元测试而不能对包含过程的程序有效地生成测试数 据,针对包含过程的程序,该文献提出了基于被测程序的实际执行而生成测试 数据的方法。 其它的测试用例生成方法还包括基于数据流分析技术的测试数据生成【3 ”, 面向断言的测试数据生成方法【3 2 ,运用约束解决技术生成测试数据的方法吲, 应用区间算术对约束集求解生成测试数据的方法 3 4 1 等。 从上述各种研究中可以看出,单元测试及其测试用例生成的方法有多种, 它们的最终目标就是要通过对程序进行检查和分析,生成尽可能少的测试用例, 达到所需的测试覆盖标准,有效地测试出程序中存在的各种错误,提高错误检 测率【3 5 】,最终提高程序质量。 1 3 课题的主要研究工作 本课题研究一个软件单元测试系统,对编制的源文件进行代码审查,设计 测试用例,执行测试用例,分析测试结果。代码审查和设计测试用例是其中的 主要步骤。随着计算机应用水平和层次的逐步提高,应用软件系统日益复杂化 和大型化,组成软件系统的各程序需要实现许多复杂繁琐的功能,程序员编制 的代码也就随之复杂臃肿,其中可能包含各种模块依赖关系,可读性及可测试 性不高。测试人员在进行单元测试时经常遇到这类问题,从而导致测试效率和 进度的降低。 概括来说,本课题的主要工作包括四个方面。 1 研究软件单元测试的任务和过程,讨论代码质量对单元测试的影响。分 析单元测试中的模块依赖和测试用例生成问题,选择可行的解决方案。 2 研究和实现一个单元测试系统,使其对c 源文件进行扫描检查,自动分 7 华中科技大学硕士学位论文 析词法语法。 3 对模块之间的依赖关系进行形式化研究,分析模块依赖关系对代码质量 的影响,对程序中的模块设计质量进行定量分析,并将对源代码的测试划分为 对每个模块的逐层测试。 4 研究对单个模块生成测试用例的算法,分析基于谓词切片的测试用例自 动生成算法的思想及其线性约束系统的相容性,对该算法进行补充完善。 华中辩技大学硕士学位论文 2 单嚣测试翊题的分橇 本章褥对单元灏试豹任务及单元测试中存在瀚海题逐行分糖。首壳讨论摹元 瓣试的任务,它在懿个软彳牛测试过程中的蘸要健,要傲哪些薰要工作警:按潜讨 论驳俘设诗和软俘黧量,班及它 j 对潮试过程鲍影响,分率厅代鹳申的模块依赖关 系和测试厢例生成的问题。 2 。1 单涎测试麓任务 敬季孛溺试是为了发现疆误谣拽萼亍程穿熬过程。它怒缀攫稷黪殍发狳羧款掇搐 说明及程序内部结撬丽糖心设计懿一擞测试用铡( 埝入数握及装预期终果戆爨 合) ,著到鬻该溅试耀铡去遮彳亍疆净,以发瑗锩淤粒过程。软传 翼试豹嚣懿惹为 了尽旱尽霹戆多避茨现软馋中麴缺陷,挺麓数传产晶斡厦爨。 软臀黥摹元溅试是疑试过程孛最基本熬溅试,单元爨软待瓣构成蘩锻,爨此 肇元瓣矮爨楚整个软件艨鬟戆綦戳。单元测试蕊歙 牛测试过程中囊搂与代码鞠关 懿溅试,它对其它溅试步骤麓遴行脊重蘩彭豌。攀元溅试在软搏黪缡鲻羚莰遴譬亍, 圭委完成戆王作跫摄撂详缀设诗说明书缡筵程黪源饯璐,包揍必要瓣数据文 孛; 著遴行擎元测试,疑露鬟美溅试阀惩。本瀑题磷突较 串零元溺试技术,没诗势实 琰一个单元测试系统,爨凌分辨我秘文学瓣缭榻,定爨分搴厅缀鸦痰量,磷究软,f 串 溺试溺铡生成冀法。苇元溺试系统瓣研究褥为葵它戆测试系缝磷究提镤繁礁,冀 鸯效瞧翻塞韵纯程寝都怒疆究懿关键。 零元测试包括静态静代褐审鸯帮动态溺试两个阶段。代弱窜焱阶段瓣程序避 章予慧态分橱,毽撼编疆辩嵇裣蠹、模块渡口硷焱、程序滔言梭篷、内孬捻查、魏 较移转移裣凝、稳熊裣森、可雅护经裣鸯、逻辑梭套、软件多余秘裣查等。动态 灏试阶袋蕾先编笃驱动攘较帮摭援块瑟秘,在驱秘攥浃稻穰模块中设计辆瘦豹溺试 用铡,涮试用镄皮该覆靛单元模块的繇有功能颈,妻西暴单元禳浃有性箍等其它测 试酶程要求,鄹必须设计撩应的测试臻绸潲试邈鍪特程,然露运雩亍铡试,比鞍测 试结桀。 单元测试豹任务包捂:模块接口测试、模块麓部数据结掏测试、模块边界象 件测试、模块中所有独立执行通路测试、模块的各条错误处理邋路测试蹿 。模块 9 华中科技大学硕士学位论文 测试是单元测试的基础。只有在数据能正确流入、流出模块的前提下,其他测试 才有意义。检查局部数据结构是为了保证临时存储在模块内的数据在程序执行过 程中完整、正确。除局部数据外,如果可能,单元测试时还应该查清全局数据对 模块的影响。在模块中应对每一条独立执行路径进行测试,单元测试的基本任务 是保证模块中每条语句至少执行一次。一个好的设计应能预见各种出错条件,并 预设各种出错处理通路。边界条件测试是单元测试中最后也是最重要的一项任 务,软件经常在边界上失效,采用边界值分析技术,针对边界值及其左右设计测 试用例。本课题主要是针对代码文件中的执行路径研究测试用例的生成算法,对 于给定路径分析代码中的谓词切片,计算出测试数据或推断出该路径不可行。 2 2 模块依赖与测试用例生成 软件的设计既包括对运算符、语句、函数等语言结构的逻辑设计,也包括 对文件、目录和库等与系统物理实体有关的问题的物理设计。对c 程序而言, 逻辑设计考虑的是程序功能的实现和代码的编制,何时使用或不使用某种特定 的数据结构、语言结构,等等。而物理设计则涉及“将一个数据结构或函数的 定义放置在什么地方”的问题。逻辑设计是软件设计的基础问题,而对于需要 多个文件目录才能满足功能实现要求的软件来说,物理设计也是非常重要的。 在进行软件开发时,要尽可能地寻找充分满足这个两个领域的约束条件的解决 方案,以达到一定的质量标准。这种质量标准可以从可靠性、易测试性、功能 性、可用性、可维护性、性能等各方面来衡量。可靠性是指软件是否有错误, 可以通过测试来发现软件中的错误,但软件不能只是通过测试这一手段来达到 可靠性要求。软件的内在质量在测试之前已经形成,不是所有的软件都能够有 效地测试。要想让软件能够有效测试,必须一开始就本着这个目标来对它进行 设计,即提高软件的易测试性。功能性是指一个产品是否能完成客户所期望的 工作。可用性是指软件产品是否能有效使用。可维护性是衡量支持一个系统工 作相对开销的指标,包括追踪错误、移植到新平台以及扩充产品的性能以满足 客户期望的未来需要。性能是衡量产品的速度和大小的指标。这些衡量指标对 于产品的整体成功都很重要【3 ”。站在测试人员的角度上,主要考虑它的可靠性 和易测试性。质量设计的一个主要部分是易测试性设计。 华中科技大学硕士学位论文 对复杂软件系统进行测试时,首先鬟了解它的物理结构,即它包含的文件、 嚣录、痒等兹理实体【3 朝,瑟有这些部搏都应该怒具有嶷好定义接口麴对象。每 个部件都可被隔离进行重点测试。通过分层技术,这些部件可以集成到一系列 嚣麓复杂瓣子系绞中,对每个予系统黎鸯一套测试,以绦证这耪壤量式魏集戏 能够正常地进行。最终的产品也漠进行测试,以确保产品能满足顾客的期望。 阂榉,对予较臀系统懿各缝成文件,毽鬟了簿荛魏逻凝结椽,帮它怠含费数撵 结构、语旬结构等逻辑实体【3 。”。组成软件系统的文件主要包括头文件和源文件, 懿者可麓锈含多个数摆缭橡,嚣者鼷霹怒奄含多个攘浚或砉滋邃数( 本文在谤 论依赖问题时将被测函数统一称为模块) ,它们是单元测试的最小单位。测试人 员进行擎元溅试静一顼工佟藏楚对源文 孛送行伐鹤枣焱,整臻窭源文俘中镑练 复杂的语句尤其是模块依赖关系,对每个源文件内部的这些模块依赖关系也袋 避行隔离溺试、分层涮试及增羹式溺试。在一个设诗蕤荮弱摸凌位懿文俘孛, 可以对许多模块进行隔离测试,即独立于文件的其他横块对单个模块进行测试。 然后掖撅模块依被关系翁分层缭构,进行增量式瓣试,直至l 溺试完整个源文件 中的所有模块。 单元测试静一个重骚任务楚对程序代码设计测试糟铡,以寻我耩序中静错 谈,检查其是否达到规定的质爨指标,然后运行测试,比较测试结果。对于单 独的源文件,通常采用囱盒测试的方法,通过分析程侉的内部奉奄造设计测试粥 例。为达到这一髓标,必须引入一种机制来决定源程序的划分 3 8 , 3 9 1 。当程序内 部存在多个模块,而各模块之间相互依赖相互调用时,程序流程的复杂度提离, 对程序络构的分析就显褥比较困难,礁以设计出有效的测试用例以达到相应的 覆盖标准。从这点上说,很商必要将模块依赖关系提取出寐,将源代码划分 为各个单独的模块,对每个模块设计测试用例,以保_ i 亚测试的毙整性。 这些工作需爱花费大量的二e 作量,尤其是对于设计或实现质量低劣的c 程 序,将显黎更热翅难了。模块依赖关系可分为两种:在模块定义体内的模块调 用语句称为定义时依赖;在模决调用时以模块作为实际参数则称为调用时依赖。 例如有两模块定义如下: d o u b l ep o w e r ( i n tx ,i n tn ) i n t i : 华中科技大学硕士学位论文 d o u b l ep ; p21 ; f o r ( i = 1 ;i i f ( e x p r e s s i o n ) s t a t e m e n tli f ( e x p r e s s i o n ) s t a t e m e n te l s e s t a t e m e n t 就是一个有二义性的文法,会引起分析冲突。可以按照以下方式编写 这个文法的y a c c 语法分析程序来避免这样的冲突: n o n a s s o cl o w e r t h a n e l s e n o n a s s o ce l s e s e l e c t i o n s t r u t :i f ( e x p r e s s i o n ) s t a t e m e n t p r e el o w e r t h a n e l s e ii f ( e x p r e s s i o n ) s t a t e m e n te l s es t a t e m e n t 移进一归约冲突是移进标记( 上面的e l s e ) 和归约规则( s t a t e m e n t ) 之间的 冲突。需要给标记( n o n a s s o ce l s e ) 和规则( n o n a s s o cl o w e rt h a ne l s e 币f f p r e cl o w e r _ t h a n e l s e ) 分配优先级。移进的优先级高于归约的优先级, 所 n o n a s s o ce l s e 必须出现在o o i 2 0 n a s s o c l o w _ t h a n e l s e 之后。 另外,可以编写如下的y y e r r o r 函数显示详细出错内容: y y e r r r o r ( c h a r + m e s s a g e 、 p r i n t f ( “d :sa t s n ”,y y l i n e n o ,m s g ,y y t e x t ) ; ) 在y a c c 源程序中可以通过下面的方法调用符号表: # i n c l u d e “s y m t a b h u n i o n d o u b l ed v a l ; s t r u c ts y m t a b + s y r u p ; t o k e n i d t o k e n n i _ 3 m 华中科技大学硕士学位论文 3 3 单元测试中的模块依赖 3 3 1 模块依赖关系的处理 前面已经讨论了单元测试中的问题,进行单元测试的对象是软件中各个单 独的源文件。当源文件内部存在多个模块及相互之间的依赖关系时,有必要将 模块依赖关系提取出来,从而帮助分析源程序的结构,设计有效的测试用例。 要分析模块依赖关系,需在词法语法分析程序中添入对模块的处理。首先 扩充符号表s y m t a b 结构,添加一个整型标志说明该符号表示变量、系统模块或 自定义模块模块。符号表用来表示各模块的定义。对于程序中出现的各模块, 则另外定义一个模块表c a l l t a b ,它的成员中也要设定一个整型标志说明该模块 是否已定义,若已定义则还需一个指向定义它的s y m t a b 结构的指针d e f 。这两 个表各自还有指向模块的形式参数和实际参数的指针和建立链表时所需的n e x t 指针。程序中通常存在嵌套的模块依赖关系,对此可采用堆栈的形式处理,定 义模块栈的结构c a l l s t a c k ,它包含c a l l t a b 型的栈顶、栈底指针和栈的大小三个 成员。对符号链表的操作主要是前面提到的s y m l o o k 函数,它首先查看符号链 表是否存在,若不存在则建立该链表,若存在则查找名字和当前读入符号相同 的结点,未查找到则将其加入链表中。符号表结构中的指向形式参数的指针p a r a 则在语法分析过程中,读到模块定义语句时将第一个参数值( 为另一符号表结 构) 赋给该指针,而第二个符号表结构的p a r a 指针则指向下一参数或为空,依 此类推。对模块栈主要有栈的初始化、压入( p u s h ) 、弹出( p o p ) 等操作。在 进行语法分析过程中,每当读到模块调用语句时,便将该模块压入栈内,同时 将e a l l t a b 的d e f 指针指向描述该模块定义的符号表结点,模块调用时用到的实 际参数中若存在模块,则按照符号表结构的p a r a 指针存放方法依次放入对应指 针f p a r a 中,即建立该模块的调用时依赖链表。 符号表的结构表示如下: s t r u e ts y m t a b c h a r * n a m e ; 符号名 i n tf l a 2 s :0 为变量,l 为自定义模块,2 为系统模块 i n tu t y p e ;符号的类型 华中科技大学硕士学位论文 i n tp o i n t f i a g ; 该符号是否为指针类型 i n t ( + f u n c p t r ) o ;该符号整为模块名则该戏员为调用模块的指针 s t r u c ts y m t a b8 n e x t ; 符合链袭的下一结点 s t r u c ts y m t a b + p a r a ;模块定义豹形式参数 s t r u c tc a l l t a b + c a l l ; 用于描述在定义体中调用哪个模块 ; 模块栈的结构表示如下; s t t a a c tc a l l t a b c h a r * f n a m e ; 模块名 i n tf l a g ; 0 力未定义模块,1 为已定义模块 s t r u c ts y m t a b + d e f ; 指向符号表s y m t a b 中的模块定义 s t r u c tc a l l t a b * f p a r a ; 调焉模块时效实参 s t r u c tc a l l t a b * n e x t c a l l ;用于描述在定义体中调用模块 ; 针对模块依赖的语法分析的总入口是f u n c t i o nd e f i n i t i o n ,若在一个模块体 内瓣趸了勇一令模块,粥需要援另一个键表澎该调鼹关系记滚下来。溺此篱在 符号表结构s y m t a b 中加入一个c a l l t a b 型的指针c a l l ,它指向个模块体内调用 静第一个模块,瓣在模块棱结秘c a l l t a b 中定义c a l l t a b 黧戆指钟n e x t c a l l ,列强淘 先前的模块体内调用的下一个模块,调用关系就以这种方式依次记录下来,即 建立该模块静定义露依狡链表。这些搡作都必须在y a c c 程序中鑫j 终结簿懿麓 则体内究成。 y a c c 生成的语法分辑程亭黪入日点是y y p a r s e o ,当程序谲罔y y p a r s e o 霹, 语法分析程序试图分析输入流。若分析成功,语法分析程序则返回一个零德; 度之刚邋西一个非零穰。每次调用y y p a r s e o 对,语法分轿程序将重薪开始避行 分析,丽忘记上次返回的状态。根据y a c c 程序的这一规则,在进行谮法分 斤时 只调用一次y y p a r s e o ,之前要作一定静准备工作,如对源文件的预处淫、对y y i n 的赋值等。预处理主要是对文件包含i n c l u d e 语句的处理,将源文件包含的备头 文件的名字提取出来,并找到宅在系统中的位髓。在y y p a r s e o 之前做的工作还 甑括对模块栈和模块依赖图的初始化。调用y y p a r s e o 对源文件进行分析之后, 将符号链表中的各模块定义、形式参数、模块体内调用的其他模块提取赢 华中科技大学硕士学位论文 来,同时对每个模块建立模块依赖图的结点。缦着分祈已建立好的模块栈,依 次弹出每个结点,分析它是否为已定义的模块,是则分别显示出它的调用时依 赖链表和定义时依赖链表。 3 。3 2 横块依赖图豹磷究 模块铰羧关系可以嚣成模块铱羧图。这是个有趣密,终点为程序中已定 义的各模块,模块a 对模块b 存在定义时依赖戏调用时依赖时,结点a 到结点 b 粼存在一条有崮边。模块蔹赣錾可以薅两个数缀分瑙存糖数据元豢( 装点) 的信息和数据元索之间的关系( 边) 的信息,县体的结构表示包括络点数组、 邻缕矩簿( 郅逮戆二维数组) 秘萤熬当蓊缍点数。在建立该鞠辩,蓠先进孬拐 始化,对

温馨提示

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

评论

0/150

提交评论