您好,欢迎来到年旅网。
搜索
您的当前位置:首页基于路径覆盖的测试用例生成算法研究

基于路径覆盖的测试用例生成算法研究

来源:年旅网
河海大学硕士学位论文

基于路径覆盖的测试用例生成算法研究

姓名:李煜申请学位级别:硕士专业:计算机软件与理论指导教师:陈金水

20080601

河海大学硕上论文摘要摘要随着计算机技术的不断发展,计算机软件占据着重要的地位。软件危机的出现,让更多计算机T作者意识到保证软件质量的重要性。软件测试是保证软件质量的唯一有效的方法,而测试用例的生成又是软件测试的关键。测试用例设计的好坏直接影响软件测试的有效性。本文探讨一种白盒测试中测试用例自动生成的搜索算法,旨在为软件测试提供完整的测试.}fj例。路径覆盖是白盒测试中覆盖率最高的一种覆盖方法,结构化测试数据一般都是通过路径覆盖的方式来生成。根据不同的路径,可以生成覆盖不同路径的测试数据,所有路径的测试数据就组成了程序完整的测试用例。在研究测试数据生成的搜索算法时,本文在原有搜索算法只针对一维谓词的基础上,增加了对复合谓词处理的方法,提出了针对复合谓词的分组搜索算法。在测试数据搜索过程中,本文还引入了程序切片技术,这是一种分析和理解程序的技术,可抽取有用的程序片段,具有简化程序代码的特点。本文详细介绍了切片技术的发展、切片的分类、切片准则、切片算法思想,重点介绍了基于前向分析的动态切片算法。最后,本文提出了一种测试用例生成的系统框架,详细说明了该系统的流程,以及各个模块预期实现的功能,并给fn了具体的算法思想。最后通过实例,验证了系统框架的可行性。关键词:软件测试、测试数据、测试用例、路径覆盖、切片技术、复合谓词、分支函数。河海人学硕十论文摘要AbstractWiththedeVelopmentofcomputertechnology,computerso仟wareplaysmakesmorecomputerwOrkersrealizeanimpOnantroIe.Theeme唱ence0fsORwarecrisistheimportanceofSofh^,arequality雏surance.SoRwaretestingistheonlyef『ectiVewaytoTestcaSeensuresomVarequality.ongenerationisthekeyofsofhVaretesting.TestofsoRWaretesting.ThispapercaSedesigninghasadirectimpactthedataefrectiVenessdiscussesOnesearchingalgorithmOftestgenerationinthewhiteboxtesting.ThismethodwiIlimproVethee衢ciencyofPathcoVerageisoneso胁areteSting.ofthehighestcoVeragemethodsinthewhiteboxtesting,andgenerally,thestructuredtestdataisgeneratedbythewayofpathcoVerage.Throughd诩’erentpath,itgeneratedia’erent铲oupsofteStdatawhichconstitutethepro伊am’sintegratedtestcaSe.canc锄coVeragedifrerentpath,allthe伊oupsoftestdataWh订ereachingthesearchingalgorithmofteStdatageneration,basedontheoriginalsearchingalgorithmisonlyfortheone-dimensiOnalpredicate,thisthecompoundpredicate,andputsfonVardap印eraddsamethodtosolVegroupedsearchingalgorithmfortheprogmmwhichaincludescompoundpredicate.Duringtheprocessofsearchingtestdata,thisarticleintroducespro黟amslicingtechnology.ThistechnOlogyalsocancanhelpusanalyzeandunderstandprogram,andcode.Thispaperintroducestheabstractuse如lprocedure,soitcansimplifypro黟amdeVelopmentoftheslicingtechnology,theclaSsificationofslicing,theslicinggu{delines,slicingalgorithm,andputstheimponanceonthedynamicslicingalgorithmbaLsedaonfornleranalysis.Atlast,thisanicleputsfonVardSystemfhmework,describesthissystem’sprocessesandaeachmodule’sexpectedfunctionindetail,andgiVesVerifiedthefeasibilityofthissyStemframework.specificalgorithm.Throu曲anexample,itKeywords:somVarepredict,branchfunctiOn.testing,testda氓testcaLse,pathcoverage,slicingtechnology,compound11学位论文独创性声明:本人所呈交的学位论文是我个人在导师指导下进行的研究工作及取得的研究成果。尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果。如不实,本人负全部责任。论文作者(签名):(注:手写亲笔签名)釜丝量沙矿年/月f名日学位论文使用授权说明河海大学、中国科学技术信息研究所、国家图书馆、中国学术期刊(光盘版)电子杂志社有权保留本人所送交学位论文的复印件或电子文档,可以采用影印、缩印或其他复制手段保存论文。本人电子文档的内容和纸质论文的内容相一致。除在保密期内的保密论文外,允许论文被查阅和借阅。论文全部或部分内容的公布(包括刊登)授权河海大学研究生院办理。论文作者(签名):(注:手写亲笔签名)p8年乡月rZ日河海大学硕十论文第一章绪论第一章绪论人类在不断创新,社会在不断进步,科技在不断发展,21世纪的人们越来越离不丌计算机,计算机技术已经深入到人类生活的方方面面。随着计算机技术的发展,作为计算机灵魂的软件发挥着举足轻重的作用。软件危机的出现,让更多的计算机工作者意识到软件质量保证的重要性。软件测试是保障软件质量的重要手段,也是软件工程的重要组成部分。对软件测试技术的研究与应用已成为人们日益关注的课题…-【引。软件测试的真正确立是在20世纪70年代,1972年首届软件测试正式会议上,Myers给出了测试的定义——“为发现程序错误而执行程序的过程"…。80年代,一些软件开发人员和测试人员一起制定了测试的各种标准,但由于这些标准过于庞大,在实际应用中无法全部实现,但它们确实为一些测试提供了非常宝贵的参考。直到90年代,软件测试以及各种测试工具逐渐盛行起来。在这段时间内,测试理论以及测试用例的选择一直是研究的热点。现在,测试理论逐渐趋于完善,但是软件测试用例生成仍是软件测试领域一个较为复杂的问题,方法和手段尚未成熟。1.1课题研究的背景和意义随着软件规模的不断扩大,软件设计的复杂程度不断提高,软件开发中出现错误或缺陷的概率越来越大。同时,由于人们对于软件质量的重视程度越来越高,就导致了测试在软件开发中的地位越来越重要。软件测试是目f;{『用来验证软件是否能够完成所期望的功能的唯一有效的方法。白盒测试和黑盒测试是软件测试中的两大方法15J,无论哪种方法都离不开测试用例的生成。测试用例设计的好坏直接影响到软件测试的成功与否,也影响了软件质量的保证。本文所讨论的测试用例生成方法是基于白盒测试的。白盒测试是针对程序内部逻辑的测试,要求对程序的结构特性做到一定的覆盖,是基于代码覆盖的一种测试。路径覆盖是白盒测试中覆盖率最高的一种覆盖方法,所以结构化测试数据一般都是通过路径覆盖的方式来生成。根据不同的路径,可以生成覆盖不同路径的测试数据,所有路径的测试数据就组成了程序完整的测试用例。20世纪70年代以来,有关结构测试用例自动生成的搜索寻优算法这一领域的研究就己展开。人们分别采用随机化、爬山法、遗传算法等方法实现测试数据生成【61。爬山法,也就是函数最小化方法,是一种传统的搜索算法,善于找到局部最优解。它使用迭代改进法,每次迭代从现时点的邻域选择一个新的点进行搜索。但由于在方向探测时,每次只针对一个变量,因此仅能解决一维谓词的情况。在路径谓词多样性的情况下,很难达到较高的搜索成功率。河海火学硕:E论文第~章绪论遗传算法作为一种基于自然选择原理和自然遗传机制的通用搜索算法,模拟自然界中的生命进化机制,在人工系统中实现特定目标的优化【7】。与其它算法的不同之处在于整个搜索空间随机采样,按一定的评估策略对每一样本评价,并采用特定的算子进行样本优化,直至产生最优解。从理论上来看,遗传算法在解决大空间、多峰、非线性、全局优化等高复杂度问题时可以显示独特的优势和高效性,但其面临一系列的实现问题,使得人们对遗传算法的实际应用效果并不乐观。本文将改进爬山算法只针对一维谓词的情况,分析了复合谓词这一情况,提出一种难度适中、效率较高的分组搜索算法16J。对于复合谓词中出现的多个变量,分析其内在联系,并将其分组搜索,这样可以减少搜索的次数,提高搜索效率。本文在运用分组搜索算法的同时,引入了程序切片技术。程序切片技术是一种软件调试、测试、理解和维护的技术,通过寻找程序内部的相关性来分解程序,从而达到快速错误定位的目的18J。在软件测试中,测试数据生成是至关重要的一步。将程序切片技术应用到软件测试数据生成中,重点关注程序中与指定路径上兴趣点相关的那部分语句,可以有效地提高基于路径的测试数据生成效率。1.2国内外的研究现状及发展动态本文讨论的测试用例生成是基于白盒测试而言,白盒测试是针对程序内部逻辑的测试。在多种逻辑覆盖方法中,本文选择覆盖率最高的路径覆盖方法,一方面是由于路径覆盖方法具有较好的覆盖性,在动态生成测试用例时,可以保证获得程序完整的执行路径;另一方面,本文是根据程序路径生成对应的测试用例,所以首先需要获得程序的执行路径,使用路径覆盖方法可以获得程序所有的有效执行路径。本文基于路径覆盖方法,并结合测试用例生成的搜索算法,研究了基于路径覆盖的测试用例生成的搜索算法。1.2.1测试用例生成方法黑盒测试和白盒测试是两类广泛使用的软件测试方法,任何一种方法都离不开测试用例的生成。所谓测试用例(TestCase),是指在测试中,为某个特殊目标而编写的一组测试数据、执行步骤以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。本文中提到的测试用例并不是完整的测试用例,其实只是测试数据部分。白盒测试中测试数据的生成主要是基于路径的,主要有以下几种方法19J:1.随机法:基本思想是对输入数据空间进行随机取样。这种方法实现起来容易,但是要生成基于给定路径的测试数据,就需要按照产生大量的测试数据运行被测程序,测试数据的效率非常低下。2.静态方法:基本思想是将路径上的所有语句采用符号执行方法转化成约束河海人学硕十论文第一章绪论系统,然后求解。基于符号执行方法来生成测试数据,克服了浮动测试中难以选取恰当的测试数据这一难点,但是,一旦程序中存在循环、过程调用、动态数组和指针处理时,符号执行实现起来就比较困难l101‘【121。3.动态方法:动态测试数据生成是目前应用最为广泛的一种测试数据生成方法。所谓动态,是指从输入空问随机选取一组数据作为初始输入,基于程序实际运行,不断调整输入,使得程序实际执行路径沿着指定路径不断逼近,直到与指定路径完全一致。在这种方法中,一般采用分析待测程序中的谓词,将其转化成分支函数,应用分支函数极小化的方法进行处理。其中最具代表的Korel【13】-【14】提出的方法,他采用的是任选一组输入数据,按步迸的方式运行程序,即一次前进一个分支谓词。若当前分支谓词的值不符合要求,就建立一个分支函数f。然后用函数极小化方法调整输入变量值。根据分支函数的定义,f值为负数(或0)就意味着当前分支谓词被满足。然后重复执行,逐步前进直到通过整条路径。由于采用步进方式,所以这种方法可以尽早发现不可行路径。不过这种方法一次只考虑一个分支函数和一个输入变量,因此需要进行大量的迭代,在时间上的代价会很大。程序插装是另一种主要的动态法,该方法通过插装程序强制程序以任意一组数据为输入来执行指定的路径,并用插装语句向测试数据生成器返回各变量和分支谓词的状态。对程序中的每个判断语句进行插装,使插装语句恰好插在判断语句之前。这种方法能生成整型、实型、离散类型的测试数据,并支持子程序和异常处理,能够用于黑盒测试。但是为了尽早发现不可行路径,该方法一次也只考虑一个分支谓词和一个输入变量,并且使用回溯技术,所以会造成大量的资源浪费。另外,当初始程序输入距离问题解太远时,即使对于线性路径约束,该方法也有可能无法找到解。4.试探方法:主要包括遗传算法和模拟退火算法【151-【17】。试探法的基本思想是从数据空间中选择输入数据,运行程序,根据运行结果,结合概率论的思想产生新的数据继续试探。其优点是不受搜索空问性条件的约束,对于一些传统方法难以处理的大空间、多峰、非线性、全局优化等复杂度较高的问题,该方法具有独特的优势和高效性。但是,这种方法对于线性路径约束是不完备的,不能保证总能找到解。本文所述的搜索算法就是在动态方法基础上,增加了对复合谓词的处理情况,并引入了路径覆盖和程序切片技术进行改进的一种测试数据生成方法。下面介绍一下路径覆盖方法和程序切片技术。1.2.2路径覆盖方法本文提出的是基于路径覆盖的测试用例生成的搜索算法,路径覆盖是白盒测河海人学硕-}:论文第一章绪论试中普遍应用的覆盖方法。除此之外,国内外很多学者提出了其它的覆盖方法,比如函数覆盖、指令块覆盖、DDR覆盖、MC/DC覆盖、LCSAJ覆盖、PPP覆盖等。比较各种覆盖方法的可自动化性、可维护性和完整性,如表卜l所示,可以看出,在所有的覆盖方法中,路径覆盖的完整性足最好的。表卜1各种覆盖方法的比较【18】覆盖方法语句覆盖判定覆盖条件覆盖判定条件覆盖路径覆盖IB覆盖DDR覆盖MC/DC覆盖ESTCA覆盖LCSAJ覆盖接口覆盖PPP覆盖Z路径覆盖自动化性好好较好较好差好好较好较差较好差较好较差维护性好好好好较差好好好较好较差好较好较差完整性差较差一般较好好差较差较好一般较好一般较差较好路径覆盖的方法就是指设计足够的测试用例,使得运行这些测试用例时,被测程序的每一条语句至少执行一次,这是最强的覆盖准则。但是当程序比较复杂,路径数目很大时,要手动地找到所有路径是非常困难的。为此,可以通过一定的算法寻找出所有的路径。如果程序中出现多个判定和多个循环,路径数目将会急剧增长,为了解决这个问题,有学者引入了Z路径覆盖【l9。。Z路径覆盖舍掉了路径覆盖的一些次要因素,对循环机制进行简化,极大地减少了路径的数量。循环的简化是指循环的次数,无论循环的形式及实际执行循环体次数多少,只考虑一次和零次两种情况【l引。通过路径覆盖方法得到程序的所有路径后,可以选定其中一条路径,运用搜索算法寻找符合该路径的测试数据。在搜索过程中,为了简化程序代码,提高执行速度,又引入了程序切片技术。1.2.3程序切片技术的起源与发展现状程序切片技术是本文引入的一种重要的技术,它是一种分析和理解程序的技术,通过对源程序中各个兴趣点计算其程序切片以便分析和理解程序。程序切片实际上是对程序进行分割和简化,依据程序切片准则,从被测程序中抽取出与兴趣点相关的那部分语句,忽略那些与兴趣点无关的语句。4河海大学硕卜论文第一章绪论程序切片的基本思想是由MarkWeiserl20J于1979年在他的博士论文中首先提出的,1981年他又在国际软件工程大会上报告了这一新发现,立即引起了当时计算机界不小的震动。当时weiser等人正在进行自动程序抽象的理论和实践研究,他们通过对源程序代码的分析以及对控制流图(CFG)的研究发现:程序的某一个输出只与源程序中部分语句和控制谓词有关,删除其他的语句和谓词并不影响该输出的结果。1984年,Weiser博士进一步形式地阐述了程序切片技术的基本思想,以及如何基于数据流方程计算程序切片的方法。此后,在他的基础上又有许多人提出了不同的程序切片的定义和用于切片的算法。1984年到1987年之间,Ottensteins【21J等人引入了基于程序依赖图(PDG)的图形可达性算法,利用这种算法可以计算程序过程内后向切片。随后,Horwitz,T.Reps和D.Binkley等人分别引入了基于系统依赖图(SDG)的前向切片概念及算法,以及过程问切片的概念和两阶段图形可达性算法。Korel【15】【16】【22J和Laski等人还引入了动态切片的概念和算法。从1994年开始,随着面向对象编程语言及设计方法的推广,针对面向对象的程序切片技术的研究也随之兴起。Canfora,Cimitile和Lucia在1998年提出在程序理解上采用条件切片技术,这种技术是通过增加一个条件扩展了传统的静态切片准则,实际上是一种附加了一定条件的动态切片。如今,程序切片技术经历了20多年的漫长发展,在理论和应用两个方面都取得了丰硕的成果,这些研究成果在计算机学科的很多方面发挥了重要的作用。总的来说,程序切片技术的发展经历了从静态到动态,从前向到后向,从单一过程到多个过程,从面向过程的程序到面向对象的程序,从非分布式到分布式的程序的发展过程123J【241。本文运用的动态切片技术是由Korel等人提出,主要思想是依据动态的数据流和控制流信息计算切片,每一次的计算工作量较小,这种技术更多地提供了程序的动态信息,多用于程序调试、测试方面。1.3本文的主要工作本文在测试用例生成的方法上,主要研究基于路径覆盖的测试用例生成的算法,后面章节中将分别介绍以下四个方面的内容:(1)分析源程序,根据程序流程图生成测试路径。(2)改进以往算法只针对一维谓词的情况,研究了基于复合谓词的分组搜索算法,并采用动态调整步长的计算方法。(3)在数据调整过程中,引入程序切片技术,在切片生成算法中引入控制依赖关系。(4)设计了由程序预处理模块、路径生成器、谓词分析器、数据调整模块组河海大学硕上论文第一章绪论成的测试用例生成框架。1.4本文的组织结构本文的组织结构如下:第一章绪论主要介绍了本课题的研究背景及发展现状;第二章测试用例生成的搜索算法研究首先介绍了测试路径生成的过程和算法,然后介绍了基于复合谓词的软件测试用例生成的分组搜索算法,并用几个实例讲解了搜索算法的实现步骤。第三章程序切片技术与动态切片算法介绍了程序切片技术,包括程序切片技术的发展、程序切片的分类、程序切片的准则,以及计算程序切片的算法。第四章设计与实现给出了整个系统实现的框架,包括对各个模块实现的具体步骤和算法,并对具体的实例运用该系统的思想进行测试用例的生成。第五章总结与展望对本文进行总结,说明了本文存在的不足以及今后继续改进的方法。1.5本章小结软件测试是保证软件质量的有效途径,测试用例的生成是软件测试的核心和关键。本章简单介绍了本课题的研究背景和国内外的发展现状,比较了测试数据生成的几种方法,有随机法、静态法、动态法和试探法,本文在动态方法的基础上提出了基于路径覆盖的分组搜索算法。为了提高测试用例生成的效率,本文还引入了动态切片的思想。6河海人学顾}论文第二章测试用例生成的搜索算法研究第二章测试用例生成的搜索算法研究白盒测试是一种常用的测试方法,基于代码进行测试,但并不是简单测试程序代码。一般需要根据不同的测试要求,结合不同的测试对象,使用适合的方法进行测试。测试用例的生成是软件测试的第一步,必须根据测试用例执行软件测试。第一章中已经介绍过有关测试用例生成的方法,本章主要研究测试用例生成的搜索算法。所谓搜索算法,就是在寻找测试用例的过程中,给定测试变量的初始值,按照一定的路径和分支函数的要求调整测试数据,直到搜索到合适的测试数据为止。搜索过程是基于给定执行路径的基础上,所有测试路径的生成又是测试用例生成的第一步。本章首先介绍测试路径的生成,然后介绍根据测试路径实现测试用例生成的搜索算法。2.1测试路径的生成测试路径的生成是测试用例生成的前提,对于同一个程序而言,根据不同的逻辑覆盖方法可以获得不同的程序路径。通过覆盖方法的介绍,可以知道路径覆盖是覆盖性最强的覆盖方法。在执行程序时,当程序有多条执行路径时,程序总会按照不同的输入数据,选择不同的执行路径。程序之所以会选择不同的路径,是因为在执行过程中,经常会遇到控制语句,根据控制语句中的分支谓词,可以确定在某个特定输入下程序的执行路径。所以,可以通过分析程序的结构,按照控制语句中的分支谓词来确定程序的不同执行路径。2.1.1路径覆盖方法白盒测试中常用的六种逻辑覆盖方法主要有语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。语句覆盖是最弱的覆盖测试,一般不能满足测试要求。下面通过实例,介绍一下根据不同的覆盖方法设计出不同的测试用例。为了下文的举例描述方便,以一段简单程序为例:intx,y,T:0ABif(x>=80&&y>=80)T=l:Elseif(x+y>=140&&(x>=90lIy>=90))T=2:C河海大学硕上论文第二章测试用例生成的搜索算法研究首先给出以上程序的流程图。可以将该程序看作是评定奖学金的算法,即两门课程均为80分以上,可以获得一等奖学金;如果两门课程总分140分以上,其中一门90分以上,可以获得二等奖学金;否则都以三等奖学会计算。图2—1程序流程图1.语句覆盖语句覆盖是最简单的结构覆盖要求,语句覆盖要求设计足够多的测试用例,使得程序中每条语句至少被执行一次。测试用例设计:Xl23905090Y905070路径OAE0BDEOBCE2.判定覆盖判定覆盖要求设计足够多的测试用例,使得程序中每个判定至少有一次为真值,有一次假值,即程序中的每个分支至少执行一次。8河海大学硕士论文第,二章测试用例生成的搜索算法研究测试用例设计:Xl23905090Y905070路径0AEOBDEOBCE3.条件覆盖条件覆盖要求判定中的每个条件获得各种可能的结果,即每个条件至少有一次真值,有一次假值。测试用例设计:Xl29040Y9050路径OAEOBDE4.判定/条件覆盖该方法使得判定中每个条件的所有结果至少出现一次,每个判定本身所有可能结果也至少出现一次。测试用例设计如下:X123490509070Y90507090路径0AE0BDE0BCE0BCE判定/条件覆盖满足判定条件覆盖准则和条件覆盖准则,弥补了二者的不足。5.组合覆盖组合覆盖要求设计足够多的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。测试用例设计:Xl23456790909070307050Y90703090907050路径0AEOBCEOBDEOBCEOBDEOBDE0BDE9河海人学硕十论文第二章测试用例生成的搜索算法研究组合覆盖准则满足判定覆盖、条件覆盖和判定/条件覆盖准则,但另一方面也增加了测试用例的数量。6.路径覆盖路径覆盖是指没计足够的测试用例,覆盖程序中所有可能的路径。测试用例设计:X123490509070Y90507090路径OAE0BDE0BCE0BCE在这个例子中,路径覆盖方法设计的测试用例和判定/条件覆盖方法设计的测试用例相同,但是判定/条件覆盖方法和路径覆盖方法未考虑条件的组合情况,测试用例可能不够全面,而组合覆盖虽然考虑了足够多的测试用例,但对测试用例的寻找比较复杂。事实上,并不存在一种十全十美的测试方法能够发现所有的软件故障,但相对来说,路径覆盖可以对程序进行比较全面的测试,无论从覆盖性上来说,还是从测试用例生成的简易程度上来说,路径覆盖都是一个比较合理的选择。所以,本文选择路径覆盖的方法生成测试用例。2.1.2测试路径生成的方法对于通过路径覆盖来生成测试用例的方法而言,测试路径的生成是本文探讨的第一个内容。首先对程序代码进行分析,生成对应的执行路径。然后根据不同的路径,生成覆盖不同路径的测试数据,所有路径的测试数据就组成了程序完整的测试用例。白盒测试一般从最基本的单元测试开始,所以本文探讨的问题也是基于最简单最基本的单元模块进行的测试。在传统的结构化编程语言中,要进行测试的单元一般是函数或子过程,而在类似C++这样的面向对象的语言中,要进行测试的基本单元是类或是类的方法。本文暂且不考虑类与类之间的继承和调用关系,只考虑简单的程序结构,一般可以分为顺序结构、循环结构和分支结构。其中,顺序结构是最简单的一种结构,无需任何处理;分支结构也很好处理,只要将不同的分支视为不同的路径即可。最复杂的当属循环结构,如果程序中出现上百次的循环次数,那么程序的复杂性不可估量。为此,本文采用一种Z路径覆盖的方法125J【261,实际是指对循环机制进行简化,了循环的次数。无论循环的形式和实际执行循环体的次数,只考虑循环体执行一次和零次两种情况。循lO河海大学硕士论文第二章测试用例生成的搜索算法研究环体不执行的情况实际上就是不满足循环条件,这样可以将循环结构转化为分支结构。通过对循环结构的化简,程序中只存在顺序和分支两种结构。由图2—2所示。图2.2程序结构图图中将程序语句分为基本语句块、分支语句块和控制语句。通过控制语句,可以按照不同的分支生成不同的路径,n个分支对应于n条路径。如果分支语句块中含有控制语句,需要将分支语句块逐级展开。如果程序中含有多条控制语句,那么程序的所有路径就是各级控制语句下分支语句块的笛卡尔积。例如图4—1河海大学硕十论文第二章测试用例生成的搜索算法研究中,分支语句块的笛卡尔乘积表示为(分支语句块1l,分支语句块12)×(分支语句块21,分支语句块22),由此可以得到四条程序路径:路径1:基本语句块1,控制语句1,分支语句块1l,基本语句块2,控制语句2,分支语句块21,基本语句块3;路径2:基本语句块l,控制语句l,分支语句块11,基本语句块2,控制语句2,分支语句块22,基本语句块3;路径3:基本语句块1,控制语句1,分支语句块12,基本语句块2,控制语句2,分支语句块21,基本语句块3;路径4:基本语句块l,控制语句l,分支语句块12,基本语句块2,控制语句2,分支语句块22,基本语句块3;如果分支语句块中嵌套控制语句,那么就需要对分支语句块进行路径展丌,进行递归处理。如图2—2中分支语句块21中含有控制语句,因此要对上述含有分支语句块21的路径进行拓展。由于分支语句块2l中含有控制语句3和分支语句块31及分支语句块32,所以可以用(控制语句3,分支语句块31)和(控制语句3,分支语句块32)替代分支语句块21。即上述路径1和路径3分别扩展为:路径卜l:基本语句块l,控制语句l,分支语句块11,基本语句块2,控制语句2,控制语句3,分支语句块31,基本语句块3;路径卜2:基本语句块l,控制语句1,分支语句块11,基本语句块2,控制语句2,控制语句3,分支语句块32,基本语句块3;路径3—1:基本语句块1,控制语句1,分支语句块12,基本语句块2,控制语句2,控制语句3,分支语句块31,基本语句块3;路径3—2:基本语句块1,控制语句1,分支语句块12,基本语句块2,控制语句2,控制语句3,分支语句块32,基本语句块3;加上原有的路径2和路径4,由原来的四条路径扩展为六条路径。按照这样的思路,可以获得程序的所有路径。2.1.3测试路径生成的算法根据上一节内容的介绍,可以设计一种测试路径生成的算法,从而自动获得程序的所有路径。在实际生成测试路径的时候,需要对程序语句标号,这样程序路径就可以用一组语句标号来表示。这项工作应该放在程序预处理器中实现,将在第五章中有所介绍。测试路径生成的算法思想【9】如下:将程序语句分为基本语句块、分支语句块和控制语句,根据程序结构图获得程序的基本路径。如果分支语句块中含有控制语句,需要将分支语句块逐级展开。通过控制语句,可以按照不同的分支生成不12河海大学硕士论文第二章测试用例生成的搜索算法研究同的路径,即n个分支对应于n条路径。如果程序中含有多条控制语句,那么程序的所有路径就是各级控制语句下分支语句块的笛卡尔积。算法描述如下:pathAnalyse(BasePath[],PB[]){For(EachBasePath){Flag=0:For//对每条路径进行分解//设置每条路径中控制语句的数量PBiin(EachBasePath)//对每条路径中每个分支语句块进行分析{If(PBiincludescontrolsentense)//判断分支语句块中是否含控制语句,//如果含有控制语句,需进一步分解{№wPB口=getNewPBi:Flag++://获取新的分支语句块))If(Flag>=1)//当路径上的分支语句块中含有一个以上的控制语句时,//说明路径可进一步分解,通过笛卡尔积计算出所有路径{BranchBlock[][]=getAllBranchBlock(NewPB[])://获取所有的分支语句块Dicar[]=getDicar(BranchBlock[][])://求出分支语句块的笛卡尔积BasePath[]=getNewPath(Dicar[])://根据笛卡尔积求出新的所有基本路径CB[]=getEverypathBranchBlock()://获取每条新路径对应的分支语句块BasePath[]=pathAnalyse(BasePath[],PB[])://采用递归方式对新路径扩展)ReturnBasePath口://返同程序的基本路径13河海大学硕士论文第二章测试用例生成的搜索算法研究}getAllPath(program){Loadfile(program):BasePath=CreatBasePath(program)://根据程序结构生成一条原始的基本路径PB=getControlBlock(program)://获得程序的分支语句块//装载需要分析的程序BasePath[]=pathAnalyse(BasePath,PB):2.2基于复合谓词的分组搜索算法20世纪70年代以来,有关结构测试用例自动生成的搜索寻优算法这一领域的研究就已展开。人们分别采用随机法、爬山法、遗传算法等方法实现测试数据生成。本文讨论的通过路径覆盖实现测试用例生成的搜索算法的思想是:根据路径覆盖的原则生成所有的测试路径,然后根据每条测试路径分别生成对应的测试数据,测试数据生成的过程是一个逐步搜索的过程。原有的爬山法利用函数最小化的方法,每次只针对一个变量进行搜索,善于找到局部最优解,但是搜索效率比较低。随着程序复杂性的不断提高,简单的一维谓词很难满足程序的需要,路径谓词越来越复杂多样,所以相应的搜索算法也需要不断改进。如果仍采用以前算法的思想,即对多个变量逐一搜索,这样将不能很好地处理复合谓词的情况,搜索效率也会大大降低。对于一个普通的程序,假设有N个输入变量,搜索方向分为正向和负向,如果采用逐一搜索的方法,最糟糕的情况下就需要进行2N次方向搜索。这样的方法最终当然也可以找到所需的数据,但是搜索效率非常低。那么如何提高搜索效率,能否对多个变量同时搜索就成了本文所需要探讨的问题之一。本节将原来基于简单谓词的分支函数定义扩展到基于复合谓词的分支函数定义,通过扩展的分支函数极小化方法实现测试数据的搜索算法。2.2.1分支函数的定义及扩展定义所谓简单谓词是指谓词中仅含单个关系运算符(<,≤,>,≥,=,≠之一)的谓词,而复合谓词是指两个或两个以上的简单谓词由布尔连接词(AND或OR)连接而成的谓词。分支函数的定义127J:假设谓词pr是简单关系表达式:E,opE:,其中E。,14河海大学硕十论文第二章测试用例生成的搜索算法研究E:为算术表达式,关系运算符op∈{<,≤,>,≥,=,≠)。表达式E.op可等价表示为F(1)(2)relE:0,其中运算符rel∈{<,≤,=),并且满足:当谓词pr为假时,F为正(或为零,若rel为<);当谓词pr为真时,F为负(或为零,若rel为=,≤);则F是输入变量的一个实值函数,称为分支函数。分支函数F,谓词pr和运算符rel的对应关系如下表所示:表2—1分支函数F,谓词pr和运算符rel的对应关系谓词prEl>E2分支函数FE2一E1E2一ElEI—E2El—E2运算符rel<El≥E2El<E2≤<E1≤E2EI=E2El≠E2≤abs(E,一E:)一abs(E。一E2)<分支函数的扩展定义:假设谓词pr是复合谓词,即pr中含有布尔连接词AND或(矛口)OR,复合谓词pr表示成:pr。boppr:boppr。…pr。,其中pr。、pr。、pr3…pr。为简单谓词,bop为布尔连接词,bop∈{AND,OR}。pr。、pr。、pr。…pr。可以根据上述的分支函数的定义来得到对应的分支函数f。、f2、f。…f。。那么,谓词pr中如果存在AND或OR连接词的问题就可以转化成如下的几种情况了:(1)如果只存在AND连接词,那么复合谓词pr对应的分支函数F=max(f。,f2,f。…f。);(max表示求最大值的函数)(2)如果只存在OR连接词,那么复合谓词pr对应的分支函数F=min(f。,f。,f。…f。);(min表示求最小值的函数)(3)如果AND和0R都存在,那么复合谓词pr就需要转换成相应的由max和min函数组成的分支函数。例如复合谓词pr由各分支函数表示为((f,AND(f。f:)ORf。),那么对应的分支函数F=min(maxf:),f。)。注:为了更好的区分复合谓词对应的分支函数和复合谓词中包含的分支函数,暂且称复合谓词中包含的各个简单谓词对应的分支函数为子分支函数。如上述的fI,f2,f3…f。。2.2.2扩展分支函数极小化方法分支函数是谓词的函数表现形式,可以通过分支函数的值来确定谓词的布尔河海人学硕上论文第二章测试用例生成的搜索算法研究性质。由上节中分支函数的定义可知,当谓词为假时,分支函数的值为正;当谓词为真时,分支函数的值为负。在执行某条选定的路径时,一旦出现与选定路径不一致的兴趣点,就应该判定该兴趣点处谓词的布尔性质。如果需要满足该处谓词,则使用分支函数极小化方法,通过使分支函数的值逐步减小直到为负数的方法来满足谓词为真的条件。从而根据分支函数值减小的方向调整函数中变量的值。反之,则向分支函数值增大的方向调整变量的值。所谓扩展的分支函数极小化方法就足针对复合谓词而言,通过扩展的分支函数定义来得到分支函数,并确定分支函数的值,同样如果要满足复合谓词为真的条件时,要使分支函数的值逐步减小直到为负数。当然复合谓词中含有多个子分支函数,这比简单谓词复杂很多。下一节,将介绍基于复合谓词的分组搜索算法,重点介绍如何根据复合谓词对应的分支函数调整测试数据的方法。2.2.3分组搜索算法对于每个复合谓词而言,通常会含有多个变量,假设有N个变量,那么如果逐一搜索变量,最糟糕的情况就需要进行2N次方向探索。如果同时对多个变量进行探测性搜索,那么在一定程度上势必会提高搜索效率。例如有这样一个问题:需要在坐标系的第一象限内寻找一个点,使得该点到原点的距离等于5。根据上述要求,可以列出对应的不等式条件:(x>O)&&(y>O)&&(x2+y2=25)。根据分支函数的定义,可以得到以下几个分支函数:F。=O—x,F:=0一y,F。=abs(x2+y2—25)。从直观上可以看出,F。函数和F。函数其实是一样的,只是变量不同而已,如果选定同样的初始值的话,x、y这两个变量的探索方向应该是一致的。这样的话,不需要对每个变量都进行一次正向探索和一次负向探索,只需要同时进行一次正向探索和一次负向探索。从上例中可以看到,如果可以把多个变量划分成若干个组群,那样可以大大地减少方向探索的次数。前面提到的遗传算法考虑了待测程序的所有输入变量,这样既增加了耗费,又使得有些搜索操作可能是无效的。事实证明,只有一部分输入变量对某个特定谓词的分支函数值有影响,文中暂且将这样的变量称为影响变量。通过分析,选取有价值的变量作为输入变量,这样不但可以减少搜索的复杂度,而且可以提高搜索的正确率。例如有这样一段简单的代码:inta,b,c,max:scanf(“%d%d%d’’,&a,&b,If&c):(a>=b)maX=a:F1se16河海人学硕士论文第二章测试用例生成的搜索算法研究max=b:If(max<=c)maX=C:printf(“三个数最大值为%d”,max);对于这段代码,有三个输入变量a、b、c,但是对于第一个谓词(a>=b)而言,真正有影响的变量只有a和b两个;而对于第二个谓词(max<=c)而言,真正有影响的变量是c。所以对于特定谓词的分支函数而言,只需要考虑对其有影响的输入变量即可。以上两个例子只是简单地阐述了论文所描述的问题,事实上,在实际运行的程序中并非如此简单,可能会碰到一些更复杂的复合谓词。所以需要给出一定的规则和方法来确定变量组合的划分以及确定影响变量。对于一个测试用例的搜索算法来说,首先需要一个初始测试数据,只有根据这个初始测试数据才能做出是否需要调整以及进行正向或负向搜索的判断。以往的爬山算法和遗传算法都是在定义域内随机选择测试用例,这样显然十分盲目。本文认为,可以通过分解谓词得到的子分支函数来得到部分变量的临界值,通过这个临界值搜索测试数据就显得容易许多。但也不是所有的变量都能通过分支函数计算出初始数值的,在这种条件下,可以采取随机选择的方式。其次,需要解决变量组合的划分以及确定影响变量的问题。由前面分析可以知道,不同的谓词对应的影响变量也不同,所以文中所说的变量组合也是针对一个谓词中出现的不同变量进行组合,而并不是程序中出现的所有变量。根据简单谓词的分支函数定义,对于复合谓词中出现的简单谓词,可以用表达式E,opE:来表示,op∈{<,≤,>,≥),那么对应的分支函数可以表示为F=E:一E。或F=E。一E:,如果该分支函数中仅含一个输入变量,可以用F=ax+m表示,(其中a为变量x前的系数,m为常数,a、m为实数,a≠O),根据a为正数或负数,可以将变量分为两个组。如果该分支函数中含有多个输入变量,可以用F=ax+by+…+m表示,(其中a、b为变量x、y前的系数,m为常数,可以含有多个变量,用…表示省略,a、b、m为实数,a≠O,b≠O),如果该分支函数中出现的变量没有单独出现过,也可以根据a、b的正负性来为变量分组,否则的话,根据仅含一个输入变量的情况分组,同时考虑变量前系数的正负性是否与前者一致,如果不一致应该单独考虑,如果一致可以根据前面的搜索方向进行进一步搜索。如果各分支函数中出现非线性函数,那么其中的变量可以单独考虑。例如有这样一个复合谓词(x>2)&&(y>5)&&(z<3)&&(x—z>5),根据分支函数的定义,可以得到以下几个子分支函数:F。=2一x,F:=5一y,F。=z一3,F。=5一x+z,经过变形可以得到如下形式:F。=一x+2,F:=一y+5,F。=z一3,F4=一x17河海人学硕上论文第’二章测试用例生成的搜索算法研究+z+5。根据上面的规则,变量x、y前面的系数都为负数,而变量z前面的系数为正,所以可以将x、y分为一组,z为另一组。对于分支函数R中出现的变量x、z,由于前面已经出现过,且J下负性与前者一致,所以根据前者来分组。如果复合谓词为(x>2)&&(y>5)&&(z<3)&&(x+z>5),分支函数经过变形表示为F,=一x+2,F:=一y+5,F。=z一3,F。=一x—z+5。其中R中变量z前的系数与F。中变量z前的系数不一致,此时应该对z单独考虑。否则的话,在搜索过程中,如果对x、z取相同的步长进行探索,{x=2,z=3},{x=3,z=2},{x=4,z=1),…那么永远也找不到合适的值。但我们也可以看到F4中变量x前的系数与F;中变量x前的系数一致,所以可以对x进行原方向探索,对z单独考虑。假设根据F。对y取值为6,根据F。,对z取值为2,那么根据复合谓词对应的分支函数定义,第一轮{x=3,y=6,z=2}计算得到F=max(一1,一l,一1,0)=O,第二轮只对x进行探索,设计测试数据为{x=4,y=6,z=2},计算得到F=max(一1,一l,一1,一1)=一1符合分支函数定义的对测试数据的要求,这样才能找到合适的测试数据。2.3搜索算法中值得考虑的细节原函数最小化方法在测试数据搜索阶段以固定步长进行搜索,在针对不同程序测试时,不容易掌握步长的大小,针对这一问题,本文将采用一种动态确定步长的方法。在测试用例生成的改进算法中依据冲突谓词的当次运行所得的分支函数值来动念确定步长,有效地减少了搜索代数,缩短搜索时间,提高了搜索效率。动态步长确定可以用如下公式表示№J:Step=k0+k术ValueValue为当前谓词的分支函数值;参数k由谓词表达式的系数及阶数等综合确定,本文中取变量前系数的倒数;kO为一微小修正量,当分支函数值为0,路径仍不匹配时,此修正量进行微小调整。例如有一分支函数F=3x+5;假设变量x的初始输入为6,则分支函数值F=23,取k=1/3,则Step=k0+(1/3)术23=k0+23/3;在输入为整数时,将kO设为1/3,使得Step=8;由于分支函数值为正,而函数极小化方法的要求是向函数值减小的方向搜索,所以应该进行负向搜索,设置新一轮变量的值为6—8=一2,由验证可知,此时F=3水(一2)+5=一l;符合分支函数定义,即谓词为真时,分支函数为负值。如果按照常规的设置步长的方法,将步长设为l的话,需要经过多次搜索才能找到一2这个值。采用动态设置步长的方法可以在一定程度上提高搜索算法的效率,选择适当的步长可以减少搜索的次数,但每次重新确定新的变量值时,都要重新执行一遍18河海人学硕士论文第一二章测试用例生成的搜索算法研究程序代码。如果能将程序代码简化,那么搜索的速度将更快。为此,本文还将引入程序切片技术,将对变量有影响的语句抽取出来,去掉无关的语句,减少代码量,以此简化代码,提高执行速度。2.4引入程序切片技术的必要性将程序切片技术运用到软件测试用例生成方法中,主要是为了提高测试用例生成的效率【281。在生成一组测试数据的过程中,选定某条执行路径,首先以初始值执行程序,以实际执行路径上某个不符合指定路径要求的分支点作为兴趣点,计算对应的动态程序切片。这样,当调整输入数据时,不再需要执行源程序,只需执行相应的程序切片即可。事实上,这个程序切片是源程序的一个子集,这样就减少了反复执行程序花费的时间,提高了测试数据生成的效率。程序切片有静态和动态之分,下一章内容将会详细介绍。本文选择动态切片,主要是因为动态切片更符合实际路径的代码需求,而静态切片不能很好的反应在某个输入变量下程序所选择的路径。动态切片包含了在某个特定输入下,所有可能影响兴趣点处某个兴趣变量的所有语句。它只考虑程序中的一条特定执行路径,这与路径覆盖方法能很好的结合起来。另一方面,动态程序切片保持了程序执行的动态行为,根据这些动态行为,确定相应分支函数的当前值,指导测试数据的调整方向。这样可以避免调整的盲目性,减少调整次数,也就提高了测试数据生成的效率。2.5本章小结本文讨论的测试用例生成的搜索算法的思想是:根据路径覆盖的原则生成所有的测试路径,然后根据每条测试路径分别生成对应的测试数据,测试数据生成的过程是一个逐步搜索的过程。随着程序复杂性的提高,原有搜索算法只针对一维谓词的情况已经无法满足程序需要。本章首先介绍了测试用例生成的前提,测试路径的生成,然后介绍了基于复合谓词的分组搜索算法。并通过具体的实例说明搜索算法执行的过程。19河海人学硕士论文第三章程序切片技术与动态切片算法第三章程序切片技术与动态切片算法程序切片技术是一种分析和理解程序的技术,通过对源程序中各个兴趣点计算其程序切片以便分析和理解程序。对程序切片技术的研究有着极其重要的理论和实际意义,极大地丰富了程序分析、程序理解、程序维护的理论知识,为软件工程的各个阶段提供理论和技术支持,保证软件开发过程正确进行下去。尤其在编码和测试阶段,程序切片技术的应用更加广泛,它在程序分析、理解、测试、调试、度量以及维护过程中都有着极其广泛的用途。本文为了提高搜索算法的效率,重点引入了程序切片技术。为了很好的描述程序切片技术在搜索算法中的应用,本章将详细地介绍程序切片的定义与分类、程序切片技术的发展、静态程序切片和动态程序切片的切片准则和相关算法等内容。3.1程序切片的定义及分类3.1.1程序切片的定义程序切片是按照一定的准则从源程序中移去零条或多条语句后构成的,这部分语句可能会直接或间接地影响程序中某一兴趣点处变量的值。程序切片的基本思想是由Markweiser于1979年在他的博士论文中首先提出的,他给出的程序切片的定义是:程序P的切片slice是P的一个可执行部分,对于某个兴趣点s处的变量v而言,这个可执行部分相对于程序P,在功能上是等效的。这是一种静态可执行切片【20】。S.Horwitz等人对程序切片定义做了进一步的推广,“一个程序切片是由程序中的一些语句和判定表达式组成的集合。这些语句和判定表达式可能会影响在程序中的某个位置s上所定义点或所使用的变量v的值”124J。这种程序切片可以是一个可执行的程序,但它也属于静态切片。Korel和Laski等人提出了动态切片的概念,认为动态切片是由在某个程序输入x下,程序P中直接影响或间接影响某个兴趣点s处的变量v的那部分语句构成。3.1.2程序切片的分类程序切片可以按照不同的范畴进行分类,可以分为静态切片和动态切片、前向切片和后向切片、过程内切片和过程间切片【27】。(1)静态切片和动态切片20河海大学硕士论文第三章程序切片技术与动态切片算法静态切片包含了所有可能影响兴趣变量的语句。主要利用静态分析程序源代码的方法,计算在所有可能输入值情况下,对某个兴趣点有影响的那部分语句。也就是说,静态切片考虑了程序所有可能的执行路径。动态切片包含了在某个特定输入下,所有可能影响兴趣点处某个兴趣变量的所有语句。它只考虑了程序中的一条特定执行路径。(2)前向切片和后向切片对于程序中第i条语句处的变量v而言,前向切片包含了所有可能受v影响的语句,而后向切片包含了所有可能影响v的语句。要计算前向切片实际上就是构造集合Sforward(V/n),该集合由程序P中所有受到变量V在n点值影响的语句和控制谓词构成。而计算后向切片的集合Sbackward(V/n),该集合由所有影响V在n点值的语句和控制谓词构成。(3)过程内切片和过程问切片过程内切片只考虑了一个过程内部的语句,当程序中存在过程调用,则不能衍生出有效信息,而过程间切片主要针对程序由多个过程组成的情况。在使用过程问切片时需要注意的问题是当一个过程在不同的地方被调用时,必须要考虑调用的上下文,以便在编译时能够正确模型化运行时的执行情况。3.2程序切片技术的应用程序切片技术在软件分析、理解、调试、测试、度量、软件质量保证、逆向工程等许多方面有着广泛的应用,本节简单介绍切片技术在程序调试、软件维护、回归测试、软件度量等方面的应用瞵J。(1)程序调试在软件调试过程中,定位程序中存在的错误是一项困难的工作,程序切片可以帮助程序员很容易地进行错误定位。若检测到程序点S上的某个变量V存在错误,我们可以把<S,V>作为切片准则来计算后向切片,即所有对变量V在S点的值有影响的语句集,这样引起错误的代码就限定在这个切片中,通常情况下,这会大大降低要分析的代码量。(2)软件维护软件维护是软件生命周期的重要组成部分,要求在对现有系统理解的基础上确保修改系统不会引发新的错误。分解切片捕获与程序中某个变量在所有计算位置的值相关的程序信息,将对程序的修改引起的影响控制在一定的范围内,而不会带来无法预料的后果。这种方法需要计算程序中某个变量在所有位置的切片,也需要计算所有变量的分解切片。变量v的分解切片是与变量v有关的关键节点切片的并集,其中,关键点是指输出变量v的节点和程序的出口节点。一个分解切片可以把程序分解为三个部分:部分、相关部分和补集部分。部分包含所有只被v的分解切片包含的语句。私有部分的语句可被删除河海大学硕士论文第三章程序切片技术‘j动态切片算法而不会影响其他部分。若对变量v的所有赋值都集中在私有部分,则变量v为可修改变量。可以在切片的任何位置中添加对可改变变量的赋值语句。相关部分包含所有既在v的分解切片中又在其它变量的分解切片中的语句。若至少有一个对变量v的赋值在公共部分,则变量v为不可修改变量。修改这种变量会引起其他部分的改变。补集部分包含所有不包含在v的分解切片中的语句。修改切片中的语句时,补充部分应该保持不变。(3)回归测试当软件系统修改后,为了保证系统的正确性以及修改后不会带来副作用,需要对其进行重新测试,这就是所谓的回归测试。回归测试不同于软件开发过程中的测试,因为已经存在部分测试用例,对于这些测试用例,我们可以全部重新测试一遍或者选择一部分进行测试。完全重新测试可能会消耗大量的资源,并且大部分情况下只有一小部分代码会受到修改的影响。因此,只需要对那些受影响的代码进行重新测试。对通过分解切片获得的补充部分就不需要进行重新测试。程序切片技术可以帮助我们获得那些受影响的代码,从而有助于选择测试用例,进一步分析需要测试的代码,简化测试过程,提高测试效率。(4)软件度量软件度量的两个重要指标就是内聚和耦合。其中内聚度指模块内部各成分之问的关联程序。模块的内聚度越高,越容易理解、修改和维护。为了度量模块的内聚度,L.M.Ott和J.J.Thuss提出了数据切片的概念,计算关于数据标记而不是语句的切片,其中数据标记是指变量和常量的定义和使用。关于数据标记v的数据切片包含:v的切片集合中的语句所包含的数据标记序列。若一个数据标记存在于多个数据切片中,则称这个标记为胶水标记。通过胶水标记可以及将不同的数据切片连接起来。若一个数据标记存在于所有数据切片中,则称这个标记为强力胶水标记。标记的粘性用来度量与一个标记连接的切片数目。强功能内聚度定于为“强力胶水标记的个数与切片中数据标记的总数的比值”;弱功能内聚度定义为“胶水标记的个数与切片中数据标记的总数的比值”。根据这些定义,可以比较直观的分析模块的内聚度【8J。3.3程序切片准则程序切片必须依据一定的切片准则进行计算。对同一程序而占,切片准则不同,对应的程序切片也随之不同。静态切片准则和动态切片准则是程序切片最常用的两种切片准则127。。静态切片准则:静态切片准则可以用一个二元组C=(V,s)来表示,其中V是程序P中变量集合的一个子集,s是程序P中的某个兴趣点,所谓兴趣点就是我们在程序P中关注的某条语句。给定这样一个静态切片准则C,我们就可以计算静态切片,得到的静态切片由可能影响s处V中变量的所有语句和谓词组成。河海大学硕上论文第三章程序切片技术与动态切片算法对于s处V中的变量来说,得到的切片应该与源程序具有相同的影响。动态切片准则:动态切片准则可以用一个三元组C=(x,s,V)来表示,其中x是程序P的一个输入,s是程序P中的某个兴趣点,V是程序P中变量的一个子集。给定动态切片准则C,动态切片由在输入为x时,程序中所有直接或间接影响兴趣点s处V中变量的语句和谓词组成。除此之外,还有迭代切片准则、条件切片准则、前向切片准则、分解切片准则、多点切片准则和广义切片准则等等。3.4计算程序切片的算法根据程序切片的不同分类,切片算法也有静态和动态之分。本节首先介绍与程序切片技术相关的图论知识,以便更好的理解后面介绍的切片算法。随后简单介绍几种常用的静态切片算法以及动态切片算法f2711291。3.4.1控制流图、程序依赖图和系统依赖图1.控锘0流图(Contr01F10wGraph,CFG)计算机程序设计语言一般都提供一些基本的控制结构用以表达程序中的控制流。比如顺序结构、分支结构和循环结构就是典型的程序结构。控制流图是程序分析领域中一个非常重要的概念,它将源程序用图的形式表示出来,在控制流图上可以方便的分析语句间的前趋关系和后继关系、支配节点以及程序执行路径等问题。有了这些概念就可以进一步分析语句问的控制依赖和数据依赖关系。定义3.1控制流图:一个控制流图G是一个有向图,该有向图的节点是一个具有唯一入口和唯一出口的基本模块。如果控制可以直接从基本模块A流向基本模块B,则从节点A到节点B有一条有向边。一个程序P的控制流图可以用四元组G=(N,E,Entry,Exit)表示。其中,N是节点的集合,表示程序中的基本模块;E是边的集合,每条边是一个有序节点对<n;,n。>,它表示从n;到n,可能存在的控制转移;Entry和Exit分别表示程序P的入口和出口节点。如下所示为一个程序P和P的CFG:河海大学硕l:论文第三章程序切片技术与动态切片算法图3一l程序片断P图3—2程序P的CFG2.程序依赖图(Progr锄DependenceGraph,程序依赖图是由一个控制流图(Contr01赖图(ControlGraph,DependenceFlowPDG)Graph,CFG)、一个控制依DependenceGraph,CDG)和一个数据依赖图(DataDDG)组成。其中,控制流图描述了一个程序中的控制流;控制依赖图包含了程序中的控制依赖关系;数据依赖图是一个程序中语句之间所有数据依赖的集合。定义3.2控制依赖图:控制依赖图是一个有向图(N,C),其中节点集N是程序中所有语句对应的节点集合;如果有语句sl直接控制依赖于s2,也就是有CD(s1,s2),则把边s1一>s2加入到边集C中。定义3.3数据依赖图:数据依赖图也是一个有向图(N,D),其中节点集N是程序中所有语句对应的节点集合;如果有语句s1数据依赖于s2,即有DD(s1,s2),则把边sl一>s2加入到边集D中【30J。3.系统依赖图在结构化程序中,程序依赖图一般包含过程依赖图(ProcedureGraph,PrDG)和系统依赖图(SystemDependenceDependenceGraph,SDG)。系统依赖图是过程依赖图的一种扩充。系统依赖图所描述的程序具有以下特征:它由主过程和一些辅助过程构成;过程由return结束而不是由end结束,return语句不包含一个变量列表;参数传递是value—result方式的,也就是说形参的变化会导致实参的改变。系统依赖图包括了系统中各个过程的过程依赖图,另外还包括一些附加的边。这些附加的边包括表示从调用点到被调用过程的直接依赖边和表示调用引起的可达依赖的边。24河海人学硕士论文第三章程序切片技术与动态切片算法3.4.2静态切片的算法weiser首先提出了程序切片的概念,他所定义的程序切片实际上是一种静态切片,之后,人们对静态程序切片的方法进行了大量的研究,常用的静态切片算法主要有以下几种:(1)Weiser提出的基于数据流方程的切片计算方法weiser是通过解数据流和控制流方程来计算程序切片的。首先,建立待测程序的控制流图(CFG),从其CFG中产生相应的数据流和控制流方程。他使用一种迭代过程计算CFG中每个结点相关的变量的集合。Weiser描述了一种用来计算最少语句切片近似值的迭代算法。这种算法使用两种不同的迭代层次:跟踪可传递的数据依赖层和跟踪控制依赖层。后者把跟踪到的新的控制谓词控制的语句包含到某个控制谓词的切片中。对这样的新谓词,重复跟踪可传递的数据依赖层,直到把该谓词依赖的所有语句都包含进来为止。(2)基于信息流关系的算法这主要是由Bergeretti和Carre提出,他们计算切片的方法是:首先定义一些信息流关系,然后利用这些信息流关系来计算切片。(3)基于依赖图的图形可达性算法K.J.Ottenstein和L.M.Ottenstein于1984年提出切片准则(v,s),其中s为程序P中的一个兴趣点,v是在s处定义或使用的变量,依据此切片准则,在程序依赖图(PDG)上使用图形可达性算法来计算切片【2¨。这种方法的具体计算步骤是:先查找节点s处变量v的所有可到达定义节点,然后以这些节点为起点遍历程序依赖图,遍历过程中所有访问到的节点就构成了所需的静态程序切片。1990年,Horwitz,Reps和Binkley等人使用依赖图来计算切片,他们丌发了一种过程问的程序表示——系统依赖图(SDG),并实现了一个基于系统依赖图的两阶段图形可达性切片算法。在这类基于图形可达性的算法中,一般是指程序依赖图和系统依赖图可达。3.4.3动态切片的算法相对于静态程序切片技术而言,动态程序切片技术起步较晚,研究的时间比较短,但由于其动态性、灵活性受到了广泛的应用。一般来说,动态程序切片算法可以分为两类:基于后向分析的算法和基于前向分析的算法。基于后向分析的切片算法基本思想足:首先在某一输入下执行源程序并记录其执行轨迹,再回溯该执行轨迹,分析该执行轨迹上变量的动态依赖关系,最后河海大学硕士论文第三章程序切片技术jj动态切片算法通过这些动态依赖关系,计算出关于兴趣点处兴趣变量的动态切片。这种算法需要存储程序的执行轨迹以及其中的动态依赖关系,占用的空间比较大。Korel和Yalamanchili提出一种动态程序切片前向算法,他们提出了可移动块的概念,认为程序可以看成是由若干个可移动块组成。通过从源程序中删除可移动块来构造动态程序切片。程序执行期间,执行到每个块的出口处,算法确定这个被执行的块是否应该包含在相应的动态切片中。常用的动态算法主要有3种127J:(1)Agrawal和Horgan等人提出的基于动态依赖图的切片算法【3lJ对于动态程序切片而言,我们可以通过执行原程序并记录其执行历史,构建原程序的动态依赖图,在程序依赖图上使用图形可达性获得程序切片。但是,构建动态依赖图时,语句的不同出现可能会受不同语句的影响,因此在动态依赖图中,语句的不同出现要用不同的节点来表示,这样空间开销较大,这在一定程度上了该方法的使用。(2)Korel和Yalamanch订i提出的基于可移动块的切片前向计算方澍32J在这种算法中,程序可以看成由若干个基本块组成,当程序执行到一个基本块的出口时,算法确定是否应将该基本块包括进相应的动态切片中。这种算法无需存储动态依赖图,空间开销小,但对包含循环的程序来说,该算法可能会产生不确切的结果。(3)Gyimothy提出的基于程序D/u表达式计算动念切片的方浏圳利用程序D/U表达式,计算某条语句执行时影响其变量定义的所有语句,进而求出动态切片。一个程序D/U表达式记录了一条语句中变量的定义和引用情况。使用D/U表达式,可将程序的控制依赖和数据依赖同等看待,从而不需要使用动态依赖图,这样就可以计算出与使用动态依赖图同样的动态切片来,其空间开销较小134J3.5l”J。动态切片算法的实现本文采用的动态切片算法主要是参考文献【27】中提出的基于前向分析的动态切片算法。在本文提出的算法中,引入控制依赖关系来表示程序中谓词的覆盖范围,通过控制依赖关系的层层传递,可以清晰地表示出源程序的结构,这与文献【27】提出的支配关系有异曲同工之妙。但在计算算法的过程中,分析问题的角度有所不同,本文的算法比文献提出的算法更为简洁。计算程序切片必须依照一定的切片准则,前面介绍过静态切片准则和动态切片准则,下面再给出一个动态切片表达式的定义、变量被定义和变量被使用的定义以及控制依赖关系的定义。定义3.4动态切片准则:动态切片准则用~个三元组(x,s“,v)表示,26河海人学硕士论文第二章程序切Jl技术1j动态切片算法其中x表示程序的输入,s表示程序中的某条语句,s“表示程序在第k步执行语句s,v表示程序的变量,v可以是单个变量也可以是变量集合的子集。定义3.5动态切片表达式:给定动态切片准则C=(x,s。,v),S1ice(k,v)是兴趣点s。处变量v的动态程序切片。S1ice(v)表示在当前执行位置处变量v的动态程序切片,即在当前执行位置处影响变量v的语句。其中s“表示程序在第k步执行语句s,对于一条特定的程序路径而言,k是一组从1开始的有序数列。定义3.6变量被定义:如果变量v的值在n处被修改,则称变量v在n处被定义,以Def(n)表示n处定义变量的集合。定义3.7变量被引用:如果变量v的值在n处被使用,则称变量v在n处被引用,以Use(n)表示n处引用变量的集合。定义3.8控制依赖关系:设s。,s:是程序P中的两条语句或语句块,s。,s。∈N,如果语句s。的执行结果直接决定语句s:的执行与否,则称语句s:控制依赖于语句s。,或称语句s,控制语句s。,记做s:=BeContr01edBy(s,)或s,=Control(s2)。引入控制依赖关系,一是为了:当程序中存在谓词嵌套时,每个谓词的权力范围不同,控制依赖关系确定了每条语句的直接控制依赖语句,从而间接地确定程序的结构;二是为了:代替控制依赖图,由于程序依赖图的存储空间开销较大,使用控制依赖关系代替控制依赖图,使用变量被定义和被引用的关系来代替数据依赖图,这样可以完整地表示程序依赖图。控制依赖关系可以在程序预处理阶段给出,在计算程序执行路径时,根据程序流程图得到执行路径,同时也可以得到控制依赖关系。3.5.1算法思想本文引入控制依赖关系来表示程序中谓词的覆盖范围,对某个变量而言,如果当前执行语句与该变量没有任何依赖关系,且与兴趣点处的语句没有控制依赖关系,则删除该条语句,否则就加入程序切片中。计算程序切片,首先要构造相应的切片准则C=(x,s。,v),算法将按照这个切片准则,以某个节点s。为兴趣点,构造各个变量对应的程序切片。在计算程序切片过程中,首先分析源程序,获得源程序中的控制语句以及存在的控制依赖关系,然后根据语句s是否为控制语句分别讨论如何计算程序切片o(1)s为控制语句:在这种情况下,如果控制语句中的谓词条件被满足,s必定属于该处的程序切片,将语句s加入程序切片的同时,还要将s中出现的变量在执行s语句前的程序切片加入其中。如果控制语句中的谓词条件不被满足,河海人学硕L.论文第三章程序切片技术与动态切片算法对于该处的切片来说应该包含语句s以及s中出现的变量在执行s语句前的程序切片,而对于下一步执行的语句来说需要重置成执行s语句前的切片状态,在算法中用slice(v)表示当前切片的状态或为表示为计算下一个程序切片所保留的切片状态,而用slice(k,v)表示第k步对应的兴趣点的程序切片。(2)s为简单语句:在这种情况下首先考虑变量v是否在该处定义,如果被定义,即v的值在s处被改变,那么s属于变量v的切片;否则的话还要考虑s是否受控制依赖,如果最近被执行的一条控制语句恰好是s的控制语句且执行s后变量v未被修改,那么可以将此时的切片重置为控制语句执行前的程序切片,否则就不改变当前程序切片的状态。3.5.2算法过程输入:程序P以及相关的控制依赖关系、切片准则C=(x,sq,V);输出:在执行位置q处变量集合V中各个变量v的动态切片。初始化:Fora11v∈Vslice(v)=slice(k,v)=①:执行过程:For(1≤k≤q)计算每一步对应的程序切片:If(s是控制语句)If(s中的谓词不被满足){slice(v)=slice(k,v)://记录上步中的程序切片;slice(k,V)=slice(k,V)u{s)uUv∈wP(s)slice(k,V);//记录第k步时的程序切片;)E1se//s中的谓词被满足slice(V)=slice(k,V)=slice(k,V)u{s)uElseUv∈艄P(s)slice(k,V);if(s为简单语句)If(v∈Def(s))slice(v)=slice(k,v)=slice(v)u{s}oElseif(最近执行的一条控制语句==control(s)且执行contr01(s)后变量v未被修改)slice(v)=slice(k,v)=执行contr01(s)前的程序切片;E】se河海大学硕一I:论文第三章程序切片技术与动态切片算法slice(v)=slice(k,v)=slice(v):算法终止:k=q。该算法与文献【27】中提出的算法相比,层次更清楚,代码更简单,利用此算法得出的程序切片与利用文献【27】中算法得出的程序切片基本一致。3.6动态程序切片生成实例根据上节中给出的计算程序切片的算法,可以计算出各个变量在实际运行过程中对应于各个兴趣点处的程序切片。实例如下:int12m,n,i,a[5]:scanf(“%d%d…%d”,&m,&n,&a[1],&a[2],…&a[5]):max=a[1]:min=a[1]:sum=a[1]:i=m+1:3456while(i<=n){78if(max<a[i])max=a[i]:if(min>a[i])min=a[i]:sum=sum+a[i]:i=i+m:9lO1112}13printf(“%d%d%d\n’’,max,min,sum):任选一程序输入x为:m=2,n=5,a={1,2,3,4,5),在此输入下,程序的实际执行路径为:Path=<11,22,33,44,55,66,77,88,99,11m,1211,6他,713,814,915,1116,1217,618,13悖>路径中的s“表示第k步时执行第s条语句,记录了整条路径的执行过程。构造切片准则C=(x,1319,v),v是程序中变量集合{min,max,sum,i),计算出的切片结果如下表所示:29河海大学硕士论义第三章程序切片技术与动态切片算法表3—1程序关于兴趣点的动态切片S1ice(max)初始11223344556677①中l,l。l,1,22225,5,66,7①①①l,1,l,1,1,7881,2,5,6,7,8991,2,3,5,6,7,11108,97,1,S1ice(min)①①①3333,2,5,3,65,6,①Slice(sum)①①中①①l,5,4,65,6,1,l,Slice(i)1。4l。1,44,55,66,7l,2,1,2,l,2,72,5,l,3,5,6l,4,5,6l,5,6l,3,5,6,91,93,4,5,6,1,3,5,6,91,2,5,6,83,5,6l,4,5,6,lll,5,612¨l,2,5,6,7,81,3,5,6l,4,5,6,1l1,5,6,1261l,2,5,6,7,8,127,l,3,5,6,12l,4,5,6,11,121,5,6,127ml,2,5,6,8,121,7,1,2,8,3,3,125,5,6,l,2,4,5,6,l,8,l,2,125,5,6,7,7,8,11,126,12l,4,5,6,11,12814l,2,5,6,7,8,126,129惦l,2,3,5,6,7,8,9,12l,12l,3,5,6,9,1,3,4,5,6,l,121,3,5,6,9,9,11,123,5,6,121,4,5,6,1l,121116l,2,5,6,7,8,125,6,121217l,2,5,6,7,8,12l,3,5,6,121,4,5,6,ll,12l,5,6,126懈l,2,5,6,7,8,127,1,3,5,6,12l,4,5,6,1l,12l,5,6,1213191,2,5,6,8,121,3,5,6,12l,4,5,6,1l,12l,5,6,12河海大学硕士论文第三章程序切片技术与动态切JI算法注:(1)与参考文献【27】相比,本文中改正了部分程序代码,生成的程序切片也有所改进。如果按照文献【27】中的算法,在7门处生成关于变量min的切片为{l,3,5,6,7,12),这比本文中的算法得到的切片多一条语句7。(2)由于本程序中的语句l是读于输入数据的语句,所以应该将该语句加入所有的程序切片中。由表3一l可以直观地看出,无论在哪一个兴趣点执行的切片都要比执行原程序简单的多。算法验证:假设输入m=2,n=5,a={1,2,3,4,5},求程序执行后sum的值。分析:由于程序只需要求sum一个变量的值,如果执行所有源程序,显然不是一种最好的方法。程序切片就是一种将程序简化的有效方法。步骤:根据表3—1中给出的动态切片可以看到在兴趣点1319处得到的关于变量sum的切片为{1,4,5,6,11,12},由此得到的简单程序片断如下:1456scanf(“%d%d…%d”,&m,&n,&a[1],&a[2],…&a[5]):sum=a[1]:i=m+l:while(i<=n){1lsum=sum+a[i]:i=i+m:12}执行该程序切片,通过计算可以得到sum=9。比较:执行源程序的结果为:max=5,min=l,sum=9。很显然,根据程序切片计算得出的结果和执行源程序的结果一致。优点:使用程序切片简化了源程序,减少了程序代码量,对于一个复杂的程序来说,可以明显地节约运行时间。在后面的应用中,对于某一个节点的切片来说,在调整数据的时候会多次使用到,所以节约的运行时间与调整数据的次数成正比,这样也就更能体现出切片技术的优势。当然,如果题目要求计算三个变量的值,那样三次执行程序切片的代价肯定要比执行一遍源程序的代价大得多。由于在后面的运用中,一般在每次调用程序切片时,只涉及到单个变量,而不可能是所有变量,这样的话,选用程序切片技术就会起到非常积极有效的作用。河海大学硕:卜论文第三章程序切片技术与动态切片算法3.7本章小结程序切片技术作为一种分析和理解程序的技术,广泛应用于软件工程的各个周期,尤其是回归测试和程序调试方面。本文尝试将动态程序切片技术应用到测试用例生成的算法上,提高搜索算法的效率。本章介绍了程序切片的定义、分类、切片准则以及动态切片算法。通过一个简单的实例,根据给定的输入和切片准则,生成程序中各变量在兴趣点处的动态切片,并用实例验证切片的正确性。32河海人学硕.1:论文第四章设计与实现第四章设计与实现目前市场上已经出现不少自动化单元测试用具,比如C++Test,VisulUnit2.O。C++Test是专门针对C/C++的单元级测试用具,可以自动测试C/C++类、函数或部件,能够自动测试代码构造、测试代码的功能性和维护代码的完整性。VisulUnit2.0是一款图形化自动单元测试工具,可以自动生成测试代码、用例框架以及边界测试用例等等。但是,一般来说自动化测试工具对于测试用例的生成还有待进一步提高。本文围绕测试用例生成这个中心,依次介绍了测试路径的生成、基于复合谓词的分组搜索算法,以及搜索算法中引入的切片技术,看似形散,实则神不散。三方面的内容都对测试用例生成的搜索算法起到了积极有效的作用,改进了原有的搜索算法,提高了算法的效率。为此,本文参阅相关文献[37卜[40】中关于测试用例自动生成的一些介绍,将前面三章介绍的内容串接起来,设计出一个通过路径覆盖方法实现测试用例生成的系统框架,详细介绍了每个模块的功能以及整个系统的流程。相比用手工的方式生成测试用例而言,如果能设计出一个自动地生成软件测试用例的系统,那对软件测试人员来说将是一大幸事,可以帮助测试人员摆脱复杂乏味费事的寻找测试用例的工作。要设计出完整的测试用例生成的系统,那么需要将测试路径的生成、谓词的分析、初始数据的输入、程序切片的生成等部分内容进行程序化。但事实上,谓词分析这一部分属于对语义的分析,并非是本论文的研究重点。所以,在本论文中,给出一种测试用例生成的框架以及部分能实现的模块的算法,具体的实现有待进一步研究。4.1测试用例自动生成的框架本文在前面几章内容介绍的基础上,提出了一种由程序预处理模块、路径生成器、谓词分析器、切片生成模块、测试数据调整模块等部分组成的框架。由下图4—1所示:河海人学硕卜论文第四章设计与实现图4一l测试用例自动生成框架其中,程序预处理模块主要负责对源程序进行分析处理的功能,具体包括对程序语句的标识、记录输入变量、寻找控制语句等。路径生成器主要负责程序路径的生成,在第二章中已经给出简单的路径生成算法。通过路径生成器的处理,生成程序的所有路径,每条路径由各语句前的标识和执行步骤组成。谓词分析器主要负责程序控制语句中谓词或复合谓词的分析和处理。利用第三章中介绍的分支函数,将控制语句中的谓词或复合谓词转化成相应的分支函数,并对复合谓词中出现的变量进行分组分析,以便在调整测试数据的时候使用。另外,分析谓词分析器生成的分支函数,确定部分变量的初始输入,对于不能确定的变量,可以选择随机生成的方法。切片生成模块主要是针对动态程序切片的生成。将其放入数据调整模块中,在数据需要调整的时候执行切片生成模块。在数据调整模块中,根据选定的路径和输入数据的初始值执行源程序,当实际路径与给定路径不一致的时候,生成关于该兴趣点的动态程序切片,并按照基本复合谓词的分组搜索算法和动态确定步长的方法调整变量的值,再次执行动态程序切片,最终生成符合给定路径的测试数据。河海人学硕上论文第四章设计与实现算法的优越性:本文提出的测试用例自动生成框架集合了谓词分析器、切片生成器等概念,将切片技术适当的融入其中。该框架是本文提出的搜索算法的模块化表现形式,与以往的爬山算法相比,主要有两方面的优点:一是解决了复合谓词的问题,提出了分组搜索算法,提高了搜索效率;二是引入了切片技术,在重复搜索数据时,精简了代码量,加快了搜索时间。4.2测试用例自动生成的流程根据上一节中介绍的测试用例自动生成的框架,可以将框架转化为如下几步流程:l、将源程序输入程序预处理模块中,对源程序进行语句标识、记录输入变量、寻找控制语句等操作。2、将预处理过的程序分别装入路径生成器和谓词分析器中。在路径生成器中生成程序所有的路径,由各语句前的标识表示。在谓词分析器中,生成所有控制语句中简单谓词或复合谓词的分支函数,并将复合函数中的搜索方向一致的变量分为一组,以便在数据调整时使用。同时,生成输入变量的初始值。3、选定一条程序路径,用变量的初始值执行源程序,比较程序实际执行路径与给定路径,以两条路径出现不一致fj{f最近的分支点为兴趣点,以待下一步中生成动态程序切片。4、将上一步中兴趣点的信息输入切片生成模块中,生成动态的程序切片。5、根据第二步中得到的分支函数及变量搜索方向的信息,根据分支函数极小化的原则,选取适当的步长,调整输入变量的数据,在程序动态切片上执行(不必在源程序上执行,以此提高执行速度)。6、重复步骤5,反复调整输入数据,直到分支函数的当前值满足该路径的要求,即生成适合的测试数据。7、从路径生成器中选定其余路径,执行3—5的步骤,生成程序完整的测试用例。4.3设计与实现根据本章第一节中给出的系统框架结构,可以将系统分为程序预处理模块、路径生成模块、谓词分析模块、切片生成模块和数据调整模块。4.3.1程序预处理模块实现的思路河海大学硕十论文第四章设计与实现由于程序预处理模块设计不是本文讲述的重点,所以简单介绍一下设计的思路。该模块主要足对源程序进行预处理,从而获取源程序中的相关数据信息。具体实现的思路是:以文本模式按行读取源程序,并依次标记每行语句,即在每条语句前加上相应的行号;对每条语句的内容进行辨别,标记控制语句以及控制依赖关系;寻找程序的输入变量。简单程序过程如下:装入源程序:n=l:i=l:while(第n行语句不为空){read(第n行语句):if(碰到scanf等读入语句)将其中的输入变量记入到输入变量的数组Vin[]中:if(碰到if/wh“e等控制语句){在该语句前标识i:将行号i记入控制语句数组ctrols口中:i++:}if(碰剑分号结尾的语句){在该语句前标识i:i++:}n++:}预处理模块主要为下一步的路径生成和谓词分析提供必要的信息。路径生成模块的思想及主要算法在第二章中已经做出详细介绍。4.3.2谓词分析器的实现谓词分析器主要负责程序控制语句中谓词或复合谓词的分析和处理。利用第三章中介绍的分支函数,将控制语句中的谓词或复合谓词转化成相应的分支函数,并对复合谓词中出现的变量进行分组分析,以便在调整测试数据的时候使用。36河海人学硕士论文第四章设计与实现另外,分析谓词分析器生成的分支函数,确定部分变量的初始输入,对于不能确定的变量,可以选择随机生成的方法。算法步骤描述:PredicateAnalyse(program){CS=getContr01Sentence(program)://获取程序的控制语句Predicate[]=getPredicate(CS)://获取控制语句中的谓词(复合谓词)BF[]=PredicateToFunction(Predicte[])://将谓词转换成分支函数Var[]=getVariable(BF[]):SetInitialValue(Var[],BF[]):Groupi//获取分支函数中的变量//没置变量的初始值//对变量进行分组ng(Var[]):l4.3.3切片生成模块的实现切片生成模块主要负责动态程序切片的生成。首先,根据输入变量的初始值执行源程序,当实际路径与给定路径不一致的时候,生成关于该兴趣点的动态程序切片,调整变量的值,再次执行动态程序切片,最终生成符合给定路径的测试数据。图4—1中将切片生成模块放入测试数据调整模块中,因为切片生成模块是在数据需要调整时调用,如果输入变量的初始值就能满足程序路径,那么切片生成模块就不需要执行。动态程序切片生成的具体过程在第三章中已经详细给出,这罩就不重复叙述。4.3.4数据调整模块数据调整模块是整个测试用例生成的搜索算法的核心。数据调整实际上就是在搜索中寻找符合条件的测试数据。在第二章中,针对程序中出现的复合谓词给出了一种基于复合谓词的测试用例生成的分组搜索算法。结合程序切片模块,将数据调整模块实现的算法步骤描述如下:(1)执行谓词分析器中生成的输入变量的初始值,并寻找第一个与给定路径不一致的兴趣点:(2)(3)根据切片准则,生成该兴趣点处的动态程序切片;根据谓词分析器中的变量分组,对分组中变量数目最多的一组变量按各自的动态步长进行调整;用调整后的输入变量值执行该兴趣点的动念切片,如果还不符合37(4)河海大学硕上论文第叫章设计与实现分支函数,则继续调整数据,(一般来说,动态步长法能快速定位输入变量的值空间,所以如果需要再次凋整时,先对其它输入变量调整。)循环执行步骤(4),直到输入变量满足此处的分支谓词;(5)满足此处兴趣点后,继续执行程序,直到发现下一个与指定路径不一致的兴趣点,重复(2)、(3)、(4)步骤;如果到程序结束,都符合给定路径,则将该输入变量的数据作为一组测试数据保存下来,退出数据调整模块,继续生成下一组测试数据。4.3.5实例本节以学生管理系统中奖学金查询模块作为测试对象,根据上面提出的框架结构的流程来说明测试用例生成的方法和步骤。学生管理系统主要管理学生的学籍信息、课程信息、成绩信息,并提供课表查询、成绩查询、奖学金查询等查询功能。下面介绍的奖学会查询模块的主要功能是:在输入三门课程成绩时,如果三门总分高于或等于240,且最低分高于或等于80分,即可获得一等奖学金;如果三门总分高于或等于240,且最低分高于或等于75分,即可获得二等奖学金;如果三门总分高于或等于240,且最低分高于或等于70分,即可获得三等奖学金;如果有一门最高分达90分以上,且最低分不低于60分,则可以获得单项奖学金,如果有至少一门低于60分,则提示需要重修。程序流程图:38河海大学硕卜论文第四章设计与实现图4—2程序流程图程序代码如下:floatintl23a[3],max,min:T,i,sch01arship:scanf(“%d%d%d",&a[1],&a[2],&a[3]):max=a[1]:min=a[1]:39河海大学硕士论文第四章设计与实现45T=0:i=2:6while(i<=3){78if(max<a[i])max=a[i]:if(min>a[i])min=a[i]:i++:9101l}12131415if(a[1]+a[2]+a[3]>=240){if(min>=80){T=l:scholarship=1000:16printf(“恭喜你获得了一等奖学金!”):exit(O):)17181920Elseif(min>=75){T=2:scholarship=500:printf(“恭喜你获得了二等奖学金!”):exit(0):)21222324Elseif(min>=70){T=3:sch01arship:300:printf(“恭喜你获得了三等奖学金!”):exit(O):})25if(max>=90&&min>=60&&T==O){T=5:sch01arship=200:262728printf(“恭喜你获得了单项奖学金!”):)河海人学硕上论文第四章设计‘j实现293031E1seif(min<60){T=一1:printf(“你的成绩不理想,需要重修!”):)32elseprintf(“这次没有获得奖学金,继续努力”):(1)根据测试用例生成的流程进行分析第一步:将程序代码放入程序预处理器中进行分析;将程序语句进行编码(已标注在代码前),标记控制语句,寻找程序的输入变量等。将while、for、if等语句标记为控制语句,输入变量为a[1],a[2],a[3]。第二步:将预处理过的程序装入谓词生成器中,生成相应的分支函数(语句s处的分支函数用Fs表示):F6=i一3:F7=max—a[i]:F9=a[i卜min:F12=240一(a[1]+a[2]+a[3]):F13=80—min:F17=75一min:F21=70—min:F25=max((90—max),(60一min),abs(T一0)):F29=min一60:由于只有F12中含有输入变量,暂且将a[1],a[2],a[3]三个输入变量的初始值设为该分支函数的一个临界点,均为80。第三步:生成程序执行路径;第四步:选定一条执行路径,根据输入变量的初始值执行程序。(2)路径生成过程1、分析wh“e循环部分,本程序中循环执行两次,所以将循环结构转变成执行两遍的顺序结构。如图4—3所示:4l河海大学硕_J:论文第四章设汁与实现图4—3部分语句流图循环执行一遍的基本路径为{6,7,(8,空),9,(10,空),11);用笛卡儿积的方式可以将基本路径拓展成四条路径分别为:{6,7,8,9,10,11);{6,7,8,9,11);{6,7,9,10,ll};{6,7,9,儿);循环执行两遍,相当于对上面四条路径再做一次笛卡儿积,可以生成16条路径,分别为:{6,7,8,9,lO,11,6,7,8,9,10,11};{6,7,8,9,10,11,6,7,8,9,11};{6,7,8,9,10,11,6,7,9,10,11);{6,7,8,9,10,1l,6,7,9,1l};{6,7,8,9,11,6,7,8,9,10,11};{6,7,8,9,11,6,7,8,9,11);{6,7,8,9,11,6,7,9,10,1l}:{6,7,8,9,ll,6,7,9,11};{6,7,9,lO,11,6,7,8,9,10,11};{6,7,9,10,1l,6,7,8,9,1l};{6,7,9,10,11,6,7,9,lO,l1);{6,7,9,10,11,6,7,9,1l}:42河海大学硕士论文第四章设计0实现{6,7,9,11,6,7,8,9,10,11};{6,7,9,1l,6,7,8,9,11};{6,7,9,ll,6,7,9,10,n};{6,7,9,1l,6,7,9,1l};2、分析由if条件语句控制的分支结构,本程序中语句块12—24和语句块25—31分别为两个if控制语句块。前一个控制语句块下只有一个分支语句块,但是又嵌套下一级的控制语句块;后一个有两个分支语句块。用语句流图可以表示为:图4—4部分语句流图这是一个比较复杂的带嵌套的分支语句结构,得到第一次基本路径为:{12,(13,空),25,(26—28,29,32)},首先做第一次笛卡儿乘积,然后对其中的控制语句13、29利用递归算法展开,最后得到所有子路径。由于路径条数较多,选取其中一条典型的路径,用做后面的执行路径:{12,13,17,2l,25,26,27,28}。43河海人学硕士论文第pq幸设计与实现(3)执行过程选定一条完整的执行路径Pathl={11,22,33,44,55,66,77,88,99,1110,611,712,913,1014,1115,1216,1317,17‘8,2119,2520,2621,2722,2823)。执行过程如图4—5所示:图4—5执行过程不意图根据图4—5所示,用输入变量(80,80,80)执行程序,得到第一个兴趣点为71,构造此处关于变量max的程序切片{1,2,5,6,7),此处谓词分支函数F7=max—a[2],此时变量max=a[1]=80,为满足分支函数极小化原则,向分支函数减小的方向调整,所以调整a[2]为81,并执行程序切片。用调整后的输入变量(80,81,80)执行程序,得到第二个兴趣点913,构造此处关于变量min的程序切片(1,3,5,6,9,lO,11),此处的谓词分支函数F9=a[3卜min,此时变量min=a[1]=80,调整a[3]为79,并执行程序切片。继续用调整后的变量(80,81,79)执行程序,得到第三个兴趣点1718,构造此处关于变量min的程序切片{1,3,5,6,9,10,11,12,13,17),此处谓词分支函数F17=75一min,此时min=a[3],所以调整a[3]=74,调整过程中执行切片遇到语句12处的分支函数F12=240一(a[1]+a[2]+a[3]),为了满足该分支函数,同时调整a[1]和a[2],以步长为l调整3次后,a[1]=83,a[2]=84。用调整后的变量(83,84,74)执行程序,得到第四个兴趣点2l坩,此处的情况和上一步的情况类似,最后调整a[1]=86,a[2]=87,a[3]=69。继续执行源程序,遇到第五个兴趣点2520,此处复合谓词对应的分支函数F25=max((90一max),(60一min),abs(T一0)),由于(60一min)和abs(T一0)/J、于等于零,满足子分支函数定义,所以只需调整变量max的值。此时max=a[2]=87,为满足分支函数条件,调整a[2]为90。再次执行程序,可以发现能够顺利执行至程序结束。所以,得到对应于该路径的测试数据为(86,河海人学硕上论文第叫章设计‘j实现90,69)。补充说明:对于兴趣点2520处复合谓词对应的分支函数F25=max((90—max),(60一min),abs(T一0)),如果此时的max和min的值分别为70和50,那么需要对max和min同时搜索。前者的动态步长为90—70=20,后者的动态步长为60一50=10,所以可以一次调整为90和60。生成一组测试数据后,将测试数据保存,然后重新选择新的执行路径,依次生成所有的测试数据。(4)执行结果所谓的测试用例就是由测试数据、执行结果、预期结果组成的一系列信息。可以用如下的形式表示为:测试数据测试用例l:(86,90,69)执行结果获单项奖学金预期结果获单项奖学金(5)算法比较与原有爬山算法相比,论文中提到的测试用例生成方法不但引入了程序切片技术,还针对复合谓词的情况,提出了分组搜索算法。在数据调整过程中,无需执行源程序,只需要执行相应的程序切片即可。与参考文献[27]中提到的切片算法相比,本文在调整数据的时候,根据变量的搜索方向进行分组,并设定了动态步长的调整方法,减少了调整次数。例如在兴趣点2520处复合谓词对应的分支函数F25=max((90一max),(60一min),abs(T一0)),如果此时的max和min的值分别为70和50,采用参考文献[27]中的算法,那么需要对max和min两个变量分别搜索,如果采用步长为1,那么对于max变量需要调整20次,同样,对于min变量需要调整10次,这样一共需要调整30次。而本文中采用的算法同时对max和min进行探索,并采用动态步长的计算方法,一次就可以调整到合适的变量值。对于含有复杂的复合谓词的程序而言,采用复合谓词的分组搜索算法,大大改进了搜索效率。动态步长的引入,也减少了调整次数,从而获得了一种比较高效的测试用例生成算法。(6)结论通过实例可以证明使用本文提出的通过路径覆盖的搜索算法可以得到给定路径上的测试数据,依次执行所有的给定路径,便可以得到所有的测试数据。本文所提出的搜索算法在原有爬山算法的基础上,引入了复合谓词的解决方法以及程序切片技术,在调整数据的时候,仅执行相应的程序切片,并45河海大学硕上论文第四章设计‘j实现根据动态步长调整数据,这些对于提高算法效率都起到了积极的作用。4.4本章小结本章主要提出了测试用例生成的系统框架,由程序预处理模块、路径生成器、谓词分析器、切片生成模块、测试数据调整模块等部分组成。描述了各个模块的功能以及整个系统的流程。最后通过实例,依据系统提出的流程,生成了特定执行路径下的测试用例。河海人学硕上论文第五章总结‘j展望第五章5.1本文的主要工作总结与展望本文讨论了一种在白盒测试方法下基于路径覆盖的测试用例生成方法。通过分析程序结构,计算出程序的所有可执行路径,然后根据执行路径依次生成特定路径下的测试用例。为了适应复杂的程序结构,文中引入了复合谓词的概念,利用分支函数极小化的方法逐步逼近合适的测试数据。文中给出了对应于简单谓词的分支函数定义以及对应于复合谓词的扩展分支函数定义。并通过实例介绍了利用分支函数极小化方法实现测试数据搜索的过程。另一方面,在进行数据调整(数据搜索)时,需要反复执行源程序以验证测试数据是否符合给定的测试路径。为了减少程序代码的执行量,引入了动态程序切片技术。程序切片抽取了程序中与某一变量相关的代码片断,忽略了暂时无关的代码行,大大简化了程序的代码量。本文详细介绍了切片技术的发展、切片的分类、切片准则、切片算法思想,提出了一种引入控制依赖关系的动态切片算法,通过实例验证了切片算法的可行性。最后,本文通过参阅相关文献,分析和总结后,提出了一种通过路径覆盖实现测试用例生成的系统框架,给出了该系统的框架图,详细说明了系统的流程,以及各个模块应该实现的功能,并给出了部分模块的算法思想。最后以学生管理系统中奖学金查询模块为实例,演示了该模块执行时的流程,并生成了给定路径下的测试数据。5.2进一步的工作本文围绕测试用例生成这个概念,提出了通过路径覆盖实现测试用例生成的分组搜索算法。论文给出了一种测试用例生成的框架,并详细叙述了各个模块的功能。通过实例可以验证框架各模块的可行性,但对于整个系统能否用代码完全实现,还需要进行进一步的研究。所以,这有待于今后将模块功能细化,并逐步用代码实现。特别是程序预处理模块,需要对程序进行语义分析,将一般语句和控制语句区分开,并对的语句进行标识。控制语句虽然不是一条以分号结尾的语句,但为了方便谓词分析,需要将控制语句标识成单独的语句。另外,谓词分析模块,需要对各控制语句中的谓词进行分析,并自动转化成分支函数。对于有些谓词中包含的中间变量,需要转化成与输入变量相关的表达式。另一方面,文中所涉及的待测程序具有一定的局限性,文中只给出了输入变47河海人学硕上论文第五章总结与展望量为整数的情况,对于输入数据为实型数、字符串、特殊数据结构的一些情况还未提出相应的方法。事实上,对于输入变量为字符串类型等情况时,不适合使用逐步搜索的算法,可以对其单独考虑。所以,如果将测试用例生成设计成一个完成的、可行的系统,那就需要对特殊输入的变量单独考虑。本文只是结合了路径覆盖方法、复合谓词、程序切片等内容,对测试用例生成这个方面做了一些初步的研究。希望能对软件测试的发展尽一点绵薄之力。河海大学硕L.论文致谢致谢在论文完成之际,谨向我的导师陈金水教授表示深深的感谢!从本科毕业设计开始,陈老师就成为我学习上的导师,生活中的朋友。三年多来,陈老师在生活上给我无微不至的关怀;在学术上给我悉心指导与教育。本文从选题、理论研究、实验分析到论文撰写都得到了陈老师的悉心指导和无私帮助。陈老师在繁忙的工作中抽出大量时间关心我的课题进展,并对本论文进行了严格的审查和细致的修改,特别是陈老师经常从一大早开始工作一直到很晚才离开办公室,让我倍受感动。陈老师严谨求实的治学态度,对事业的孜孜追求、以及对学生科研能力、工作作风、思维方法的培养和谆谆教诲,将让我终生难忘,终生受益。特向他致以崇高的敬意和衷心的感谢!感谢实验室的所有同学、已经毕业的师兄师姐和还在继续学习的师弟师妹,他们共同创造了宽松的学习环境和良好的学习氛围,并且给予我许多有益的启迪。特别感谢三位舍友,在三年的学习和生活中给了我很多帮助,陪我度过了愉快的学习时光。感谢我的父母和家人,他们为我付出了很多,给了我很多很多无私的关怀和帮助。他们的关心和支持是我的坚强后盾,他们对我无私的爱永远是我积极生活、认真完成学业的动力!感谢在百忙之中抽出时间审阅论文和参加答辩的各位老师,谢谢你们提出的宝贵建议。最后要感谢所有关心和帮助过我的老师、同学和朋友们149河海大学硕上论文参考文献参考文献[1]GlenfordJ.Myers.软件测试的艺术The机械T业出版社,2006.[2]RonP眦on.软件测试.计算机应用研究,机械工业出版社,2006.[3]陈胜军.软件测试方法的研究.安徽电子信息职业技术学院学报,2006年第1期,第5卷.[4]池万乐.软件测试技术的应用.电脑知识与技术,研究与开发曾凌峰.浅谈软件测试方法.科技资讯,2006No.3ArtofSoftwareTesting.[6]万琳.路径测试用例白动生成中的搜索算法分析.计算机工程,第32卷第l期2006年1月.[7]易云辉,汪闰人.基于遗传算法的软件测试用例生成系统模型.科技广场,2006.6.[8]李必信.程序切片技术及其应用.科学出版社,2006.[9]毛颖.测试用例自动生成系统研究与实现.电子科技人学,2007年4月.[10]CowardPD.Symbolicexecutionandtesting.InformationandSoftwareTechn0109y,Aconstraints01ver199l,andof33(1),pp.53—64.[11]ZhangJ,analysis.WangX.itsapplicationtopathfeasibilitySoftwareEngineering&KnowledgeInternational200l,Journalpp.139—156.MathurEngineering,11(2),P.[12]NeelamGupta,AdityaanandMaryrelaxationLouSoft’a.AutomatedACMtestdatagenerationusingiterativemethod.SIGSOFTSoftwareEngineeringNotes,23(6),November,test1998,datapp.231—244.IEEETranson[13]KorelB.Automated1990,softwaregeneration.SoftwareEngineering,16(8),pp.870一879.test[14]KorelB,A1一YamiAM.Automatedregressiongeneration.ProcoftheACMSIGSOFTInt.Florida,Symp.pp.OnSoftwareTestingandAnalysis,ClearwaterBeach,USA,1998,143—152.Astrategyfortest[15]JonesBF,EyresDE,branchandSthamerH—H.fault—basedusinggeneticalgorithms1998,toautomateing.TheComputerJournal,4l(2),pp.98一107.[16]荚伟,谢军闾,奚红宁,高仲仪.遗传算法在软件测试数据生成中的应用.北京航空航天大学学报,1998,24(4):434—437.[17]MichaelCC,McGrawqSchatzMA.Generatingsoftwaretestondataby10.eVolution.IEEETransSoftwareEngineering,2001,27(12):1085一ll[18]夏辉,宋昕,千理.基于Z路径覆盖的测试Hj例自动生成技术研究.河海人学硕J二论文参考文献《现代电子技术》,2006年第6期.[19]伦立军,丁雪梅,李英梅.路径覆盖自动生成技术研究[20]weiserM.Programonslicing.1984,IEEETransSoftwareEngineering,SE—lO(4):352—357.[21]KarlJ.Ottenstein,TheACMprogramLindaM.0ttenstein.inadependencegraphNotices,softwaredevelopmentenvironment.SIGPLAN1984,19(5):177—184.TestDataGeneration.1990.IEEETransactionson[22]BogdanKorel.AutomatedSoftwareSoftwareEngineering,VOL.16.N0.8.Augest[23]张勇翔,李必信,郊国梁.程序切片技术的研究与应用.计算机科学,2000,27(1).[24]ChristonSteindl.Ph.DThesis.1999.ProgramS1icingforObject—OrientedProgrammingLanguages.[25]刘万春,李顺华,朱玉文.基于改进的Z路径覆盖策略的路径生成算法.计算机|T程与设计,2005。26(12).[26]贺青春,叶柏龙.完全路径覆盖测试法.矿业研究与开发,2007,27(1).[27]王雪莲.程序切片技术研究及其在软件测试数据生成中的应用.北京化工大学,2005年6月.[28]王雪莲,赵瑞莲,李立健.一种用丁测试数据生成的动态程序切片算法.计算机应用,2005年6月.[29]李必信,方祥圣,袁海,郑国梁.一种基丁程序切片技术的软件测试方法.计算机科学,200l,V01.28.[30]刘勇,曾明.基于数据流的软件测试序列自动生成技术研究.微电子学与计算机.2005,22(5).[31]H.Agrawal,J.R.Horgan.1990,DynamicProgramSlicing.SIGPLANNOtices,6:246—256.Forwardcomputationofdynamicon[32]B.Korel,InS.Yalamanchili.oftheprograms1ices.Proceedings1994InternationalSymposiumSoftwareTestingandAnalysis(ISSTA),[33]FrankTip.ASeattle,ofWashington,s1icingAugust,1994.surveyprogramtechniques.JournalofProgrammingLanguages,1995,3(3):121—189.[34]A.Beszedes,DynamicInandT.Gergely,Zs.M.Szabo,J.CsirikandT.Gyim’othy.largeslicingmethodtheformaintenanceofFifthConprograms.ProceedingsofEuropeanConferenceMar,2001,SoftwareMaintenancepp.105一l13.Reengineering(CSMR2001),IEEEComputerSociety,51河海大学硕十论文参考文献[35]T.Gyimothy,forA.Beszedes,Lforgacs.AnEfficientRelevant1999,SlicingMethodDebugging.SoftwareEngineeringNote,24(6):303—321.andA190rithmsfortheNext[36]J.Vertommen,GenerationConferenceofB.Vandermeulen.KnoledgeTestingMethodsSystems.ManagementTheFutureBusinessTechn0109y2004.March12—13.TestDataGeneration:ASurvey.[37]PhilMcMinn.Search—basedSoftwareVerificationonSoftwareTesting,andReliability,2004,14(2):105—156.[38]JonEdvardsson.ASurveyAutomaticTestDataGeneration.[39]王震.软件测试用例自动生成系统研究开发.两安理工大学硕十论文,2004.儿.[40]朱菊.软件自动化测试框架TAF及其应用.河海大学硕士论文,2006.5.52基于路径覆盖的测试用例生成算法研究

作者:

学位授予单位:

李煜河海大学

1.学位论文 杜磊 ICS软件测试过程的定制与实施 2006

软件测试技术是保证软件质量的主要手段之一,而软件测试过程则是软件测试得以有效实施的保证。随着对软件质量的关注,软件测试过程已成为软件工程领域的一个重要分支。软件测试过程采用一系列的思想、技术和工具,达到生产高质量的软件的目的。InterChangeServer(ICS)软件测试过程的定制与实施将软件测试过程理论和实践相结合,为企业提高软件质量,降低开发成本发挥了重要作用。

本文首先介绍了软件测试过程,包括各种测试方法、测试技术、工具、思想、管理手段以及软件测试过程的各个阶段。然后本文介绍了在ICS项目中如何根据企业的需要定制软件测试过程。最后介绍了在软件测试过程实施中面临的问题和解决的办法并给出了ICS软件测试过程的实施方案。本文着重探讨了如何根据企业的自身情况定制软件测试过程,还介绍了软件测试过程实施中所遇到的管理和技术问题,以及解决这些问题的方法和注意事项。在本文中还探讨了如何评估和改进软件测试过程,以及在具体的改进过程中需要怎样操作和注意哪些问题。

ICS软件测试过程以统一软件测试过程(UnitedTestProcess)为主体,结合极限编程(extremeProgramming,XP)中的测试技术,综合使用各种测试工具和管理思想,定制并实现了一个完整的软件测试过程。它的特点是符合ICS的软件测试需要,过程完备、流程清晰、分工明确,是可重复的、已定义的、可度量的。在ICS测试过程的实施中,主要以自动化测试为主,大大缩短了测试时间,降低了测试成本和缺陷的发生率,提高了软件的质量,增加了客户的满意度。

2.会议论文 苏亚 做好软件测试 提高软件质量 2003

本文讨论了软件质量的重要性,分析了软件测试的目的、原则、方法、活动,提出了加强软件测试对提高软件质量的作用.

3.学位论文 熊策 软件质量控制技术的研究与应用 2004

随着计算机应用领域的扩大,软件质量越来越成为国内外工业界和学术界关注的焦点,对软件质量控制技术和方法的研究也成为软件工程领域的一个重要课题.长期以来,我国软件质量都上不去,软件缺乏竞争力.究其根源,缺乏软件开发和维护的正确方法以及忽视软件开发过程的质量控制乃是最为关键的原因.提高国产软件质量,打造民族产业品牌,在信息产业部的这个号召下,已有越来越多的企业和研究机构把精力投入到这方面的科研与实践中来.笔者在这个大的课题中,主要进行了三个方面的研究:如何使用CMM模型实施软件过程改进,提高软件质量;如何利用面向对象方法和RUP框架进行软件开发,控制软件质量;如何在面向对象软件开发中运用软件测试技术,保障软件质量.并在课题的实际开展中,根据需要设计和实现了一个软件质量控制辅助工具.文章分为七部分.第一部分讲述了本课题来源、研究背景及国内外发展现状,指明了课题的具体研究内容.第二部分说明了软件质量的内涵和评价体系,阐述了软件工程的层次结构及其和软件质量的关系,对CMM,OO方法和RUP框架,软件测试这三种在软件质量控制中具有重要作用的技术和方法做了深入的研究.第三部分着眼于探讨CMM的实施策略.先分析国内软件企业实施CMM中普遍遇到的问题,然后结合保网公司的实际情况,提出了相应的CMM的实施策略,详细阐述了CMM2的几个关键过程域活动在具体项目\"银保通\"中的开展,展示了CMM的实施效果,验证了该策略的有效性.第四部分结合实际项目\"银保通\"系统的开发详细阐述了怎样灵活高效的使用OO方法和RUP框架保证项目的成功和软件产品的质量.第五部分在对OO测试技术深入研究的基础上,对\"银保通\"单元测试、集成测试和系统测试中的若干测试策略做了具体分析.第六部分对笔者参与开发的质量控制辅助工具QCAT的设计和实现做了详细的阐述,对其中运用的关键技术做了清晰的说明.第七部分对笔者在软件质量控制方面做的研究和实践进行了总结,并展望了今后的研究方向和工作.

4.期刊论文 张元华.王峻.ZHANG Yuan-hua.WANG Jun 通过软件测试提高航空电台软件质量 -电讯技术2006,46(3)

为了提高软件质量,进行软件测试是一种重要手段.介绍了软件测试的基本流程和方法,并通过实例验证了方法的有效性.

5.学位论文 马志敏 基于风险的软件测试两阶段模型研究 2008

随着信息技术应用的日益增长,计算机软件系统已经渗透到社会的经济、生活、安全等多个方面。人们对软件作用的期望值也越来越高,软件的质量和软件功能的可靠性逐渐成为人们关注的焦点。软件测试作为软件开发过程中保证软件质量非常重要的一个工程阶段,也逐渐被软件开发组织所重视。 根据全面质量管理理论,现代的测试不再是编码后的一个子过程,而是要将测试过程与开发过程并行进行,力争将缺陷控制在开发过程的早期,从而有效缩短开发周期,降低质量风险。

在软件测试的过程中,我们需要投入一定的人力和物力资源。软件开发的经验表明,软件测试需要消耗大量的资源。有些软件项目因为资源分配不合理,造成软件测试不充分或者项目延期,造成严重的后果。因此,科学的测试策略,合理的资源分配方案,是提高测试效率,保证软件质量的重点。 本文从软件测试的研究现状出发,对在资源有限的条件下,如何有效地规划测试工作,更好的保证软件质量这个问题,从以下几个方面展开研究:

一、论文分析并针对已有的基于风险测试模型存在的种种不足,对原有模型进行了改进。在原有模型的风险识别阶段,依据软件质量度量标准,从软件产品本身、用户和过程三个方面考虑,建立模块风险因素指标体系,更加全面地选取风险因素,并结合主成分分析法筛选出主要的风险因素,建立更加客观和合理的模块风险度量指标体系。

二、论文构建了基于风险的软件测试两阶段模型。第一阶段运用已有模型的方法,通过估计软件中各个功能模块的风险相对值,进行优先级排序,并据此分配测试资源,进行首轮探测性测试,得出相关缺陷数据。第二阶段,根据第一阶段所得数据,运用软件可靠性模型G-O模型估计各个模块的总缺陷数,再根据缺陷分布建立资源的最优分配模型,进行第二轮测试,使各个模块剩余缺陷数最少,以达到动态调整测试资源,提高软件可靠性的目的。

三、论文将基于风险的软件测试两阶段模型运用于某外汇交易中心操作风险管理系统的测试过程中,并结合具体的软件系统给出实施步骤,验证该模型的可行性和实用性。

基于风险的软件测试两阶段模型把定性分析和定量分析、软件测试与风险管理科学地结合在一起,在原有基于风险测试模型上进行改进和扩充,是以软件模块的质量风险为主要参考依据来进行测试资源分配的一种改进策略,是促进资源优化配置,提高测试有效性的行之有效的测试策略。

6.学位论文 万邦睿 基于CMMI的软件测试过程度量研究 2007

随着信息技术的迅猛发展,计算机软件已渗透到社会生活的方方面面。与此同时,软件项目规模的不断壮大、功能的增强和复杂度的增加,软件的成本、进度、质量也变得更加难以控制,这使得软件差错的经济代价和社会代价不断上升。因此,如何生产出高质量的软件产品成为软件产业生死攸关的问题。

软件测试作为保证软件质量的一种重要手段,在软件的生命周期中具有十分重要的地位。有研究表明:越早发现软件中存在的问题,开发费用就越低,软件质量越高,软件发布后的维护费用越低。而业界普遍认为,除了软件测试技术以外,一个好的、成熟的软件测试过程能够最大限度的保证软件测试的有效性,进而保证软件产品的质量。

软件度量技术在软件工程领域的研究中占据着重要的地位,它是改进过程的有效途径之一。通过对过程的度量,可以使过程规范化、可视化;通过对度量数据的分析,可以测量出过程的有效性以及存在的问题;通过度量信息跟踪和监督过程状态,能够为过程管理提供决策支持,降低过程承担的风险。可通过在软件测试过程中引入过程度量,保证软件测试过程的有效性,最终实现软件产品质量的保证和提高。因此,对软件测试过程的度量研究具有十分重要的意义。

集成能力成熟度模型CMMI是一个成功的、广泛使用的软件过程改进模型。众所周知,软件测试和软件度量是软件过程中不可分割的一部分,所以CMMI包含了一系列支持软件测试过程改进和软件度量分析的过程域,并且这些过程域在CMMI的连续式表示模型中是允许被软件组织单独实现的。

本文正是运用CMMI各个过程域中对软件测试和软件度量的支持框架、实际指导、过程分析等,结合传统的过程度量方法、技术,对软件测试过程度量进行了研究。本文研究的主要工作集中在以下三个方面:

(1)定义了一个基于CMMI的软件测试过程。按照CMMI开展度量和分析的要求,任何对过程的度量都是建立在清晰的过程定义上的。因此,本文在分析了现有的软件测试过程模型优缺点以及CMMI对软件测试扩展的基础上,定义了一个基于CMMI的软件测试过程。

(2)提出了一个基于CMMI的软件测试过程度量元选取模型。如何有效地选择度量元是研究软件测试过程度量的一个重要方面。本文分析了常见的过程度量建模方法的不足,并根据CMMI提供的要求和原则,建立了一个基于CMMI的软件测试过程度量元选取模型—C-G模型。该模型是以CMMI到GQ(I)M的映射关系作基础,包括了相应的度量定义、剪裁原则和CMMI相关过程域等。本文以需求验证这个应用案例证明了模型的可行性。

(3)提出了一个软件测试过程度量数据分析模型。如何分析应用选取度量元的度量数据是研究软件测试过程度量的另一个重要方面。本文分析了统计过程控制的相关理论和贝叶斯网络的相关理论,在两者结合的基础上,建立了一个软件测试过程度量数据分析模型。定义了该模型的详细执行流程,并以新设计测试用例这个应用案例证明了模型的可行性。

7.期刊论文 陈开颜.王希武.孙会珺.李惠君.赵强 软件质量与软件测试 -河北省科学院学报2004,21(2)

软件测试是软件质量保证的关键步骤,笔者从技术、工具和管理三个角度出述了软件测试对软件质量的影响.

8.学位论文 刘烁 基于UML的CPN模型在软件测试中的应用 2007

软件测试是保证软件质量的重要手段,也是软件开发过程中一项非常重要的工作。一直以来,国内的很多软件企业对于软件测试的重要性缺乏足够的认识,测试水平不高,软件质量无法得到保证。质量有问题的软件会导致无法预测的后果,因而如何保证软件质量以及如何最大限度地提高软件质量就成为一个重要课题。

传统的测试理论与方法并不完全适合用于新兴的面向对象软件系统。随着面向对象分析和面向对象设计的成熟,如何对面向对象软件进行测试是一个非常值得研究的问题,也是测试领域的一个难题。现代测试理论规定软件必须在其生命周期的全过程进行测试,很多测试不能简单地靠手工测试实现,必然会导致自动化测试的产生和应用。

UML在被工业界广泛接受的同时也成为学术界遵循的一种标准建模语言。许多面向对象软件测试的研究都围绕从UML模型构造软件模型开展。研究基于UML模型的软件测试有利于把测试工作提前到软件开发周期的早期进行。但UML模型属于半形式化模型,往往无法自动生成测试用例。而Petri网作为离散系统的建模和分析工具,适合于描述系统中顺序、并发、冲突以及同步等关系,拥有丰富的系统描述手段和系统行为分析技术。将UML模型与Petri网相结合,能够弥补其数学支持的不足。国内已有基于Petri网模型的软件测试研究,但较为少见。

国外有文献提出了CPN模型和UML图表到CPN模型的映射方法,并将其应用于模型检测领域。我们发现CPN模型经过改进也可以运用于面向对象的类测试和簇级测试。

为此,本文主要做了以下几方面的工作:

首先,以基于模型的测试用例的自动化生成为主线,提出了基于UML的CPN模型的测试框架。

其次,在介绍国外文献中的CPN模型和UML图表到CPN模型的映射方法的基础上,针对软件测试的具体需要,对CPN模型做出了相应改进,并在时间准确性方面,进一步完善了映射的算法。

再次,在研究基于状态覆盖准则的基础上,提出了库所-变迁覆盖准则,并介绍了基于此覆盖准则的测试用例生成策略。

最后,构建了自动化测试用例生成工具,工具包括四个部分:模型转化工具、用例生成工具、代码插装工具和信息比较工具。实验内容主要包括使用已实现的工具,从任意包含完整信息的MDL文件中提取有用信息生成对应的CPN模型。实验证明将基于UML的CPN模型引入基于模型的软件测试是可行的。

9.会议论文 齐俊臣.彭道勇.刘春和 重视软件测试提高软件质量与可靠性 2005

随着软、硬件技术的发展,计算机的应用领域越来越厂,而其中软件的功能越来越强大,软件也越来越复杂。这就使保证软件的质量和高可靠性面临巨大的挑战。特别是对于我们导弹武器系统,包括电子化指挥系统、任务规划系统、测发控系统、一气行控制系统等,都用到了大量的软件。软件的微小瑕疵就可能对生命安全、天文数字的巨额财产甚至对造成严重威胁。要提高导弹武器系统的可靠性,必需要提高软件的质量,软件测试是解决软件问题的有效办法。本文对软件测试的必要性和重要性进行了论证,并介绍了软件测试的基本理论和方法。

10.学位论文 章恒翀 软件测试管理系统的研究和实践 2002

现在的软件系统对软件质量的要求越来越高.如何提高软件质量有两个关键因素:过程质量的控制和软件产品本身的质量.在传统的软件测试中,比如V模型,人们只对软件产品本身进行测试,对于过程质量则很少进行管理.这将导致很多软件质量的隐患.在该文中,我们不仅分析了软件测试的基本技术,也根据实际工作情况分析了软件测试的过程.对于软件测试,我们不仅要强调软件产品本身的测试,也要强对软件的生产过程进行监测.在这种情况下,依据软件测试的各种管理模型-W模型、H模型和测试成熟度模型,我们形成了自己的测试体系.这种体系以W模型为基础,并结合H模型的反馈原理和TMM的过程控制概念.为了将这种测试体系应用到实现的软件测试中,我们构建了一个软件测试工具-软件测试管理系统.在该系统中,以上述的测试体系为基础,以测试用例和测试缺陷的管理为核心,并加强对角色的权限控制.通过该系统的使用,不仅能够对软件产品本身进行检测.还能够对软件开发过程进行监控,从而更大程度上保证了软件质量.

本文链接:http://d.g.wanfangdata.com.cn/Thesis_Y1267740.aspx

授权使用:东南大学图书馆(wfdndx),授权号:93a283bd-340f-4a86-a32e-9e0e00fd770d

下载时间:2010年10月13日

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务