【VC++开源代码栏目提醒】:以下是网学会员为您推荐的VC++开源代码-基于MDA的测试用例自动生成方法及其支撑框架 - 硕士论文,希望本篇文章对您学习有所帮助。
中南大学 硕士学位
论文基于MDA的测试用例自动生成方法及其支撑框架 级别:硕士 专业:计算机科学与技术 指导教师:王斌 20100525 摘要 软件测试贯穿于软件开发的整个过程,是保证软件质量的重要手段。
单元测试是对软件设计的最小单位进行正确性检验,是后续软件开发和测试的保障。
所以单元测试既是软件测试的第一步也是最关键的一步。
单元测试的回归性,使得其可以用自动化工具来辅助进行。
因测试工作量大,且手动编写测试用例难以保证测试的质量,使得对测试用例的自动生成进行研究具重要的实际意义。
本文分别从.NET平台下的单元测试框架NUnit及其平台下的测试用例自动生成两个方面展开研究。
首先介绍了相关的背景知识,包括软件测试技术和基于模型的软件测试技术,分析了后者的优缺点。
归纳总结了基于模型的软件测试的国内外研究现状。
其次,本文研究了NUnit单元测试框架,详细分析该框架的结构和工作原理。
针对在使用该框架进行单元测试时,测试
代码存在大量冗余的问题提出相应的修改策略,并对其进行了改进,以实现使测试
代码和测试数据分离。
对改进过的NUnit—1.NUnit框架的两个关键部分:测试
代码框架和测试数据容器,分别给出了对应的生成算法。
最后,本文针对改进后的框架i-NUnit,提出一种基于MDA的测试用例自动生成方法。
该方法以序列图作为对象,将SUT模型、SUT元模型、水平转换说明、xUnit元模型作为初始输入,通过两次模型转换(水平和垂直)生成测试用例。
本文将该方法应用到ATM仿真系统上,对其进行了实验,同时抽取其中的取款模块作为待测试模块,为其自动生成测试用例。
实验结果证明本文提出基于MDA的测试用例自动生成方法具有可行性。
此外,该方法还具有一定的通用性,可以应用于xUnit家族中的所有框架。
关键词:MDA,i-NUnit,xUnit,自动化测试,测试用例的自动生成 ABSTRACT Software testing iS an lmportant method to ensure software quality,which runs through the whole process of software development.Unittesting checks the correctness of the smallest unit in the software design,which brings security to the following developing and testing of software.Therefore,unit testing is not only the first step of software testing,butalso the most crucial one.As its recursive,unit testing could be assistedby some automated tools.Because the workload of software testing iSvery heavy and it is difficult to ensure the testing quality by manuallydesigning test cases,thus it provides practical significance for theresearch of the automated generation of test cases. This paper conducts the research from two aspects:the unit testingframework of.NET platform which named NUnit and the automatedgeneration of test cases based on the.NET platform.At the beginning ofthis paper,it introduces relevant background knowledge of softwaretesting,including software testing techniques,model-based softwaretesting.And an analysis about advantages and disadvantages ofmodel—based software testing is made here.Besides,the summary of theresearch status of model-based software testing is also provided in thisPaper. Next,this paper studies the NUnit unit testing framework andanalyzes its structure and working principle in detail.As while doing unittesting with NUnit,there is a lot of redundancy existing in the test codes,this paper proposes to improve NUnit and gives some strategies for themodification to realize the isolation between test data and code.Meanwhile,it provides corresponding generation algorithms of TDC andTCF,which is the key part of the improved NUnit framework whichnamed i.NUnit. Finally,a method based on MDA to generate unit test cases for theimproved NUnit automatically is proposed in this paper.The methodtakes sequence diagram as object,and SUT model,SUT meta—model,horizontal transformation specifications,xUnit meta—model as the initialinputs to generate test cases by the two conversions(horizontal andvertical).The paper shows this method applied to ATM simulation system, Hand does some experiments with it.At the same time,it takes thewithdrawal module of ATM simulation system as SUT,generates testcases for this module automatically.The result of experiment shows thatthe method is feasible.Besides,this method is also of some versatilityand can be applied to all frameworks of the xUnit family.KEY WORDS MDA,NUnit improvement,xUnit,automated testing,automated generation of test cases 111硕士学位
论文 第一章绪论 第一章绪论1.1研究背景和意义 随着
计算机应用的日益普及和深化,现代软件的规模越来越大、类型也越来越复杂。
软件开发人员和用户都希望在将软件系统正式投入运行之前,能尽可能地提高软件质量。
而软件测试通过设计和执行测试用例,来判断被测试系统(System Under Test,SUT)的实际行为和预期行为是否一致,从而能够检测出软件的内部缺陷。
大量文献表明通过科学合理的软件测试,可以大幅度的提高软件产品质量。
因此,软件测试对确保软件质量有不可替代的作用。
软件测试是为软件项目服务的,它强调的是测试服务的概念。
软件测试有人工测试和自动测试之分。
很长一段时间以来,都是由人工对软件进行测试的。
但是软件测试的工作量很大,据统计,软件测试通常要占用开发时间的40%;一些对可靠性要求非常高的软件,测试所占用的时间甚至达到开发总时间的60%,而且软件的测试工作不是一次性就能完成的。
对软件的某项性能进行测试,不仅要检查前面的测试中发现的软件故障和缺陷是否已经得到了修复和改进,同时还要检查在修复过程中是否引入了新的故障或缺陷u1,因此要进行多次测试,这样就会给测试人员带来很大的工作量。
而且测试的许多操作都是重复性的、非智力的、非创造性的,从而导致测试工作极其繁琐且效率低下。
为了减少测试带来的开销,同时在时间和人力资源均有限的情况下进行更多的测试,将部分测试工作自动化是一种比较理想的解决方案。
特别是针对版本更新将有很多重复的基本测试工作,这时进行自动测试是非常有效的。
软件测试走向自动化,综合起来有两大原因: 1)软件质量的重视和提高 虽然软件产业的历程很短,只有几十年,但其应用范围已经从最初的科研专用渗透到了我们社会中生产生活的各个方面,导致人类社会对软件的依赖越来越强。
软件产品质量的高低直接影响到我们的生产和生活,如2007年发生的
奥运订票网站在开通首日不能登录的问题,导致上百万人购票失败晗1;中国工商银行黄金交易系统出现漏洞,两名大学生通过低买高卖获利3000多万元口3等。
要避免类似的事情发生,就要在软件产品正式使用前发现并解决这些问题。
也就是说必须提高软件质量,而软件测试正是保证软件质量的一种非常重要且有效的手段。
所以现在软件公司越来越重视测试,表现在软件测试的执行方面就是“测多”和“多测”。
“测多”就是使测试更加完整,覆盖更多的功能模块,而“多测”就是反复、硕士学位
论文 第一章绪论多次的进行测试。
这就为软件测试自动化的需求和发展提供了强有力的空间。
2)软件系统规模的扩大及其复杂性的提高 在单机系统时代,软件
代码量很小,几千行
代码就能写出一个商业软件,如著名的WPS。
但随着分布式系统的发展和
网络时代的到来,软件系统中模块间的交互和协作越来越多,多个模块服务中出现交叉调用,网问还存在交互安全等问题,这些都使得软件系统在扩大规模的同时,增加了软件系统自身的复杂性,从而使得软件测试的难度也相应地加大了。
Oracle曾开发过一个邮件客户端Outlook的插件,这个插件要求安装在Outlook上,提供一些
常用的功能。
但仅仅为了测试这个插件,Oracle的测试部门就设计了6000多个测试用例,这个数量是如此庞大,使得测试用例的执行时间和产品的发布周期产生了深刻的矛盾。
这个矛盾体现在:每个新版本发布时,如果一个人手工做一遍完整测试,即手动将这6000多个测试用例执行一遍,耗时大概要半个月;而产品版本的发布周期大概为一周,这就使得测试的速度远远赶不上产品的发布速度。
在此情形下,如果不采用自动化测试,仅靠手动测试来保证软件产品的质量几乎是不可能的。
自动化测试即指软件测试的自动化,是通过自动化测试工具或其他手段,按照测试工程师的预定计划进行自动的测试,从而减轻人工测试的劳动量,进而达到提高软件质量的目的。
软件测试自动化可以从两个大的方面展开:使用自动化测试工具和测试用例的自动生成。
后者通常采用模型驱动技术,即基于模型的软件测试。
基于模型的软件测试可以根据软件行为模型和结构模型生成测试用例。
基于模型的软件测试根据被测试应用程序的模型及其派生模型来产生测试用例和进行测试结果评价H吲。
与其它测试技术相比,基于模型的软件测试技术具有以下优点: 1)能够提高工具的自动化程度和测试效率。
在CPU为1.8GHz和内存为1G的Pc机上,使用Findbugsq-_具对Eclipse、J2SE和JBoss等
开源软件进行分析,所用的时间不超过65秒;使用FindbugsSE具对J2sE中的rtja-(该程序包有13083个类,约40M大小)进行分析,所用的时间只需45秒‘“;在CPU为2.4GHz和内存为512M的普通PC机上,用文献〔8】中的TGSOFM工具对约万行的VC++程序进行故障分析,耗时只需2秒左右。
2)减轻了软件测试的失效辨识问题,并能够发现其它测试技术难以发现的故障,从而保证了软件的质量。
SDV(StaticDriverVerifiers)在对Windows操作系统使用了多年的126个驱动程序,用SDV进行测试时,发现了65个故障,其中有12个严重故障M;而EXPLODE(一种对系统存储进行故障检测的工具)在一些文件存储
系统中发现了大量的严重故障n训;MC贝,IJ在Linux,OpenBSD和Xokexokernel软件中发现了近500个故障…1以及100多个安全漏洞【121。
2硕+学位
论文 第一章绪论 3)可以提高测试用例的重用性,并可以使用成熟的理论和技术知识获得比较完善的分析结果。
1.2国内外研究现状 基于模型的测试最开始应用于硬件系统,广泛应用于对电信交换系统的测试,目前在软件测试中得到了一定应用,并在学术界和工业界受到了越来越多的重视m1。
文献【14】把控制流和数据流分析技术结合起来,提出一种基于UML状态图的类层的测试用例生成方法。
文献【15】通过对UML状态图进行形式化语义描述,以状态机测试理论为基础,依据对象状态机的UML状态图的层次及其并发结构定义类层测试用例生成方法。
文献〔161提出了一种基于UML状态图规范的测试用例生成算法,自动实现了迁移对覆盖和全谓词覆盖准则,因UML类图可以确定类之间的层次关系,从而可以确定对类进行测试的顺序,依据类图可以生成验证类之间层次关系是否正确的测试用例n引。
文献〔18】对基于UML活动图的测试用例生成方法进行了研究,通过对UML活动图的语义和语法进行扩展,进而提出形式化活动图(Formal Activity Diagram,FAD)这一概念。
文献〔18〕中对元素语义进行了细化,而这一思想对于设计与生成测试用例非常有意义。
但该文献的研究基于实时系统,因此文中提出的测试用例生成方法对交互式系统并不完全适用;另外对基于活动图模型的测试用例生成方法,该研究仅在理论上做了初步的探索,没有将活动图模型中的复杂元素考虑进去,如循环、并发等情况,且活动图到FAD的转化需要手工完成。
文献〔19】以UML活动图为设计规格说明,提出一种测试用例自动生成的方法。
首先,该方法为待测试程序随机生成若干测试用例;接着用生成的测试用例测试待测试程序,以获得该程序的执行轨迹;最后,对得到的执行轨迹提供对应的活动图,用特定的覆盖准则加以对比,进而提炼出一个满足测试充分性标准的测试用例集。
该方法还可以用来检验程序的执行轨迹和UML活动图行为是否一致。
存在的问题是:因为该方法对测试用例的选择具有一定的随机性,所以对覆盖结果的好坏不能保证;且要生成程序的执行轨迹所耗的时间比较长,这在很多情况下是不可行的。
文献〔201提出一种基于UML序列图的场景测试方法,该方法将UML序列图作为测试模型,结合UML类图和状态图生成所有的测试场景,最后采用范畴划分方法为每个场景找到与之匹配的环境条件,并将生成的场景与输入输出及方法调用序列进行组合以生成覆盖该场景的测试用例,将之用于该场景中对象间的交互测试。
该方法的特点是:1)完全基于UML模型,易于被工业界采用;2)形 3硕士学位
论文 第一章绪论式化定义序列图,能够通过遍历序列图中的事件得到所有的场景,另外加入了对循环和分支的处理,从而使得该方法有更广泛的适用性;3)在测试用例的生成过程中对对象的状态信息进行了分析,使得生成的测试用例比较充分。
文献〔211结合UML类的状态图和基于扩展的有限状态机的单一输入输出测试用例自动生成方法,提出一种基于UML状态图的自动生成测试用例方法。
该方法采用的算法可以保证测试用例的路径长度达到最短,且在测试用例中包含了预测;另外它从状态图开始测试,可以避免建模中易出现的问题——状态爆炸。
但该方法还存在一些问题:1)前置条件的存在使得实际执行时能够到达的状态和输入数据相关联,进而导致生成的测试用例存在状态不可达的
问题;2)所用的覆盖标准在理论上不够充分,因为它不是状态及其转换的覆盖而只是状态的覆盖。
文献〔221提出一种定义UML活动图形式化和灰盒测试方法。
首先对UML活动图中的所有执行路径(测试场景)进行统一分析;接着依据测试场景中的输入输出、节点和转换所代表的活动及相关约束条件等完成测试用例的生成;最后使用该方法实现了一个测试用例的自动生成工具。
该工具能够从Rational Rose的规约文件中抽取活动图信息并据此生成对应的测试用例,能够在降低测试成本的同时提高测试效率。
但该文献中假设的前提和约束太多了,导致该方法不够实用。
目前,关于基于模型的软件测试技术的研究
工作已经取得了一定的成果,但是还存着一些急需解决的问题: 1)覆盖率不够理想是基于模型自动生成测试用例存在的一个问题,从而影响测试的充分性; 2)当对象处于不同的状态时对消息的响应存在着比较大的差异,而目前关于基于交互类间状态的测试的研究还比较少; 3)另外,为模型生成有效的测试数据也是问题之一。
1.3
论文研究内容
论文在总结前人研究成果的基础上,首先对单元测试框架NUnit进行了改进,使其能够实现测试
代码与测试数据的分离,从而解决使用NUnit测试时测试
代码存在大量冗余的问题;其次对改进的NUnit,提出一种基于MDA(Model.Driven Architecture)的测试用例自动生成方法,该方法通过两层模型转换生成测试用例。
实践证明,基于MDA的测试用例自动生成方法及支撑框架不仅可以节省开发时间,同时还可以提高测试效率。
论文的工作总结如下: 1)对软件测试技术进行了介绍,并对基于模型的
软件测试技术及其应用进行了介绍。
4硕十学位
论文 第一章绪论 2)针对NUnit单元测试框架在使用时存在着测试
代码冗余的问题,对其进行改进,使其能够实现测试
代码和测试数据的分离。
3)对改进过的NUnit框架,提出一种基于MDA的测试用例自动生成方法。
该方法采用序列图模型对SUT及测试框架进行建模型,先进行模型间的水平转换,最后进行水平转换,将模型转换成测试
代码。
4)在仿真系统中实践文中提出的基于MDA的测试用例自动生成方法,以验证其可行性。
1.4
论文组织结构 本
论文的内容如排如下: 第一章介绍本文的研究背景及意义、国内外的研究现状以及本课题的研究内容等。
第二章对软件测试技术和基于模型的软件测试进行了综述,归纳了软件测试目前的主要研究方向,分析了基于模型的软件测试的优缺点以及存在的问题。
第三章首先就单元测试及其意义进行了阐述,并由单元测试的回归性引出单元测试框架NUnit,并指出该框架存在的不足,进而对NUnit框架进行改进,实现测试
代码和测试数据的分离。
另外,对框架改进时涉及的关键点进行详细介绍。
第四章为改进过的NUnit框架_小Ⅲllit提出一种基于MDA的测试用例自动生成方法。
首先建立SUT元模型和i-NUnit元模型,然后进行模型到模型间的水平转换,最后是模型到测试
代码的垂直转换。
第五章是对上一章提出的方法进行了实践证明。
第六章是课题工作的总结与展望。
对课题的研究工作和创新点进行了总结,并对进一步的研究内容进行了展望。
5硕士学位
论文 第二章基于模型的软件测试 第二章基于模型的软件测试2.1软件测试技术2.1.1软件测试的思想 软件测试是一个贯穿于整个软件开发周期的过程,其基本思路是根据软件开发过程中各阶段产生的文档和软件系统的结构,设计出测试用例,进而执行以及收集运行结果,并将收集的结果和测试人员的预期结果进行比较,得出相应的测试结论,最后依据结论对被测试的软件提出修改或调整意见。
软件测试的实施必须考虑以下4个方面: 1)由谁来开展测试工作 软件产品的生成过程中通常会涉及到两种角色:软件开发人员和软件测试人员。
软件开发人员负责前期的需求分析、系统设计、编码、软件调试等,并在这些过程中形成源
代码和文档等各类产品。
而软件测试人员则负责对开发过程中形成的产品进行检验,看是否存在着问题,具体的任务包括走查各类
文档、针对软件设计测试用例、搭建测试平台、执行测试以及评估测试结果等。
通常,由开发方负责对程序的单元测试,系统测试则由第三方机构来进行。
2)测试对象是什么 程序的缺陷和故障可能产生于软件开发的各阶段,有时候即便是针对源程序进行测试以发现其中存在的故障。
这些故障可能是在开发前期引入的,而并不一定是由编码带来的。
所以,在整个软件开发周期中,从需求分析、概要
设计、详细设计到编码等各阶段产生的
文档,包括需求分析说明、概要设计文档以及源
代码都应该作为为测试的对象。
3)什么时候进行测试 单元测试通常由开发人员在完成单个模块的开发后自行进行,集成测试则一般在各模块组装成一个完整的程序之后再进行。
时间证明,随着开发的深入,未进行测试的模块对整个软件的潜在破坏就越明显。
总而言之,测试应该伴随整个软件开发的过程,以尽早的发现软件中存在的问题。
4)如何进行测试 软件的规格说明描述了软件应达的目标,包括外观和功能等。
而
程序的实现则是针对不同的输入以及怎样产生输出的过程。
由此,软件测试亦可看成是根据软件的说明和实现,设计有效测试用例,对软件系统进行检测的一项活动。
6硕士学位
论文 第二章基于模型的软件测试2.1.2软件测试的目的及原则 软件测试,其本质是通过对相关文档进行审查、对软件数据进行检查并运行程序源码,从而找出软件中存在的错误。
目标就是在正式交付使用软件之前尽可能多的找出其缺陷,协助相关部门定位和解决缺陷,直至最后提交给用户的是高质量的软件。
位于不同的立场,软件测试的目的也不相同。
对用户而言,更多的考虑是该软件是否可接受,因此他们希望通过软件测试尽可能多地暴露软件中隐藏的错误和缺陷;而于软件开发者而言,则希望通过测试表明自己的软件产品中不存在错误,验证被测试的软件产品已正确的实现了用户的需求,使用户对软件产品的质量放心∞’。
关于软件测试的具体目的,在此引用GMyers在文献〔24〕中的观点:1)软件测试是为了发现程序中的错误而运行程序的过程;2)好的测试方案极可能发现迄今为止尚未发现的错误;3)成功的测试是发现了至今为止尚未发现的错误。
为了达到上述目的,软件测试工程师必须深入理解并正确使用相应的测试基本准则。
软件测试的主要准则幢副如下: 1)所有的测试都应该能够追溯到用户的需求。
软件测试的最终目标是发现错误。
对用户来说,导致程序不能满足其需求的错误是最为严重的。
2)测试计划在测试开始前就应该制定好。
通常,测试计划的设计在需求模型完成后即可着手开始,而更为具体的测试
方案则可在完成设计模型的建立后开始设计。
换言之,软件测试的规划工作在正式编码之前就可以进行。
3)在软件测试工作把Pareto原理考虑进去。
根据Pareto原理,通过测试找出的错误,其中有80%很可能是只由20%的程序模块引起的。
因此,测试的关键是找出那些可疑的模块。
4)测试应该先从“小规模”着手,然后逐渐过渡到“大规模”测试。
通常地做法是,首先对单个的模块进行重点测试,然后再在集成好的大模块中查找错误,进而才是在整个系统中寻找软件错误。
5)在实际应用中,穷举测试是不可行的。
穷举测试要求对程序所有可能的执行路径都进行检查,以找出程序中的错误。
即使是一个中等规模的程序,其执行路径的排列数也十分庞大,由于受时间、人力和资源的限制,在测试过程中不可能执行每个可能的路径∞3。
所以,测试不能用来说明被测试程序中不存在错误,只能证明程序中有错误。
但如果在设计测试方案时考虑周全,就可能达到比较高的程序逻辑覆盖度并使程序达到用户要求的可靠性。
6)通常由独立的第三方专门来开展测试工作,以达到最佳的测试效果。
“最佳测试效果’’指的是最大可能性的发现错误。
7硕士学位
论文 第二章基于模型的软件测试2.1.3软件测试的流程 传统的软件测试通常从完成单个模块的编码开始,但随着软件产业的飞速发展和软件产品质量要求的提高,测试工作慢慢渗透到了从需求分析、系统设计到编码的各个开发阶段。
图2.1是著名的软件测试V模型,它详细的说明了在软件的开发周期中各阶段对应的测试。
但该模型有一定的局限性,只涉及到整个软件测试流程中的单元测试、集成测试、系统测试和验收测试,以及这些测试过程与各开发周期的对应关系。
图2-1软件测试V模型 事实上,全面的质量管理要求对软件开发的每个阶段产品进行验证和确认,即.