软件测试用例自动生成方法及系统的制作方法

文档序号:6613724阅读:160来源:国知局

专利名称::软件测试用例自动生成方法及系统的制作方法
技术领域
:本发明涉及软件测试技术,尤其涉及一种软件测试用例自动生成方法及系统。
背景技术
:软件测试技术正在向纵深发展,新的效率高的软件测试方法不断涌现,统计表明,在现阶段,在所有软件测试开销中,约40%花在测试用例上,包括生成测试数据和检查测试结果,约50%花在编写和编译脚本上,约10%花费在测试脚本的执行和配置管理上。在众多的软件测试方法中,覆盖测试是最常用的一种测试方法,所谓覆盖测试,即对给定的元素E,首先选择包含元素E的一条路径P,然后生成路径P的测试用例C,如果测试用例C不存在,则应选择其他的路径F,如果路径P'不存在,说明元素E是不可执行的。上述过程循环往复,其中生成路径P的测试用例是核心问题。目前路径P的测试用例生成主要是靠人工来完成,需要大量的时间。在很多情况下,如果路径P比较复杂,例如,包括的分支比较多,或者分支比较复杂,人工生成测试用例几乎是不大可能的。测试用例的生成是软件测试的基础,无论哪种测试方法,都涉及到这个问题。目前有很多种测试用例生成方法,如遗传算法、随机法、爬山法、探索法、解方程法等,但研究成果离实用还有很大距离。这也是目前制约软件测试技术发展的主要因素之一。目前在国际上所开发的先进软件测试工具中,一般都回避测试用例自动生成这个问题,或者至多能提供半自动生成测试用例的方式。在目前国内外从事软件测试的企业中,大都采用人工方式或计算机辅助方式生成用例。这两种生成测试用例方法的缺点是1)生成用例需要花费大量的时间,测试效率低;2)需要很专业的软件测试人员,并且需要该人员对被测软件很熟悉;3)测试效果可信度低。上世纪九十年代以来,软件测试与维护的成本越来越高,在我国基本上要达到软件开发总费用的30%~50%,在美国,这个数字要达到50%以上,有的甚至高达80%以上,在这个比例中,其中相当一部分是人工费用,而且在软件测试过程中,人工生成测试用例占据了很大部分的时间。测试用例的自动生成一直是软件测试技术所追求的目标之一,但这是一个极为复杂的问题,国际上许多科学家为此付出了极大的努力,但其效果并不十分理想,就目前的研究水平而言,离实际能够使用还存在相当大的距离。但其成功解决对提高软件质量,缩短软件开发时间都具有十分重要的理论意义和使用价值。
发明内容本发明的主要目的在于提供一种软件测试用例自动生成方法,能够按照给定的待测软件程序元素,针对被测程序生成符合要求的测试用例集合,提高了软件测试的效率与自动化程度。本发明的另一个目的在于提供一种软件测试用例自动生成系统,能够实现按照给定的待测软件程序元素,针对被测程序搜索生成符合要求的测试用例集合,从而提高了软件测试的效率与自动化程度。为达到上述目的,本发明的技术方案是这样实现的一种软件测试用例自动生成方法,其该方法包括以下步骤A、读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成待测软件的抽象语法树和控制流B、遍历所生成的抽象语法树,对待测软件源程序进行预处理,所述预处理包括识别原始输入、输出变量,并对原始输入变量的定义域进行空间压缩;C、遍历控制流图,生成当前待测软件程序元素的路径,对所生成路径中的变量进行赋值运算、蕴涵运算及回溯运算,生成测试用例。上述技术方案中,所述步骤C具体包括Cl、根据用户给出的待测软件程序元素,通过遍历控制流图生成执行当前程序元素的路径;C2、计算所生成路径中变量及相关变量的级别,并初始化条件计数器;C3、对步骤Cl所述路径中条件语句的输入变量进行枚举赋值,并判断变量的取值是否为空,如果为空则执行步骤C5,否则执行步骤C4;C4、根据步骤C3中输入变量的取值进行蕴涵运算并判断是否出现新的矛盾,如果发现新的矛盾,则执行步骤C5,否则执行步骤C6;C5、对输入变量的取值进行回溯,根据已回溯的次数判断是否还要回溯,如果否,则执行步骤C1;如果是,则根据变量的相关性进行回溯,并判断回溯是否成功,如果成功则返回步骤C3,否则返回步骤C1;C6、条件计数器的当前计数值自增,并判断当前计数值是否等于或超过路径上的条件数,如果是,则得到一个测试用例,否则返回步骤C3。其中,步骤C1进一步包括Cl.l、根据用户给出的待测软件程序元素,通过遍历控制流图生成执行当前程序元素的路径,并判断生成的路径是否为空,如果为空,则结東当前流程并提示用户生成路径失败,否则执行步骤C1,2;C1.2、提取路径中条件语句中的表达式、变量以及能唯一确定值的条件;C1.3、对路径中经步骤B压缩后的原始输入变量定义域再次进行空间压缩;C1.4、计算不可达路径并判断当前路径是否可达,如果当前路径不可达,则返回步骤Cl.l重新生成新路径。上述步骤B进一步包括Bl、在待测软件程序中插装额外的代码,以获得程序在被执行时行为的信息。上述技术方案中,所述方法进一步包括D、对步骤C得到的测试用例进行验证。7该步骤D包括Dl、按照步骤C生成的测试用例驱动执行待测软件程序,并根据插装的代码记录实际执行的路径;D2、比较实际执行路径和目标路径,判断实际执行路径与目标路径是否符合,如果不符合则执行步骤C1;如果符合,则将得到的测试用例存储并将其返回给用户。所述抽象语法树包括表示类型信息的对象和符号表。本发明同时提供了一种软件测试用例自动生成系统,该系统包括分析模块,读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成抽象语法树和控制流预处理模块,通过遍历分析模块生成的抽象语法树,对待测软件源程序进行预处理,所述预处理包括识别原始输入、输出变量,并对原始输入变量的定义域进行空间压缩;测试用例生成模块,对所生成的控制流图进行遍历,循环搜索生成测试用上述技术方案中,所述测试用例生成模块进一步包括路径生成单元,根据用户给出的待测软件程序元素,通过遍历控制流图生成执行当前程序元素的路径;处理单元,用来计算所生成的路径中变量及相关变量的级别,并初始化条件计数器;赋值单元,对所生成路径中的条件语句中的输入变量进行枚举赋值,并判断变量的取值是否为空;蕴涵单元,根据赋值单元中变量的取值进行蕴涵运算,并判断是否出现新的矛盾;回溯单元,在变量的取值为空或出现新的矛盾时,对变量的取值进行回溯;判断单元,条件计数器的当前计数值自增,并判当前计数值是否等于或超过路径上的条件数其中,该系统进一步包括验证模块,利用测试用例生成模块生成的测试用例驱动执行被测程序,并根据插装代码记录实际执行的路径,验证实际执行路径和目标路径是否相符。本发明的软件测试用例自动生成方法及系统,由于釆用了压缩变量的搜索区域、利用分支矛盾计算不可达路径、使用蕴涵运算尽快地发现矛盾、优先计算唯一定值条件等多种启发式策略,所以能够准确地按照给定的待测软件程序元素搜索得到符合要求的测试用例集合,同时本发明还可对生成的测试用例进行验证,提高了测试用例的准确性,大大提高了软件测试的效率与自动化程度。图1为本发明软件测试用例自动生成方法的实现流程示意图;图2为本发明方法中对待测软件进行预处理的流程示意图;图3为本发明方法中自动生成测试用例的实现流程示意图。具体实施例方式下面结合具体实施例和附图对本发明作进一步说明。本发明提供了一种软件测试用例自动生成方法,其基本思想是首先,读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成抽象语法树、控制流图和判断到判断(DD,DecisiontoDecision)图;然后,对被测程序进行预处理,包括识别原始输入、输出变量,并对原始输入变量的定义域进行空间压缩,并进行程序的自动插装等;然后,通过遍历上述控制流图,生成待测软件程序元素的执行路径,对生成路径的变量进行赋值运算、蕴涵运算及回溯运算,生成测试用例;最后,驱动执行被测程序,将上述给出的程序元素的实际执行路径和目标路径进行比较,检查所得测试用例是否符合所要求路径。图l为本发明软件测试用例自动生成方法的实现流程示意图,如图l所示,该方法包括以下步骤步骤1、读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成待测软件的抽象语法树和控制流图。步骤2、通过遍历抽象语法树,对待测软件源程序进行预处理,所述预处理包括识别原始输入、输出变量,并对原始输入变量的定义域进行空间压缩。步骤3、遍历控制流图,生成当前待测软件程序元素的路径,对所生成路径中的变量进行赋值运算、蕴涵运算及回溯运算,生成测试用例。步骤4、利用步骤3生成的测试用例驱动执行待测软件测程序,对得到的测试用例进行验证。其中步骤l具体包括步骤l.l、读取待测软件源程序,对待测软件源程序进行词法分析;对待测软件进行词法分析(Lexicalanalysis),该词法分析为后续形成语法树提供所需要的符号结点,如常量和名字。步骤1.2、在步骤l.l的基础上,对待测软件源程序进行语法分析及语义分析,生成抽象语法树;对待测软件进行语法分析(Parsing),所述语法分析提供了含有代表相应语法结构的中间结点的语法树,该语法树包括表示非保留字终结符的叶子结点和表示语法结构的中间结点;语义分析(Semanticanalysis)对名字和作用域进一步进行处理,生成抽象语法树,该抽象语法树包括表示类型信息的对象和符号表,并将它们连接成树形结构,这是编译器前端的最根本的输出,抽象语法树包含所有的从源代码所得到的相关信息,并且能够完全体现源程序的语法结构。上述抽象语法树具有一致的结构模式,由不同类型的节点组成,每一类节点都被描述成一个类结构。所有的语法树结点都支持一个统一的访问者模式接口,这样就能很方便地对抽象语法树通过访问者模式进行进一步的不同形式的加工、遍历访问和输出。步骤1.3、在所生成抽象语法树的基础上生成控制流图和DD这个过程是一个遍历抽象语法树的过程。通常,一个程序控制流图可表示为(N,E,Entry,Exit)。其中,N代表结点的集合,反映程序中的语句和条件判断;E代表有向边的集合,反映程序中语句间的控制流关系;Entry为程序固定的唯一入口结点;Exit为程序唯一的退出结点。简单地说控制流图就是具有单一、固定入口结点和出口结点的有向图。在控制流图的基础上可分析形成DD图。DD图是一种简化了的控制流图控制流图中的某些节点只处在程序的同一个分支上,这种节点在路径分析时并无特殊用处,有时反而降低控制流图的分析效率,需要简化。将控制流图进一步简化,得到的这种除了入口和出口节点之外,其余节点的度数都大于2的控制流图称为DD图。步骤2具体包括步骤2.1、通过遍历抽象语法树,识别原始输入变量,并确定其定义域;原始输入变量通常包括函数参数、函数中用到的全局变量和静态变量,首先通过遍历抽象语法树,识别出这些变量。变量的定义域通常根据被测程序的语言中对应的类型和操作系统运行环境来确定。变量定义域的格式为{(xl,Dxl),(x2,Dx2V..},其中x代表变量名,D代表其定义域。步骤2.2、通过遍历抽象语法树,识别输出变量与输出语句;识别出程序的全局变量、静态变量、输出语句、返回语句和引用型参数。步骤2.3、对原始输入变量的定义域进行空间压缩;根据原始输入变量的定义域、程序中的赋值和条件语句,自上而下进行空间压缩,压缩的结果是{(xl,D'xl),(x2,D'U;原始输入变量的定义域由变量的类型和操作系统运行环境已经决定,计算程序中的赋值和条件语句的限定范围,对原始输入变量的取值空间进一步压缩。步骤2进一步包括步骤2.4、在被测软件程序中插入额外的代码,以获得程序在被执行时行为的信息;上述额外的代码可以是语句。插装主要根据控制流图来确定插装点,在被测程序控制流图的开始、分支处对被测程序实施插装,然后生成抽象语法树上的插装语句树结点,然后将抽象语法树重新转换输出为源程序。例如,下列程序if(x>0){x=-3;经过自动插装后形如if(x>0){branch[1]++;〃自动插入的语句x=3;branch[2]++;〃自动插入的语句x=-3;在执行被测程序的过程中,就可以收集程序实际执行的路径信息。步骤3中通过遍历控制流图,使用压缩变量的搜索区域、利用分支矛盾计算不可达路径、使用蕴涵运算尽快地发现矛盾以及优先计算唯一确定值条件等多种启发测试策略,循环搜索生成测试用例;该步骤3具体包括步骤3.1、根据用户给出的待测软件程序元素E,通过遍历控制流图生成执行当前程序元素E的路径P,并判断生成的路径P是否为空,如果为空,则结東当前流程并提示用户生成路径失败,否则执行步骤3.2;上述路径P不一定唯一,用户给出的待测软件程序元素E可以是语句、条件或路径(如果E是路径那么P就只能是E,并且唯一)等,按照用户预先给出的待测软件程序元素E,根据控制流图和DD图自动生成执行程序元素E的一条路径P,P={B"B2—...—BL},该路径不一定唯一,在路径P上,从上到下也给出了一个条件集合(B"B2—…—Bl);如果生成的路径包含控制流图节点,则该路径不为空;如果生成的路径不包含控制流节点,则该路径为空。步骤3.2、提取路径P中条件语句中的表达式、变量以及能唯一确定值的条件;将条件语句中表达式和变量提取出来,其中,表达式用于条件的计算,变量作为后续搜索过程的操作对象。这个过程是沿着步骤3.1给出的路径P来进行的,过程中还要考虑路径上赋值语句。某些条件能够唯一地确定某个或某些变量的值。而这些隐含的值就如同赋值一样,不再需要进一步搜索。这可以大大缩少搜索空间。对这种条件要优先进行计算;例如,条件语句if(a==3).",此时,变量a的取值空间就只能是(3);上述优先计算能唯一确定值的条件的策略衍生的一个搜索原则是有限区域优先搜索某些变量在最初或经过某些条件约束,使搜索区域变得只有有限几个点,在这种条件下优先搜索这种变量有助于尽早发现矛盾或搜索成功。例如,假设x为一个整型变量,if(l^x。)…,该条件确定了xe[l,2,3]。步骤3.3、对路径P中的原始输入变量定义域空间再次进行压缩;对路径P中经步骤2.3压缩后的原始输入变量定义域空间再次进行压缩,因为在步骤3.2中找到的能唯一确定值的条件,会影响某些变量的搜索区域,因此变量的搜索区域要随时变化,以减少变量的搜索空间;根据路径P和((xl,D'xl),(x2,D'x2),-},再次对定义域进行空间压缩,压縮的结果是(xl,D〃xl),(x2,D'、),.,.}。步骤3.4、计算不可达路径并判断当前路径P是否可达,如果当前路径不可达,则返回步骤3.1重新生成新路径;不可达路径是指在给定的输入区间内,该路径是永远不可能被执行。根据步骤3.3的结果,检查每个变量的取值空间是否为空,如果某个变量的取值空间为空则意味着当前路径P为不可达路径,则返回步骤3.1;分析表明,一般的程序中存在大量的不可达路径。在产生测试用例的过程中,选择不可达路径是可能的,这也是影响测试效率的主要因素之一,因此应该尽早停止对该路径的计算,返回步骤3.1以重新生成一条新的不同路径,从而排除那些不可达路径。例如if(x>0){x=3;if(x<0){x=4;在上述例子中,待测软件程序元素E指的是要覆盖语句x=3;程序中两个if条件取真值的分支组成的路径实际上就是一个不可达路径,因为xX)和x<0是两个矛盾的条件。步骤3.5、计算当前路径P中变量及相关变量的级别;一个变量直接或间接影响的变量称为相关变量。根据变量的相关性,可以建立变量的相关链。某变量的直接前趋相关变量是指在该相关链中该变量的第一个前趋变量,主要用于回溯。变量的级别,其定义为输入变量的级别定义为1;一个中间输出变量的级别定义为该变量的表达式中的变量的最大级别加1。变量的级别对于变量的回溯是有价值的。步骤3.6、初始化条件计数器;路径P包含的多个条件形成条件集合(B!—B2—…—B!J,需要一个条件计数器来记录当前处理的条件。当前处理的条件记为Bi,初始化条件计数器的计数值1=1。步骤3.7、对路径P中条件语句的输入变量进行枚举赋值(回退(Backtracing))并判断变量的取值是否为空,如果为空则执行步骤3.9;每次赋值都要有记录,用于防止赋过的值再赋,取值为空意味着变量在取值空间中的取值都被赋过了。取值空间为空和该次取值为空是两个概念,取值14空间虽然不为空,但是所有的值都取过了,这时候会返回空值;首先提取Bi中尚无定值变量集合。在条件Bi为真的约束下,从变量集合中选择一个变量,依据其取值空间,根据启发式规则选择一个值,并判断该值是否为空,每次取值都要保证不能取那些已经取过了的值,因此有可能取值空间虽然不为空,但是所有的指都取过了,这时候会返回空值。步骤3.S、根据步骤3.7中变量的取值进行蕴涵运算并判断是否出现新的矛盾,如果发现新的矛盾则执行步骤3.9,否则执行步骤3.10;蕴涵(值蕴涵,取值域运算)并根据变量的取值空间是否为空判断是否出现新的矛盾;蕴涵是指在步骤3.7中一个变量被枚举赋值之后,计算该变量对其他相关变量的影响,调整其他相关变量由于这次赋值而产生的取值空间变化;蕴涵运算主要是为了尽快地发现矛盾。在蕴涵计算过程中;当一个或一组新的变量值被确定之后,对这个或这组新的值实施蕴涵运算可以尽快的发现矛盾,同时对软件来说,蕴涵可以确定更多相关变量的值或取值范围,这样,也可以压缩搜索空间的范围,提高搜索效率。步骤3.9、对变量的取值进行回溯,根据已经回溯的次数来判断是否还要回溯,如果否,则返回步骤3.1,如果是,则根据变量的相关性进行回溯,并判断回溯是否成功,如果成功则返回步骤3.7,否则返回步骤3.1;对变量的取值进行回溯,回到步骤3.1看还有没有别的没有取过的值可以取,根据已回溯(Backtracking)次数是否在测试系统设置的给定范围内判断是否还要回溯;根据步骤3.5就近相关回溯到Bk,回溯次数加l,条件计数器的当前计数值i置为回溯到的条件k。根据回溯到的条件是否还有能继续搜索的尚无定值变量判断回溯是否成功;如果回溯到的条件也不能继续搜索了,也就是说回溯到的条件中的变量取值空间虽然不为空,但是所有的值都取过了,这时候返回空值。当产生矛盾时,就要实施回溯。回溯有利于减少不必要的运算,算法在搜索的过程中,某些变量的取值可能会产生矛盾,而一旦矛盾产生,就应该停止继续运算,重新选择新的赋值。单个条件在同一个条件Bi中,可能存在两个或两个以上的拥有相同或相关的变量时,可能会产生矛盾,这个矛盾只是局限于在Bi内部。由于在回退(Backtracing)过程发生的变量赋值或蕴涵功能,会改变某些变量的取值或取值范围,因此就有可能产生矛盾。回退是指对输入变量赋一个新的值,并保证该值和已经赋过的值不重复。多个条件在(BpB2,…,Bm)中,存在两个或两个以上的分支条件拥有相同或相关的变量时,可能会产生矛盾。例如B,if(a〉4)…,B广if(a<=3)...,就可能会产生矛盾。假设(x",xi2,…,xnJ是Bi所涉及的变量集合,{xml,xm2,…,x一是已经确定值的变量的集合,{Xjl,xj2,…,Xjd是本次运算需要赋值的变量集合,{xnl,xn2,…,xnH}G{Xjl,Xj2,…,XjL)是本次运算发生矛盾的变量的集合,{Bu,Bi2,…,B^是和(xm,xn2,…,Xn^相关的分支集合,则从Bij开始依次回溯。一般来讲,级别低的变量优先回溯,这样计算比较简单。步骤3.10、条件计数器的当前计数值自增并判断当前计数值是否等于或超过路径P上的条件数,如果是则得到一个测试用例,然后执行步骤4,否则返回步骤3.7;上述条件数是由被测程序本身决定的,计数器的计数值初始化为1,条件计数器的当前计数值自增1。例如if(x>0){x=3;if(x>3){x=4;上面两个if条件取真值组成的路径就包含xX)和x〉3两个条件。如果当前条件计数值为2则说明处理的是这条路径上的第2个条件了。步骤4进一步包括步骤4.1、根据步骤3.10生成的测试用例驱动执行待测软件测程序,并根据插装代码记录实际执行的路径;步骤4.2、比较实际执行路径和目标路径,判断实际执行路径与目标路径是否符合,如果不符合则返回步骤3.1;如果符合,则将得到的测试用例存储并将其返回给用户。前面的插装代码记录了实际的执行路径,将其和目标路径进行对比,如果不符合(即不相同),说明得到的测试用例并不能覆盖待测软件程序元素E,就要重新生成,这是由于测试用例生成过程中的一些简化近似计算造成的。下列是两个比较典型的例子,表现在程序结构复杂、路径多,釆用一般的算法(遗传算法、随机法、爬山法、探索法、解方程法)需要大量的时间。例1:曰历转换禾呈序calconv(source,year,month,date,days)。该禾呈序由C十+编写,包括三个模块,分别是主程序、闰年判断程序GetLeap和转换计算程序cdconv。例2:画扇形程序由中心、半径及起点、终点夹角画扇形。函数形式为Scir2(row,col,a,b,tl,t2,color,xor)。表l为程序描述,如表1所示。块数变量分支矛盾对矛盾程序名行数分支路径数目数目计算的矛盾路径百目数目路径数目比例calconv16571554324083112496%Scir2129556511105989139283%表11)(分支覆盖测试就是要覆盖程序的每个分支,路径覆盖就是要覆盖程序每条有效路径(可达路径))分支覆盖测试(这里的E就是某个分支)随机生成测试用例,检验不同搜索区域对测试效率的影响。表2为分支覆盖测试结果,如表2所示,可以看出,搜索区域的增大,会对测试效率产生很重要的影响。<table>tableseeoriginaldocumentpage18</column></row><table>表22)cakonv的路径测试。对每条有效路径,釆用随机生成用例技术(这里的E就是某个路径),输入取值范围选择表1的第一组,测试结果如表2所示的"测试时间l",表3为分别加入各种启发测试策略(压缩变量的搜索区域,利用分支矛盾计算不可达路径,使用蕴涵运算尽快地发现矛盾,优先计算唯一确定值条件)的测试效果比较,所测试的路径数目如表3中的"所测试的路径数目1"。<table>tableseeoriginaldocumentpage18</column></row><table><table>tableseeoriginaldocumentpage19</column></row><table>测试时间2是去掉不可达路径后的测试时间。就平均来说,测试时间2是测试时间1的37%,提高效率2.7倍。测试时间3是利用搜索空间压缩技术、去掉不可达路径技术的测试结果,可以看出,测试时间3比测试时间2稍微多一点,主要是增加了一些额外的计算,但所测试的路径数目却大大增加。就测试同样的路径数目来说,运用该技术所需要的回溯次数至少比不运用该技术要少1个数量级。测试时间4是利用搜索空间压縮技术、去掉不可达路径、条件推算技术、蕴涵技术、唯一确定条件技术的测试结果。实际上,在该例子中,对上述给出的定义域,该程序的可执行路径数目只有329条。3)Scri2的路径测试。表4为各种启发式测试策略的测试结果比较,其中的各个参数的含义同表3。由于所给出的例子比较少,所以对于回溯而言,calconv平均能节省4s,Scri2平均能节省3s,其效果并不明显,主要原因是例子太少。考虑到一般的函数,根据软件工程的标准,一般也就在数十行到数百行,所以,回溯的用途不是很大。限定测试测试所测测试所测试测试所测试随机时间1时间试的时间3的路径时间4的路径码数2路径数目2数目3百数目1<table>tableseeoriginaldocumentpage20</column></row><table>表4由上所述的结果可知,由于本发明的软件测试用例自动生成方法与系统釆用了多种启发式策略,所以能够准确地按照给定的待测软件程序元素搜索得到符合要求的测试用例集合,大大提高软件测试的效率与自动化程度。为了实现上述软件测试用例自动生成方法,本发明还提供了一种软件测试用例自动生成系统,该系统包括分析模块、预处理模块、测试用例生成模块以及验证模块。其中,分析模块,读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成抽象语法树、控制流图。预处理模块,通过遍历分析模块生成的抽象语法树,对待测软件源程序进行预处理,所述预处理包括识别原始输入、输出变量,并对原始输入变量的定义域进行空间压缩。测试用例生成模块,对所生成的控制流图进行遍历,生成当前待测软件程序元素的路径,对该路径中的变量进行赋值运算、蕴涵运算及回溯运算,循环搜索生成测试用例。验证模块,利用测试用例生成模块生成的测试用例驱动执行被测程序,并根据插装代码记录实际执行的路径,验证实际执行路径和目标路径是否相符。上述技术方案中,验证模块利用测试用例生成模块生成的测试用例驱动执行待测软件程序,并根据插装代码记录实际执行的路径,如果实际执行路径和目标路径符合,则将得到的测试用例存储并将其返回给用户,否则测试用例生成模块重新生成新的测试用例。其中,测试用例生成模块进一步包括路径生成单元,根据用户给出的待测试程序元素,通过遍历控制流图生成执行当前程序元素的路径;处理单元,用来计算所生成路径中变量及相关变量的级别,并初始化条件计数器;赋值单元,对所生成路径中的条件语句中的输入变量进行枚举赋值并判断变量的取值是否为空,如果为空则发指令给回溯单元,对变量的取值进行回溯,否则发指令给蕴涵单元进行值的蕴涵运算;蕴涵单元,根据赋值单元中变量的取值进行蕴涵运算,并判断是否出现新的矛盾,如果发现新的矛盾则发指令给回溯单元,对变量的取值进行回溯,否则执行判断单元;回溯单元,对变量的取值进行回溯,根据已经回溯的次数来判断是否还要回溯,如果否,则发指令给路径生成单元;如果是,则根据变量的相关性进行回溯,并判断回溯是否成功,如果成功则发指令给赋值单元,否则发指令给路径生成单元;判断单元,条件计数器的当前计数值自增,并判断当前计数值是否等于或超过路径上的条件数,如果超过则得到一个测试用例,否则赋值单元对当前条件语句中的输入变量进行枚举赋值。所述控制流图为除了入口和出口节点之外,其余节点的度数都大于2的控制流图。以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。权利要求1、一种软件测试用例自动生成方法,其特征在于,该方法包括以下步骤A、读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成待测软件的抽象语法树和控制流图;B、遍历所生成的抽象语法树,对待测软件源程序进行预处理,所述预处理包括识别原始输入、输出变量,并对原始输入变量的定义域进行空间压缩;C、遍历控制流图,生成当前待测软件程序元素的路径,对所生成路径中的变量进行赋值运算、蕴涵运算及回溯运算,生成测试用例。2、根据权利要求l所述的软件测试用例自动生成方法,其特征在于,所述步骤C具体包括Cl、根据用户给出的待测软件程序元素,通过遍历控制流图生成执行当前程序元素的路径;C2、计算所生成路径中变量及相关变量的级别,并初始化条件计数器;C3、对步骤Cl所述路径中条件语句的输入变量进行枚举赋值,并判断变量的取值是否为空,如果为空则执行步骤C5,否则执行步骤C4;C4、根据步骤C3中输入变量的取值进行蕴涵运算并判断是否出现新的矛盾,如果发现新的矛盾,则执行步骤C5,否则执行步骤C6;C5、对输入变量的取值进行回溯,根据已回溯的次数判断是否还要回溯,如果否,则执行步骤C1;如果是,则根据变量的相关性进行回溯,并判断回溯是否成功,如果成功则返回步骤C3,否则返回步骤C1;C6、条件计数器的当前计数值自增,并判断当前计数值是否等于或超过路径上的条件数,如果是,则得到一个测试用例,否则返回步骤C3。3、根据权利要求2所述的软件测试用例自动生成方法,其特征在于,所述步骤C1进一步包括Cl.l、根据用户给出的待测软件程序元素,通过遍历控制流图生成执行当前程序元素的路径,并判断生成的路径是否为空,如果为空,则结東当前流程并提示用户生成路径失败,否则执行步骤CL2;Cl.2、提取路径中条件语句中的表达式、变量以及能唯一确定值的条件;C1.3、对路径中经步骤B压缩后的原始输入变量定义域再次进行空间压缩;C1.4、计算不可达路径并判断当前路径是否可达,如果当前路径不可达,则返回步骤Cl.l重新生成新路径。4、根据权利要求1-3任一项所述的软件测试用例自动生成方法,其特征在于,所述步骤B进一步包括Bl、在待测软件程序中插装额外的代码,以获得程序在被执行时行为的信白&、o5、根据权利要求4所述的软件测试用例自动生成方法,其特征在于,所述方法进一步包括D、对步骤C得到的测试用例进行验证。6、根据权利要求5所述的软件测试用例自动生成方法,其特征在于,步骤D包括Dl、按照步骤C生成的测试用例驱动执行待测软件程序,并根据插装的代码记录实际执行的路径;D2、比较实际执行路径和目标路径,判断实际执行路径与目标路径是否符合,如果不符合则执行步骤C1;如果符合,则将得到的测试用例存储并将其返回给用户。7、根据权利要求6所述的软件测试用例自动生成方法,其特征在于,所述抽象语法树包括表示类型信息的对象和符号表。8、一种软件测试用例自动生成系统,其特征在于,该系统包括分析模块,读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成抽象语法树和控制流图;预处理模块,通过遍历分析模块生成的抽象语法树,对待测软件源程序进行预处理,所述预处理包括识别原始输入、输出变量,并对原始输入变量的定义域进行空间压缩;测试用例生成模块,对所生成的控制流图进行遍历,循环搜索生成测试用例。9、根据权利要求8所述的软件测试用例自动生成系统,其特征在于,所述测试用例生成模块进一步包括路径生成单元,根据用户给出的待测软件程序元素,通过遍历控制流图生成执行当前程序元素的路径;处理单元,用来计算所生成的路径中变量及相关变量的级别,并初始化条件计数器;赋值单元,对所生成路径中的条件语句中的输入变量进行枚举赋值,并判断变量的取值是否为空;蕴涵单元,根据赋值单元中变量的取值进行蕴涵运算,并判断是否出现新的矛盾;回溯单元,在变量的取值为空或出现新的矛盾时,对变量的取值进行回溯;判断单元,条件计数器的当前计数值自增,并判当前计数值是否等于或超过路径上的条件数。10、根据权利要求8或9所述的软件测试用例自动生成系统,其特征在于,该系统进一步包括验证模块,利用测试用例生成模块生成的测试用例驱动执行被测程序,并根据插装代码记录实际执行的路径,验证实际执行路径和目标路径是否相符。全文摘要本发明提供一种软件测试用例自动生成方法,该方法包括A.读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成待测软件的抽象语法树和控制流图;B.通过遍历所生成的抽象语法树,对待测软件源程序进行预处理识别原始输入、输出变量并对原始输入变量的定义域进行空间压缩;C.通过遍历控制流图,生成当前待测软件程序元素的路径,对该路径中的变量进行赋值运算、蕴涵运算及回溯运算,生成测试用例。本发明还提供了一种软件测试用例自动生成系统。本发明的软件测试用例自动生成方法及系统能够准确地按照给定的待测软件程序元素自动生成测试用例,对生成的测试用例进行验证,提高了测试用例的准确性、效率及自动化程度。文档编号G06F9/44GK101436128SQ20071017753公开日2009年5月20日申请日期2007年11月16日优先权日2007年11月16日发明者宫云战,威张,杨朝红,王雅文,庆肖,陈俊亮申请人:北京邮电大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1