一种面向路径的测试数据自动生成方法

文档序号:6591052阅读:529来源:国知局
专利名称:一种面向路径的测试数据自动生成方法
技术领域
本发明涉及计算机软件测试中为指定的程序路径自动生成测试数据的方法,尤其是指定的程序路径中包括函数调用或者可执行程序调用时的测试数据自动生成方法。
背景技术
计算机及软件在国民经济和社会生活等方面的应用越来越广泛和深入。人们在开发软件的过程中难免会引入错误。软件测试是揭示软件错误的重要手段。在软件测试中,面向路径的测试数据生成问题可以描述为给定一个程序P和P中一条路径W,设P的输入空间为D,求x∈D,使得P以x为输入运行,所经过的路径为W。软件测试中的控制流测试中诸如语句覆盖、分支覆盖、条件覆盖、判定一条件覆盖、路径覆盖等问题,数据流测试中的定义覆盖、引用覆盖等问题,组装测试中的凋用对覆盖、数据流测试等问题,以及面向断言的测试和回归测试中的一些问题都可以归结为该问题。目前,测试人员一般采用手工方法寻找x。自动求解面向路径的测试数据将有效地提高软件测试的效率和质量。
解决面向路径的测试数据生成的关键在于约束系统的建立和求解。建立约束系统的困难是分析、化简路径W上的各种语句成分和各种数据类型,建立尽可能简洁的约束系统;求解约束系统的主要困难是处理可能存在的非线性约束。Matiyasevi 和E.J.Weyuker等人的研究表明不存在通用的有效的算法,对于任意的P和W,能生成使W被经过的程序输入。但是实际应用的需要迫使人们进行研究,并提出各种方法求解该问题。
对于某种面向路径的测试数据生成方法,当W上存在函数调用或者可执行程序调用,但是没有提供被调用的函数或程序的源代码,只是给出该函数编译后的目标代码或程序编译后的可执行代码,且后面的谓词函数对这些目标代码或可执行代码存在数据依赖关系,此时,若该方法仍能生成测试数据,则称该方法能够用于黑盒测试,否则称该方法不能用于黑盒测试。
目前,国内外面向路径的测试数据生成方法可分为四类随机法、试探法、静态法和动态法。随机法实质上是困难的。试探法主要包括遗传算法和模拟退火法两种。遗传算法本身很复杂,其理论研究目前相当有限,结果也不太深入,作为遗传算法的理论基石之一的隐性并行性的证明还存在严重缺陷。模拟退火法的收敛速度很缓慢。静态法包括符号执行法和区间算术法,它们都需要对W上的语句进行转换,故不能用于黑盒测试。符号执行方法通常要进行复杂的代数运算,且难于处理依赖于输入变量的循环条件、数组元素下标和函数调用。区间算术法需要对变量的取值区间进行对分穷举,当变量的取值区间为无穷区间时,该方法也是困难的。动态法可分为直线式程序法和Bogdan Korel、M.Gallagher等人、Neelam Gupta等人分别提出的方法等几种。直线式程序法要求用户先提供所有整数类型的变量值,并且在数值优化过程有可能陷于局部极值。Bogdan Korel和M.Gallagher等人分别提出的方法一次只考虑一个分支谓词和一个输入变量,且使用回溯技术,迭代次数多,资源消耗大;且Bogdan Korel提出的方法为了减小搜索的盲目性,需要采用动态数据流分析技术确定影响分支谓词的变量,不能用于黑盒测试。
Neelam Gupta等人于1998年在ACM SIGSOFT第六届软件工程基础国际研讨会的论文集(Proceedings of The ACM SIGSOFT Sixth InternationalSymposium on the Foundations of Software Engineering)上发表的论文“Automated test data generation using an iterative relaxationmethod”中提出一种动态方法,从程序输入空间D中任选一组程序输入考察W上各分支谓词,通过静态、动态数据流分析确定各谓词函数对于输入变量的依赖关系,构造谓词片和动态切片,建立这些谓词函数关于当前输入的线性算术表示,然后建立输入变量的增量的线性约束系统,进而建立输入变量的增量的线性方程系统,采用高斯消去法求解后得到各输入变量的增量,从而获得一组新的程序输入。
该方法在构造线性约束系统的过程中必须分析W上各语句之间的静态、动态数据依赖关系,故构造线性约束系统的效率较低,求解问题的能力较弱,不能用于黑盒测试当W上有循环语句时,必须指明该循环的循环体执行的次数,并将循环在W上展开;当W上存在函数调用时,需要采用类似宏替换的方法用实参替换被调用的函数体中的形参,将被调用的函数体在调用处展开。该方法不允许W上有goto语句;且该方法采用高斯消去法求解所建立的线性方程系统存在以下缺点若自由变量取值不适当,可能导致线性方程系统不相容。
Neelam Gupta等人于1999年在IEEE第十四届自动化软件工程国际会议的论文集(Proceedings of The 14th IEEE International Conference onAutomated Software Engineering)上发表的论文“UNA based iterativetest data generation and its evaluation”中提出基于最小二乘解的约束求解方法,克服了基于高斯消去法的约束求解方法的缺点,但仍存在以下缺点(1)存在这样的线性混合整数规划问题,至少有一组解,但是基于最小二乘解的约束求解方法找不到;(2)对于所有规模的问题,基于最小二乘解的约束求解方法寻找实数值解的迭代算法在最坏情况下不收敛。
Jon Edvardsson等人于2001年在第八届欧洲软件工程会议与ACMSIGSOFT第九届软件工程基础国际研讨会的联合会议的论文集(Proceedings of The Joint 8th European Software EngineeringConference and 9th ACM SIGSOFT Symposium on the Foundations ofSoftware Engineering)上发表的论文“Analysis of the constraint solverin UNA based test data generation”中提出的基于线性规划、线性整数规划、线性混合整数规划的约束求解方法可以克服基于最小二乘解的约束求解方法的缺点。但是基于线性规划、线性整数规划、线性混合整数规划的约束求解方法仍存在以下缺点存在可行的W,并且W上某些谓词函数中含有输入变量的非线性函数,由于采用线性算术表示对谓词函数进行线性化,根据某些初始程序输入建立的线性约束系统转化为一个矛盾的线性方程系统,如果采用基于线性规划、线性整数规划、线性混合整数规划的约束求解方法,则无法生成相应的测试数据。此外,人们在建立约束系统后,还研究了一些其它的约束求解方法,效果均不理想。

发明内容
本发明所要解决的技术问题就是针对现有的面向路径W测试数据自动生成方法的不足,提出一种新的测试数据自动生成方法,无须分析W上各语句之间的数据依赖关系,通过计算W上各谓词函数的线性算术表示,为输入变量建立线性约束系统,采用线性规划、线性整数规划、线性混合整数规划和最小二乘解法相结合的约束求解方法,经过若干次迭代寻找所需的测试数据,该方法既能用于白盒测试,又能用于黑盒测试。
本发明的技术方案是本发明由输入接口、词法分析器、语法分析器、约束构造器、约束求解器、路径满足检查器、输出接口模块实现测试数据自动生成。本发明总体逻辑结构是用户指定程序路径W,词法分析器对W进行词法分析后,语法分析器根据词法分析的结果对W进行语法分析,将W转换为约束构造程序和路径满足检查程序,约束构造程序经编译产生约束构造器,路径满足检查程序经编译产生路径满足检查器;约束构造器根据当前程序输入和各输入变量的增量执行W上的语句,不分析W上的语句之间的数据依赖关系,构造W上各谓词函数的线性算术表示,然后建立输入变量的线性约束系统;约束求解器采用线性规划、线性整数规划、线性混合整数规划和最小二乘解法相结合的方法求解线性约束系统若W上的谓词函数均为输入变量的线性函数,则采用基于线性规划、线性整数规划、线性混合整数规划方法求解,若W上的谓词函数中含有输入变量的非线性函数,则采用线性规划、线性整数规划、线性混合整数规划和最小二乘解法相结合的方法求解;求解后获得新的程序输入即测试数据;最后由路径满足检查器进行检查,若该程序输入能使W被经过则结束,若该程序输入不能使W被经过则根据W上所有谓词函数是否为输入变量的线性函数以及迭代次数上限决定是否继续迭代求解;求解结果由输出接口输出。本发明定义了以下四个名词定义1.分支谓词程序路径W上具有明确取值要求的判断语句中的条件表达式称为分支谓词。不失一般性,设分支谓词为Exp1?Exp2的形式,其中Exp1?Exp2是关系表达式,Exp1和Exp2是算术表达式,?∈{>,≥,=,<,≤}。
循环语句可以转换为等价的用判断语句和转移语句表达的形式。当人们关心W上的循环体的内部执行情况时,可以将循环展开。当人们不关心循环体的内部执行情况时,可以直接将该循环作为一个黑盒放在W上,不必将其展开。
当人们不关心W上判断语句是执行“真”分支还是“假”分支时,可以直接将该判断语句作为一个黑盒放在W上。定义2.谓词结点称分支谓词所在的判断语句为谓词结点。定义3.谓词函数谓词结点的分支谓词Exp1?Exp2可被转换成等价的分支谓词形式F?0,其中F为算术表达式Exp1-Exp2,称F为该谓词结点的谓词函数。定义4.线性算术表示设ni为W上的谓词结点,并且X=<x1,…,xt>和Y=<y1,…,yt)为程序输入和输入变量的增量,其中t为W上输入变量的个数,yj≠0,j=1,...,t,若ni的谓词函数为F,则称L(i,X,Y,W)=di1v1+…+ditvt+ci为W上ni处F关于X和Y的线性算术表示,其中dij=(Pnewij-Poldi)/yj,ci=Poldi-di1×x1-…-dit×xt,Poldi和Pnewij分别为按照程序输入X和X+<0,…,0,yj,0,…,0>依次执行W上的ni之前的除谓词结点之外的语句,计算F所得之值。
本发明允许程序中变量的数据类型为整数类型,实数类型,基本数据类型为整数类型或实数类型的数组、结构等复合类型,以及指向上述各种类型的指针类型。
如果程序中包含了布尔类型的变量,就将其转化为实数类型,用大于或等于零的数表示“真”值,用负数表示“假”值。如果一条路径上的某分支谓词中的条件表达式由两个或两个以上的布尔类型的变量的合取组成(如A∧B),那么就将这个分支谓词视同在经过该路径时必须同时满足的多个分支谓词A≥0、B≥0。如果一条路径上的某分支谓词中的条件表达式由两个或两个以上的布尔变量的析取组成(如A∨B),那么在该路径上一次只取一个分支谓词A≥0或B≥0与其它分支谓词一起考虑。如果用其中的一个没找到解,就试另一个。
若分支谓词为Exp1≠Exp2,则将其转化为等价的形式(Exp1>Exp2)∨(Exp1<Exp2),然后按与布尔类型的变量的析取类似的方法进行处理即可。
字符类型的变量的取值实质上是取值范围受限的整数值。对于字符类型的变量,用ASCII字符集将字符类型的值映射为整数类型,并引入附加的约束以限制它的整数解落在有效的取值范围内,然后用ASCII字符集将整数解映射回相应的字符类型的值。按类似的方法可以处理枚举类型的变量。
W中允许包括函数调用或者可执行程序调用,本发明将被调用的函数或可执行程序视为黑盒,直接将调用语句放在W上。若黑盒中包含输入语句,用户还需提供黑盒的接口规范规定的黑盒中的输入变量的个数及各输入变量的数据类型。
本发明具体实现步骤是1.用户从输入接口指定程序路径W、各输入变量的初值和增量以及其它参数值,如W上的所有谓词函数是否均为输入变量的线性函数、当W上的某谓词函数为输入变量的非线性函数时迭代求解的次数上限、以及当W上存在黑盒且黑盒中包含输入语句时,根据黑盒的接口规范所规定的黑盒中的输入变量的个数及各输入变量的数据类型等。
2.词法分析器对W进行词法分析后,语法分析器根据词法分析的结果对W进行语法分析,将W转换为约束构造程序和路径满足检查程序,约束构造程序经编译产生约束构造器,路径满足检查程序经编译产生路径满足检查器。
3.约束构造器根据当前程序输入和各输入变量的增量执行W上的语句,构造W上各谓词函数的线性算术表示,方法是用户输入程序路径W、输入变量的初值X=<x1,…,xt>和输入变量的增量Y=<y1,…,yt>。对于W上的m个谓词结点n1…,nm,依次令ni的谓词函数的线性算术表示为L(i,X,Y,W)=di1v1+…+ditvt+ci,按照X依次执行W上的ni之前的除谓词结点之外的语句,计算ni的谓词函数值Poldi,并且令ci=Poldi,其中i=1,...,m。然后计算各线性算术表示的系数值和常数项,计算方法是对于W上的t个输入变量v1,…,vt的初值x1,…,xt,依次将第j个输入变量vj的值xj与其增量yj相加,其余输入变量的值保持不变,将新的输入记作Z,然后按照Z依次执行W上的ni之前的除谓词结点之外的语句,计算ni的谓词函数值Pnewij,并且令dij=(Pnewij-Poldi)/yj,ci=ci-dij×xj,其中i=1,...,m,j=1,...,t。然后建立输入变量的线性约束系统如果谓词结点nj的分支谓词F?0的值应该为“真”,那么由nj的谓词函数的线性算术表示L(i,X,Y,W)建立的线性约束为L(i,X,Y,W)?0,其中的关系操作符与F?0中的相同;如果谓词结点ni的分支谓词F?0的值应该为“假”,那么由ni的谓词函数的线性算术表示L(i,X,Y,W)建立的线性约束为L(i,X,Y,W)??0,其中的关系操作符“??”与F?0中的“?”相反,即当“?”为“>”时,“??”为“≤”;当“?”为“≥”时,“??”为“<”;当“?”为“<”时,“??”为“≥”;当“?”为“≥”时,“??”为“<”;当“?”为“=”时,“??”为“≠”,即(L(i,X,Y,W)>0)∨(L(i,X,Y,W)<0)。
4.约束求解器采用线性规划、线性整数规划、线性混合整数规划和最小二乘解法相结合的方法求解该线性约束系统若用户指定W上的谓词函数均为输入变量的线性函数,则采用线性规划、线性整数规划、线性混合整数规划方法求解;若用户指定W上的谓词函数中含有输入变量的非线性函数,则先采用线性规划、线性整数规划、线性混合整数规划方法求解,若无法找到解,则将该线性约束系统转换为线性方程系统,求它的最小二乘解。
4.1若用户指定W上的谓词函数均为输入变量的线性函数,并且线性规划、线性整数规划、线性混合整数规划方法找到解,则由路径满足检查器进行检查,若该解能使W被经过则从输出接口输出解,然后结束;若该解不能使W被经过则从输出接口给出求解精度可能不够的警告,然后结束。
4.2若用户指定W上的谓词函数均为输入变量的线性函数,所有输入变量均无整数限制,并且线性规划方法找不到解,则从输出接口给出W不可行的结论,然后结束。
4.3若用户指定W上的谓词函数均为输入变量的线性函数,某输入变量有整数限制,并且线性整数规划、线性混合整数规划方法找不到解,则从输出接口给出W可能不可行的结论,然后结束。
4.4若用户指定W上的某谓词函数为输入变量的非线性函数,则先采用线性规划、线性整数规划、线性混合整数规划方法求解,若找到解,则由路径满足检查器进行检查,若该解能使W被经过则从输出接口输出解,然后结束;若该解不能使W被经过,并且当前迭代次数已经达到用户指定的迭代次数上限,则从输出接口给出W可能不可行的结论,然后结束;若该解不能使W被经过,并且当前迭代次数尚未达到用户指定的迭代次数上限,则当前迭代次数加一,将该解作为新的当前程序输入,转第3步进行下次迭代。
4.5若用户指定W上的谓词函数中含有输入变量的非线性函数,则先采用线性规划、线性整数规划、线性混合整数规划方法求解,若找不到解,则将该线性约束系统转换为线性方程系统,求它的最小二乘解。由路径满足检查器进行检查,若该最小二乘解能使W被经过则从输出接口输出该最小二乘解,然后结束;若该最小二乘解不能使W被经过,并且当前迭代次数已经达到用户指定的迭代次数上限,则从输出接口给出W可能不可行的结论,然后结束;若该最小二乘解不能使W被经过,并且当前迭代次数尚未达到用户指定的迭代次数上限,则当前迭代次数加一,将最小二乘解作为新的当前程序输入,转第3步进行下次迭代。
采用本发明进行软件测试数据自动生成可以达到如下有益效果1.无须分析程序路径W上各语句之间的数据依赖关系,构造线性约束系统的效率高,分析表明,Neelam Gupta等人提出的方法构造线性约束系统的时间复杂性为O(k2·n+k·n·lmax·t),空间复杂性为O(k2·n),本发明构造线性约束系统的时间复杂性和空间复杂性分别为O(k·t)和O(m·t),其中k,n,lmax,t,m分别表示W上的语句个数、被定值变量个数(即输入变量个数与被赋值变量个数之和)、各谓词结点的谓词片中语句个数的最大值、输入变量个数和谓词结点个数,并且m≤k,t≤n。
2.无须分析程序路径W上各语句之间的数据依赖关系,生成测试数据的能力强,不仅能够用于白盒测试,而且能够用于黑盒测试。当W上有循环语句而且人们不关心循环体的内部执行情况时,本发明能够直接将该循环作为一个黑盒放在W上,不必将其展开。当人们不关心W上判断语句是执行“真”分支还是“假”分支时,本发明同样可以直接将该判断语句作为一个黑盒放在W上。当W上存在函数调用或可执行程序调用时,本发明可以将被调用的函数体或可执行程序视为黑盒,不必在调用处展开,从而进一步提高了效率。本发明能够直接处理goto语句。
3.约束求解器采用线性规划、线性整数规划、线性混合整数规划和最小二乘解法相结合的方法求解线性约束系统,结合了线性规划、线性整数规划、线性混合整数规划和最小二乘解法的优点,通用性好,对于谓词函数均为输入变量的线性函数或者谓词函数中含有输入变量的非线性函数的一些程序路径能够有效地找到解。
4.当程序路径W上各谓词函数均为输入变量的线性函数且所有输入变量均无整数限制时,迭代一次后,本发明或者能找到所需的测试数据,或者保证该程序路径不可行。
5.可移植性好,不受程序设计语言和操作系统的限制,易于移植到各种程序设计语言和操作系统。
6.适用范围广,能够用于单元测试、集成(组装)测试等阶段以及面向断言的测试数据自动生成和回归测试数据的自动生成。


图1是本发明总体逻辑结构图。
图2是本发明的总流程图。
图3是本发明构造线性算术表示的示意图。
图4是本发明求解线性约束系统的示意图。
具体实施例方式图1是本发明总体逻辑结构图。本发明由输入接口、词法分析器、语法分析器、约束构造器、约束求解器、路径满足检查器、输出接口模块实现测试数据自动生成。其总体逻辑结构是用户指定程序路径W,词法分析器对W进行词法分析后,语法分析器根据词法分析的结果对W进行语法分析,将W转换为约束构造程序和路径满足检查程序,约束构造程序经编译产生约束构造器,路径满足检查程序经编译产生路径满足检查器;约束构造器根据当前程序输入和各输入变量的增量执行W上的语句,不分析W上的语句之间的数据依赖关系,计算W上各谓词函数的线性算术表示,然后建立输入变量的线性约束系统;约束求解器采用线性规划、线性整数规划、线性混合整数规划和最小二乘解法相结合的方法求解线性约束系统;求解后获得新的程序输入即测试数据;最后由路径满足检查器进行检查,若该程序输入能使W被经过则结束,若该程序输入不能使W被经过则根据W上所有谓词函数是否为输入变量的线性函数以及迭代次数上限决定是否继续迭代求解;求解结果由输出接口输出。
图2是本发明的总流程图,图4描述了本发明求解线性约束系统的方法。本发明实现步骤是1.用户从输入接口指定程序路径W、各输入变量的初值和增量以及其它参数值,如W上的所有谓词函数是否均为输入变量的线性函数、当W上的某谓词函数为输入变量的非线性函数时迭代求解的次数上限、以及当W上存在黑盒且黑盒中包含输入语句时,根据黑盒的接口规范所规定的黑盒中的输入变量的个数及各输入变量的数据类型等。
2.词法分析器对W进行词法分析后,语法分析器根据词法分析的结果对W进行语法分析,将W转换为约束构造程序和路径满足检查程序,约束构造程序经编译产生约束构造器,路径满足检查程序经编译产生路径满足检查器。
3.约束构造器根据当前程序输入和各输入变量的增量执行W上的语句,计算W上各谓词函数的线性算术表示,建立输入变量的线性约束系统。
4.约束求解器采用线性规划、线性整数规划、线性混合整数规划和最小二乘解法相结合的方法求解该线性约束系统,如图4若用户指定W上的谓词函数均为输入变量的线性函数,则采用线性规划、线性整数规划、线性混合整数规划方法求解;若用户指定W上的谓词函数中含有输入变量的非线性函数,则先采用线性规划、线性整数规划、线性混合整数规划方法求解,若无法找到解,则将该线性约束系统转换为线性方程系统,求它的最小二乘解。
4.1若用户指定W上的谓词函数均为输入变量的线性函数,并且线性规划、线性整数规划、线性混合整数规划方法找到解,则由路径满足检查器进行检查,若该解能使W被经过则从输出接口输出解,然后结束;若该解不能使W被经过则从输出接口给出求解精度可能不够的警告,然后结束。
4.2若用户指定W上的谓词函数均为输入变量的线性函数,所有输入变量均无整数限制,并且线性规划方法找不到解,则从输出接口给出W不可行的结论,然后结束。
4.3若用户指定W上的谓词函数均为输入变量的线性函数,某输入变量有整数限制,并且线性整数规划、线性混合整数规划方法找不到解,则从输出接口给出W可能不可行的结论,然后结束。
4.4若用户指定W上的某谓词函数为输入变量的非线性函数,则先采用线性规划、线性整数规划、线性混合整数规划方法求解,若找到解,则由路径满足检查器进行检查,若该解能使W被经过则从输出接口输出解,然后结束;若该解不能使W被经过,并且当前迭代次数已经达到用户指定的迭代次数上限,则从输出接口给出W可能不可行的结论,然后结束;若该解不能使W被经过,并且当前迭代次数尚未达到用户指定的迭代次数上限,则当前迭代次数加一,将该解作为新的当前程序输入,转第3步进行下次迭代。
4.5若用户指定W上的谓词函数中含有输入变量的非线性函数,则先采用线性规划、线性整数规划、线性混合整数规划方法求解,若找不到解,则将该线性约束系统转换为线性方程系统,求它的最小二乘解。由路径满足检查器进行检查,若该最小二乘解能使W被经过则从输出接口输出该最小二乘解,然后结束;若该最小二乘解不能使W被经过,并且当前迭代次数已经达到用户指定的迭代次数上限,则从输出接口给出W可能不可行的结论,然后结束;若该最小二乘解不能使W被经过,并且当前迭代次数尚未达到用户指定的迭代次数上限,则当前迭代次数加一,将最小二乘解作为新的当前程序输入,转第3步进行下次迭代。
图3描述了本发明构造线性算术表示的方法。用户输入程序路径W、输入变量的初值X=<x1,…,xt>和输入变量的增量Y=<y1,…,yt>。对于W上的m个谓词结点n1,…,nm,依次令ni的谓词函数的线性算术表示为L(i,X,Y,W)=di1v1+…+ditvt+ci,按照X依次执行W上的ni之前的除谓词结点之外的语句,计算ni的谓词函数值Poldi,并且令ci=Poldi,其中i=1,...,m。然后计算各线性算术表示的系数值和常数项,计算方法是对于W上的t个输入变量v1,…,vt的初值x1,…,xt,依次将第j个输入变量vj的值xj与其增量yj相加,其余输入变量的值保持不变,将新的输入记作Z,然后按照Z依次执行W上的ni之前的除谓词结点之外的语句,计算ni的谓词函数值Pnewij,并且令dij=(Pnewij-Poldi)/yj,ci=ci-dij×xj,其中i=1,...,m,j=1,...,t。
根据软件工程的思想,本发明采用面向对象的方法,使用UML进行设计,在Windows98操作系统下用C++语言和Java语言对本发明进行了实现,开发出为C语言和Java语言程序路径自动生成测试数据的原型工具(Path-wise Test Data Generator,简称PTDG)。
在以下函数中,对于一个具有十个元素的数组X,其中各元素的值是任意输入的,要求采用冒泡排序方法对X中各元素进行排序,使得各元素按不减序排列,即X
<=X[1]<=X[2]<=X[3]<=X[4]<=X[5]<=X[6]<=X[7]<=X[8]<=X[9]。但是在该函数中存在一个错误,即外层循环的结束条件“i<=7”应为“i<=8”。
<pre listing-type="program-listing">void Bubble_Sort(int X[])  {  int temp,i,j;&lt;!-- SIPO &lt;DP n="10"&gt; --&gt;&lt;dp n="d10"/&gt;  scanf(″%d%d%d%d%d%d%d%d%d%d″,  &amp;amp;X
, &amp;amp;X[1], &amp;amp;X[2], &amp;amp;X[3], &amp;amp;X[4],  &amp;amp;X[5], &amp;amp;X[6], &amp;amp;X[7], &amp;amp;X[8], &amp;amp;X[9]);  for(i=0;i<=7;i++)  for(j=0;j<=8;j++)  if(X[j]>X[j+1]){  temp=X [j];  X[j]=X[j+1];  X[j+1]=temp;}  }</pre>当在以下程序路径W1=&lt;n1,n2,n3&gt;中调用该函数,n1int X[10];n2Bubble_Sort(X);n3@X
>X[1]@PTDG从初始输入&lt;X
=X[1]=X[2]=X[3]=X[4]=X[5]=X[6]=X[7]=X[8]=X[9]=1&gt;出发,假设各输入变量的增量为&lt;1,1,1,1,1,1,1,1,1,-1&gt;,经过两次迭代能够找到使W1被经过的程序输入&lt;X
=X[1]=X[2]=X[3]=X[4]=X[5]=X[6]=X[7]=X[8]=0,X[9]=-1&gt;。
上述结果表明,存在程序输入&lt;X
=X[1]=X[2]=X[3]=X[4]=X[5]=X[6]=X[7]=X[8]=0,X[9]=-1&gt;,当按照这组输入执行W1时,W1是可行的,即调用函数Bubble_Sort后,会出现“X
>X[1]”的结果,故违反了设计要求,从而发现函数中存在错误。上述结果也表明PTDG可以直接处理函数调用。进一步的实验表明当Bubble_Sort的函数体仪为目标代码而无源代码时,PTDG仍然能够找到相同的解,而Neelam Gupta等人提出的方法则无法构造线性算术表示。因此本发明能够用于黑盒测试。
在以下程序中,谓词函数中含有输入变量的非线性函数“x*x”。
n1float x;n2scanf(″%f″,&amp;x);n3if(x<-1)n4if(x*x>0)
n5printf(″Ok!″);n6else printf(″No.″);n7else printf(″No.″);对于其中的路径W2=&lt;n1,n2,n3,n4,n5&gt;,从初始输入x=1出发,假设输入变量x的增量为1,PTDG所得到的如下线性约束系统n3x+1<0n43x-2>0是矛盾的,仪采用基于线性规划、线性整数规划、线性混合整数规划的约束求解方法无法进行求解,PTDG采用线性规划、线性整数规划、线性混合整数规划和最小二乘解法相结合的约束求解方法却能够经过六次迭代找到使W2被经过的程序输入-1.388210。由此可见本发明强大的寻找测试数据的能力。
发明人还用其它一些实际的程序路径对PTDG进行实验。实验结果表明PTDG能够处理的程序中的语句包括顺序、条件、循环、转移等语句,其中顺序语句包括说明语句、赋值语句、输入语句、输出语句等;能够为整数类型、浮点类型、双精度浮点类型的输入变量生成测试数据;可以直接处理数组、结构、指针和函数调用。并且可以扩充为支持布尔类型、字符类型、枚举类型。另外的实验表明PTDG能够用于面向断言的测试以及回归测试等场合的测试数据自动生成。
人们通常分单元测试、组装测试、确认测试等阶段对大型软件进行测试。本发明可以直接应用在单元测试的控制流测试中诸如语句覆盖、分支覆盖、条件覆盖、判定-条件覆盖、路径覆盖等,数据流测试中的定义覆盖、引用覆盖等方面。由于本发明能够用于黑盒测试,故本发明支持更高层次的软件测试,譬如组装测试中的调用对覆盖、数据流测试。本发明也可以用于面向断言的测试以及回归测试等方面。
权利要求
1.一种面向路径的测试数据自动生成方法,由输入接口、词法分析器、语法分析器、约束构造器、约束求解器、路径满足检查器、输出接口模块实现测试数据自动生成,其特征在于其实现步骤是[1]用户从输入接口指定程序路径W、各输入变量的初值和增量以及其它参数值,如W上的所有谓词函数是否均为输入变量的线性函数、当W上的某谓词函数为输入变量的非线性函数时迭代求解的次数上限、以及当W上存在黑盒且黑盒中包含输入语句时,根据黑盒的接口规范所规定的黑盒中的输入变量的个数及各输入变量的数据类型等;[2]词法分析器对W进行词法分析后,语法分析器根据词法分析的结果对W进行语法分析,将W转换为约束构造程序和路径满足检查程序,约束构造程序经编译产生约束构造器,路径满足检查程序经编译产生路径满足检查器;[3]约束构造器根据当前程序输入和各输入变量的增量执行W上的语句,不分析W上的语句之间的数据依赖关系,构造W上各谓词函数的线性算术表示,然后建立输入变量的线性约束系统;[4]约束求解器采用线性规划、线性整数规划、线性混合整数规划和最小二乘解法相结合的方法求解该线性约束系统若用户指定W上的谓词函数均为输入变量的线性函数,则采用线性规划、线性整数规划、线性混合整数规划方法求解;若用户指定W上的谓词函数中含有输入变量的非线性函数,则先采用线性规划、线性整数规划、线性混合整数规划方法求解,若无法找到解,则将该线性约束系统转换为线性方程系统,求它的最小二乘解;求解后获得新的程序输入即测试数据;最后由路径满足检查器进行检查,若该程序输入能使W被经过则结束,若该程序输入不能使W被经过则根据W上所有谓词函数是否为输入变量的线性函数以及迭代次数上限决定是否继续迭代求解;求解结果由输出接口输出。
2.权利要求1所述的一种面向路径的测试数据自动生成方法,其特征在于所述约束构造器构造W上各谓词函数的线性算术表示的方法是用户输入程序路径W、输入变量的初值X=&lt;x1,…,xt&gt;和输入变量的增量Y=&lt;y1,…,yt&gt;;对于W上的m个谓词结点n1,.…,nm,依次令ni的谓词函数的线性算术表示为L(i,X,Y,W)=di1v1+…+ditvt+ci,按照X依次执行W上的ni之前的除谓词结点之外的语句,计算ni的谓词函数值Poldi,并且令ci=Poldi,其中i=1,...,m;然后计算各线性算术表示的系数值和常数项,计算方法是对于W上的t个输入变量v1,…,vt的初值x1,…,xt,依次将第j个输入变量vj的值xj与其增量yj相加,其余输入变量的值保持不变,将新的输入记作Z,然后按照Z依次执行W上的ni之前的除渭词结点之外的语句,计算ni的谓词函数值Pnewij,并且令dij=(Pnewij-Poldi)/yi,ci=ci-dij×xj,其中i=1,...,m,j=1,...,t;然后建立输入变量的线性约束系统如果渭词结点ni的分支调词F?0的值应该为“真”,那么由ni的谓词函数的线性算术表示L(i,X,Y,W,)建立的线性约束为L(i,X,Y,W)?0,其中的关系操作符与F?0中的相同;如果谓词结点ni的分支谓词F?0的值应该为“假”,那么由ni的谓词函数的线性算术表示L(i,X,Y,W)建立的线性约束为L(i,X,Y,W)??0,其中的关系操作符“??”与F?0中的“?”相反,即当“?”为“>”时,“??”为“≤”;当“?”为“≥”时,“??”为“<”;当“?”为“<”时,“??”为“≥”;当“?”为“≥”时,“??”为“<”;当“?”为“=”时,“??”为“≠”,即(L(i,X,Y,W)>0)∨(L(i,X,Y,W)<0)。
3.如权利要求1所述的一种面向路径的测试数据自动生成方法,其特征在于所述线性规划、线性整数规划、线性混合整数规划和最小二乘解法相结合的方法求解线性约束系统的过程是3.1若用户指定W上的谓词函数均为输入变量的线性函数,并且线性规划、线性整数规划、线性混合整数规划方法找到解,则由路径满足检查器进行检查,若该解能使W被经过则从输出接口输出解,然后结束;若该解不能使W被经过则从输出接口给出求解精度可能不够的警告,然后结束;3.2若用户指定W上的谓词函数均为输入变量的线性函数,所有输入变量均无整数限制,并且线性规划方法找不到解,则从输出接口给出W不可行的结论,然后结束;3.3若用户指定W上的谓词函数均为输入变量的线性函数,某输入变量有整数限制,并且线性整数规划、线性混合整数规划方法找不到解,则从输出接口给出W可能不可行的结论,然后结束;3.4若用户指定W上的某谓词函数为输入变量的非线性函数,则先采用线性规划、线性整数规划、线性混合整数规划方法求解,若找到解,则由路径满足检查器进行检查,若该解能使W被经过则从输出接口输出解,然后结束;若该解不能使W被经过,并且当前迭代次数已经达到用户指定的迭代次数上限,则从输出接口给出W可能不可行的结论,然后结束;若该解不能使W被经过,并且当前迭代次数尚未达到用户指定的迭代次数上限,则当前迭代次数加一,将该解作为新的当前程序输入,转第[3]步进行下次迭代;3.5若用户指定W上的调词函数中含有输入变量的非线性函数,则先采用线性规划、线性整数规划、线性混合整数规划方法求解,若找不到解,则将该线性约束系统转换为线性方程系统,求它的最小二乘解;山路径满足检查器进行检查,若该最小二乘解能使W被经过则从输出接口输出该最小二乘解,然后结束;若该最小二乘解不能使W被经过,并且当前迭代次数已经达到用户指定的迭代次数上限,则从输出接口给出W可能不可行的结论,然后结束;若该最小二乘解不能使W被经过,并且当前迭代次数尚未达到用户指定的迭代次数上限,则当前迭代次数加一,将最小二乘解作为新的当前程序输入,转第[3]步进行下次迭代。
全文摘要
本发明公开了一种面向路径的测试数据自动生成方法,目的是提出一种无数据依赖关系分析的能够用于白盒、黑盒的测试数据自动生成的方法。本发明约束构造器根据当前程序输入和各输入变量的增量执行路径W上的语句,不分析W上的语句之间的数据依赖关系,构造W上各谓词函数的线性算术表示,然后建立输入变量的线性约束系统;约束求解器采用线性规划、线性整数规划、线性混合整数规划和最小二乘解法相结合的方法求解线性约束系统,经过若干次迭代寻找所需的测试数据。本发明构造线性约束系统的效率高,生成测试数据的能力强,既能用于白盒测试,又能用于黑盒测试;通用性和可移植性好,适用范围广。
文档编号G06F11/36GK1402133SQ0213961
公开日2003年3月12日 申请日期2002年9月13日 优先权日2002年9月13日
发明者单锦辉, 王戟, 齐治昌 申请人:中国人民解放军国防科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1