1、基于遗传算法的测试用例生成方法软件测试是保证软件质量和可靠性重要手段,在这方面发挥着其它方法不可替代的作用。然而,软件测试是一个复杂的过程,需要消耗巨大的人力、物力和时间,约占整个软件开发本钱的40%50%。因此,提高软件测试工具的自动化程度对于确保软件开发质量、降低软件开发本钱非常重要。而提高测试用例生成的自动化程度又是提高测试工具乃至整个测试过程自动化程度的关键所在,本文主要针对这一问题进行了研究和设计。本文在分析软件测试和算法根本概念的根底上,提出软件测试用例的设计是软件测试的难点之一。论文提出了基于算法的测试用例生成的内含是应用算法来求解一组优化的测试用例,其框架包括了测试环境构造、算
2、法及测试运行环境三局部,论文给出了基于算法的测试用例生成的模型。最后以三角形分类程序为例应用算法进行测试用例生成的模拟,结果显示,应用算法进行测试用例生成可行。关键词:软件测试 测试用例 算法ABSTRACTSoftware test is the important means that guarantee software quality and reliability, and in this respect,it plays the role that other method cannot replace. However software test is a complex pro
3、cess , it needs to consume huge manpower,material resources and time,which takes the 40%50% of entire software development cost approximately . Therefore,raising the automation level of software test tool is very important for ensure software development quality and reduction software development co
4、st . And then,the most important is raising the automation level of the test case generation for raising the automation level of test tool and even entire test process,so this paper study and design mainly according to this problem.Based on the analysis of basic concepts of software testing and gene
5、tic algorithm, this article proposes that software test case design is one of the difficulties of software testing. Paper presents the inherent in software test case designing based on genetic algorithm is using genetic algorithm to solve a set of optimization test cases, and the framework includes
6、three parts which are test environment construction, genetic algorithm and the environment for test . Paper presents the model of software test case generation based on genetic algorithm. Finally, we take the triangle categorizer as an example, simulate software test case generation based on genetic
7、 algorithm. The results display that software test case generation basing on genetic algorithm is possible.KEY WORDS: software test , test case , genetic algorithm目录2ABSTRACT3目录4第一章 绪论61.1 问题的提出61.2 国内外研究现状71.3 论文研究内容9第二章 软件测试及算法根本概念102.1 软件测试根本概念102.1.1 软件测试的目的102.1.2 软件测试的原那么102.2 软件测试的难点112.3 算法1
8、22.3.1 算法的思想及流程122.3.2 算法的特点142.4本章小结15第三章 基于算法的测试用例生成163.1基于算法的测试用例生成根本内涵163.1.1 软件测试用例的根本内涵163.1.2 基于算法的测试用例生成的根本内涵173.2 基于算法的测试用例生成框架173.3 基于算法的测试用例生成算法实现193.3.1 编码策略193.3.2 适应度函数及程序插桩203.3.3 策略213.3.4 参数控制233.4 本章小结23第四章 实验及结果分析244.1 待测程序分析244.1.1 待测程序引入244.1.2 程序流程分析244.1.3 路径分析254.2 程序插桩254.3
9、参数设定及程序实现264.3.1 参数设定264.3.2 局部程序实现264.4 结果分析294.5 本章小结31第五章 总结与展望32致谢语33参考文献34第一章 绪论1.1 问题的提出在信息化普及的今天,计算机在人们的生活和工作中占据着重要地位,使人们的工作效率提高,也使生活更丰富多彩。而作为计算机的重要组成局部,软件的重要性不言而喻。随着计算机技术的日益开展,计算机软件的规模越来越庞大,复杂性越来越高,这就为软件质量的保证带来了困难。因为软件的开发过程大局部是由人的智力活动构成,不可能完美无缺。而软件缺陷如果不能及时发现,带来的损失可能是巨大的,有的甚至会危及人的生命。在历史上臭名昭著的
10、软件缺陷案例有1:1999年12月3日,美国航天局的火星基地登陆飞船在试图登陆火星外表时失踪,原因仅仅是一个数据位的意外更改;美国爱国者导弹防御系统曾在几次对抗导弹战役中失利,其中一次竟然误使28名美国士兵丧生,原因是一个很小的系统时钟错误导致系统累计拖延了100多个小时使跟踪系统失去准确度;还有就是大名鼎鼎的“千年虫问题,起因是在20世纪70年代,为了节省硬盘空间,美国某位程序员在编写工资系统时将4位数日期如1975改成了2位数日期如75,该缺陷一直拖到1995年都没有修复,最终给全球带来了高达数亿美元的损失等等。作为提高软件质量的重要手段,软件测试越来越受到重视。在美国的微软公司,测试人员
11、和开发人员的比例到达了2:12。软件测试伴随着整个开发过程,是一个非常复杂的过程,其消耗的人力和资金一般占整个项目的一半左右。而在某些特别重要的软件开发过程中,为保证软件的质量,测试的费用甚至是其它各阶段之和的3到5倍3。测试过程中,测试人员通常需要分析、设计和执行大量的测试用例,从而消耗了大量资源,因此找出合理的测试用例生成方法可以有效缩短测试时间,减少损耗,一般可以有效降低整个项目的4%费用4。然而,目前生成测试用例的方法主要是向前核查法和逆向回溯法,测试人员根据自己的项目经验手工为指定的程序路径生成测试数据5。向前核查法是指沿预期的路径向前检查,确定到每一个判断点时变量所能提供的最宽数值
12、区间,然后继续前行,从而将多个变量的可能取值范围逐渐缩小,到达程序出口后,就能找到覆盖这条路径所需的输入数据。逆向回溯法正好相反,是指从期望执行的程序位置出发,逆向回溯,在每个判断点处逐渐调整各变量取值,直到退到程序入口,即获得所需的输入数据。向前核查法和逆向回溯法的局限性是,对某些条件要求苛刻的路径使用时非常困难,同时由于大多数程序中包含的路径数非常多,如果按每条路径手工测试,显然带来的工作量是非常巨大的。由于测试的工作量大、测试过程的重复性高等特点,自动化测试正逐渐得到广泛的应用。很多测试工具的使用大大提高了测试人员的工作效率,有效减少了项目开支。然而这些工具主要为测试的执行、管理和度量工
13、具,在测试用例自动生成方面还不完善。而在软件测试过程中,动态测试作为测试的重要环节占了很大比例,动态测试的关键正是测试用例的生成问题。因此,寻找一种有效的测试用例生成方法是提高测试自动化的重中之重。1.2 国内外研究现状自上世纪60年代起,国内外的学者专家对测试用例的自动生成提出了很多方法,应用较为广泛的有随机法、静态法、动态法以及试探法5 6 7 8 9 10 11 12。D.Bird13等提出了采用随机法生成测试用例,其思想是不受限制地随机产生大量的测试用例。该方法产生测试用例的本钱很低,在某些抽样测试中效果较好,但是该方法的针对性较弱,在输入空间为无穷大时产生的测试用例集非常庞大,测试效
14、率低,现在的很多工具都是采用的该方法。静态法的典型代表是符号执行法,由P.D.Coward14和C.Ramanmoorthy 15 16等人提出。该方法的主要思想是把符号值作为程序输入,静态“执行指定路径的语句,从而得到变量的值。这里所谓的执行,是指按照程序执行的顺序将相应的变量用符号表达式代换。该方法的缺点为需要进行复杂的代数运算,难以处理依赖于输入变量的循环条件、数组元素下标和模块调用的情况,特别对于动态的面向对象程序不适合使用。与静态法相对应的是动态法,该方法的根本思想是从输入空间中任取一个假设解作为初始输入,通过实际运行程序不断调整输入,使得程序实际执行路径向指定路径不断逼近,直到与指
15、定路径完全一致。Korel17法是动态法的典型代表:其采用的是步进的方式执行程序,即一次只前进一个分支谓词;Korel还提出了“谓词函数的概念,用来度量分支谓词的接近满足程度。然而,由于Korel法一次只考虑一个分支谓词,使用回溯技术,所以要进行大量的迭代,浪费了大量的资源。而且由于对于非线性路径约束,该方法只能找到局部极小值,当谓词函数有多个局部极小值时显然将难以找到目标路径的解。除此之外,动态法还包括程序插装的方法和迭代松弛法,M.Gallagher和Neelam Guptal18分别对这两种方法进行了全面的阐述。第四种算法是试探法,该方法的根本思想是从输入数据空间中选择输入数据,运行程序,将运行结果结合概率论的思想产生新的数据继续进行试探。其受搜索空间限制条件的约束小,且不需要其它辅助性信息,对于很多高复杂度问题如大空间、多峰、非线性、全局优化等具有独特的优势和高效性。试探法主要包括算法、模拟退火算法、禁忌搜索算法、混合策略的算法等。自20世纪90年代起,算法因其独特的优点而开始被广泛的用于测试用例的生成领域,并取得了良好的研究成果。算法模拟生物学中的变异原理,采用编码技术将待求数据映射到基因空间,并通过选择、交叉、变异等操作和优胜劣汰的自然选择确定搜索方向,从而找到最优解。实验证明,该算法具有隐性并行性和全局寻优能力,可以自