一种面向复杂软件的全自动测试用例驱动生成系统的制作方法

文档序号:16781278发布日期:2019-02-01 19:09阅读:268来源:国知局
一种面向复杂软件的全自动测试用例驱动生成系统的制作方法

本发明属于软件测试技术领域,具体是涉及一种面向复杂软件的全自动测试用例驱动生成系统,主要用于开发阶段的单元测试和系统集成阶段的模块测试。



背景技术:

单元测试是保证软件质量非常有效的手段,无论是从测试理论早期介入测试的理念来看或是从单元测试不受ui影响可以高速批量验证的特性,所以业界所倡导的测试驱动开发,这个里面提到的测试驱动更多的就是指单元测试驱动。但一般开发团队还是很少的系统化的执行单元测试,针对应用软件的测试更多是由专业测试团队来执行黑盒测试。单元测试的最大的难点不在于无法确定输入输出,这毕竟是模块开发阶段就已经定好的,而在于单元测试用例的编写会耗费开发人员大量的工时,按照相关统计单元测试用例的时间甚至会远超过功能本身开发的时间。

上述几点其实分析根本原因是单元测试编写太耗时,最终导致测试驱动的引擎失去了动力,致使测试驱动开发的美好愿景在现实场景熄火,因为构建这个驱动用的发动机实在是难度和成本太大了。市场上的各种“x”unit,单元测试框架仅仅解决了生成测试驱动的外框,没有任何基于深度程序理解的用例逻辑和数据的产生能力。因此在各种开发相关场景中都让开发人员产生抵触情绪。一种面向复杂软件的全自动测试用例驱动生成系统的提出则解决这个困扰程序员的一个最大的难题,同时也有可能从根本上改变单元测试的现状,充分的、高效率的单元测试将有效缓解基于海量人力的系统级黑盒测试以及自动化测试的压力。

制约测试用例采用程序自动生成,最关键的底层技术是复杂的参数解析技术。即:能够在编译器层面对于任意复杂的类型,任意定义嵌套层级的递归解析。如果没有这个关键技术的突破,那么测试用例自动生成系统要么无法商用,要么将以极低的效率来演化、产生合规的测试数据。例如著名的模糊测试工具americanfuzzylop,它并不能够识别用户的程序所需要的结构类型,需要从最外层进行基于搜索算法的演化。程序的特性是接口层面的输入和内部某个模块的数据要求距离很远,外部数据通常是经过层层复杂转换才可以成为内部模块所需要的数据结构类型,因此从外层探索所需要的计算量和时间将是难以想象的。基于americanfuzzylop,为了能够生成一个合法的sql语句,让程序内部模块能够通过外围数据校验需要探索时间以天数计,远非分钟或者小时可以生成。另外一个制约性条件是:每个程序能够接手的输入都是经过精心结构编制、含有大量规则的数据,而这些数据通过随机+探索的方式生成是非常不现实和极其耗时的。所以,从黑盒以及最外层输入产生自动产生用例是不可行的。

如果从软件内部结构分析产生用例驱动,就需要对软件的编译结构进行深度理解。可行的测试用例生成系统,应该是基于程序的中间(关键入口)作为测试切入最为合适。这些模块的输入,已经将模糊的输入转化为高度结构化的参数。只要能够识别这些复杂结构,将复杂数据类型一步步降解为简单数据类型,同时完成参数构造,就可以自动完成驱动用例的生成。

系统集成阶段的模块测试,可以划归为传统的单元测试,它是将缺陷发现并遏制在研发阶段最好的方法。但受限于单元测试需要开发大量的驱动程序,在行业内的推广和应用受到了极大的限制。当然单元测试也可以在系统集成完毕后执行,避免构建虚拟的桩程序。



技术实现要素:

为此,本发明所要解决的技术问题在于现有技术中无法实现对任意复杂参数进行“测试用例框架自动生成”的技术问题,从而提出一种面向复杂软件的全自动测试用例驱动生成系统,该系统提供了一种基于程序函数参数深度解析的编译技术,实现用例框架由软件进行全自动编写,并且可保证生成的用例可直接进行编译运行,并开始执行测试。

为达到上述目的,本发明的技术方案如下:

一种面向复杂软件的全自动测试用例驱动生成系统,包括:

程序参数深度分析模块,所述程序参数深度分析模块用于读取输入的被测源程序,利用编译器底层技术对输入的被测源程序进行词法分析和语法分析,生成抽象语法树,通过遍历抽象语法树获取全局变量信息与函数参数信息,针对被测源程序的每个编译单元,将解析到的全局变量信息与函数参数信息保存到psd文件中。

驱动函数自动生成模块,所述驱动函数自动生成模块用于读取psd文件,对保存在psd文件中的全局变量信息与函数参数信息进行分析和提取,生成驱动函数,所述驱动函数包括全局变量的声明、函数的调用次数、全局变量与函数参数的赋值、原函数的调用以及函数返回值的打印输出。

测试数据自动生成模块,所述测试数据自动生成模块用于读取psd文件,根据psd文件中保存的函数参数信息,自动生成与函数参数信息一一对应的测试数据,并将生成的测试数据按照参数层级进行组织,最后将生成的多层级的测试数据存储在json文件中。

作为上述技术方案的优选,程序参数深度分析模块中:

所述全局变量信息包括全局变量的名称以及类型,所述函数信息包括函数的名称、参数个数、参数展开类型以及返回值展开类型。

作为上述技术方案的优选,程序参数深度分析模块中:

所述psd文件为程序参数描述文件,不同数据类型在psd文件中的保存方法如下:

针对基本数据类型,存储变量名与类型;

针对数组类型,存储数组类型以及数组的长度;

针对指针类型,存储几级指针;

针对链表,存储标记为链表。

作为上述技术方案的优选,所述程序参数深度分析模块对全局变量的分析包括分析变量是用户自定义变量还是系统头文件变量,针对复杂的系统头文件变量,分析过程解析到系统头文件变量后停止分析,并根据提前预设置好的模板对已知的系统头文件变量进行处理。

作为上述技术方案的优选,驱动函数自动生成模块中:

根据变量的不同类型,对全局变量与函数参数的赋值方法如下:

针对基本类型的变量,直接赋值;

针对数据类型的变量,内存拷贝赋值;

针对指针类型的变量,先判断该指针是普通类型的指针还是复杂类型的指针,若是普通类型的指针,则将其作为数组首地址,然后进行内存拷贝赋值;若是复杂类型的指针,则通过指向一个有效的结构地址赋值;

针对属于系统头文件定义类型的变量,通过添加模板进行赋值。

作为上述技术方案的优选,测试数据自动生成模块中:

json文件中存储了对应层级的变量的名称以及对应的值,值文件中只对字符串、数值型变量进行数值存储,值文件中的数据结构层级关系和psd文件中的数据结构层级关系一一对应,同时json文件以可视化表格的方式展示,表格支持多层级变量的展开以及多组测试数据的展示,并支持可视化编辑。

作为上述技术方案的优选,系统还包括测试结构分析模块,所述测试结果分析模块用于编辑驱动与用例、编译被测程序、执行测试用例以及测试结果输出。

本发明的有益效果在于:被测源程序的信息通过编译技术自动提取,使得测试人员不用关心程序的内部结构;测试人员不需要再手动编写驱动文件,提高了单元测试的效率;测试数据自动生成,并自动配置测试次数,测试数据可以灵活修改,不用再次编译源程序;利用模板灵活配置不同类型的变量的赋值过程;利用自动生成的驱动函数和测试数据,可以灵活的边修改函数边进行测试。

附图说明:

以下附图仅旨在于对本发明做示意性说明和解释,并不限定本发明的范围。其中:

图1为本发明一个实施例的一种面向复杂软件的全自动测试用例驱动生成系统示意图;

图2为本发明一个实施例的将全局变量与函数参数解析存储为psd结构的流程图。

图3为本发明一个实施例的源代码示意图;

图4为本发明一个实施例的图3中的源代码保存为psd结构的代码示意图;

图5为本发明一个实施例的file类型的处理方式示意图;

图6为本发明一个实施例的驱动函数自动生成的整体流程图;

图7为本发明一个实施例的图3中的源代码生成的部分驱动代码示意图;

图8为本发明一个实施例的测试数据的展示格式示意图;

图9为本发明一个实施例的一种以表格显示的json文件。

具体实施方式:

如图1所示,本发明的一种面向复杂软件的全自动测试用例驱动生成系统,包括:

程序参数深度分析模块,所述程序参数深度分析模块用于读取输入的被测源程序,利用编译器底层技术对输入的被测源程序进行词法分析和语法分析,生成抽象语法树,而语法树的最顶部单元translationunitdecl为一个.c文件的编译单元,clang的抽象语法树保存了所有.c文件的信息,并将其保存到astcontext,通过遍历抽象语法树获取全局变量信息与函数参数信息,针对被测源程序的每个编译单元,将解析到的全局变量信息与函数参数信息保存到psd文件中。

具体操作时,输入被测源程序中的源文件,按照函数为单位,形成模块对象,对象中包含函数的输入参数、返回值类型等信息,供后续的驱动函数自动生成模块和测试数据自动生成模块使用。每个源文件作为一个单元,针对其中的每个函数的每个参数进行深度解析,对于嵌套类型、复杂类型等都可以实现精确的解析和分解,将复杂类型逐层降解为基础数据类型,并产生参数结构的描述文件,即psd文件。

所述全局变量信息包括全局变量的名称以及类型,所述函数信息包括函数的名称、参数个数、参数展开类型以及返回值展开类型。

所述psd文件为程序参数描述文件,不同数据类型在psd文件中的保存方法如下:

针对基本数据类型,存储变量名与类型;

针对数组类型,存储数组类型以及数组的长度;

针对指针类型,存储几级指针;

针对链表,存储标记为链表。

所述程序参数深度分析模块能够对程序参数任意组合的复杂参数进行分析,例如数组,指针,结构体以及其嵌套组合进行分解,并可无限层级进行分级。除了对被测试程序模块函数的解析,还可以对被测试模块所引用的全局变量进行分析,并同样完成对于被测程序模块全局变量的解析。

所述程序参数深度分析模块除了能够实现对于参数的无限层级分析,同时也可以分析变量是否是用户自定义变量还是系统头文件变量,针对复杂的系统头文件变量,分析过程解析到系统头文件变量后停止分析,并根据提前预设置好的模板对已知的系统头文件变量进行处理。

如图2所示,本实施例中给出了一种全局变量与函数参数解析存储为psd结构的流程图。

本实施例中提供如图3所示的源代码实例对程序参数深度分析模块进行说明:

以上程序中,voidstructtypetest3(myy_structmm_struct[2])保存的psd结构如图4所示,其中psd文件各节点代表的意义如下:

structtypetest3代表函数名,parmtype0代表参数类型,parmnum代表参数个数。

mm_struct代表函数参数的符号,basetype1代表类型的分类(基本数据类型、构造类型、指针类型、空类型),type代表具体的类型,包括int,char,short,long,double,float,bool,以及这些类型的unsigned类型等基础的类型,还有一些特殊的类型诸如:zoa_fun类型表示函数类型,structureorclasstype表示结构体类型,等等,name代表结构体、联合体、枚举类型的名称。

i_int代表基本类型,基本类型作为最小的赋值单位。

array_one代表数组类型,rowsize代表数组的长度,数组可以划分为一维数组,二维数组等。

point代表指针类型,指针分为一级指针、二级指针等,一般指针当做函数参数作为数组使用,因此,针对基本类型的指针,采用动态分配数组的方式进行赋值,用户可依据需要,修改对应的值文件。

w代表位域类型,bitfileld代表所占位数。

functionptr代表函数指针类型,分别分析出参数类型、参数个数、返回值信息。

dem代表联合体类型。

dy代表枚举类型,value代表枚举类型的取值。

file代表结构体类型,systemvar代表此变量属于系统头文件中的变量,针对此种类型的变量,wings通过添加模板变量的方式,添加在模板库中,用户可依据具体需要进行特殊赋值。例如file类型的,处理方式如图5所示。

用户也可自行添加赋值方式。针对系统类型,wings可以和普通用户自定义类型进行区分,当解析到系统内置类型的时候就可以停止向下进行递归分析。

g_int代表全局变量,globaltype代表全局。

next代表链表结构体,nodetype代表此结构为链表。

returntype代表函数的返回值类型。

驱动函数自动生成模块,所述驱动函数自动生成模块用于读取psd文件,对保存在psd文件中的全局变量信息与函数参数信息进行分析和提取,生成驱动函数,所述驱动函数包括全局变量的声明、函数的调用次数、全局变量与函数参数的赋值、原函数的调用以及函数返回值的打印输出。

实际操作时,根据psd文件的格式信息,自动生成被测源程序的所有驱动函数,单元测试过程不再依赖开发人员手动编写测试函数,只需将生成的驱动函数和被测源文件一起编译,即可执行测试并查看测试结果。测试驱动自动生成程序基于psd描述,全自动构建驱动被测程序运行的所有参数,必须的全局变量,并可根据复杂变量的层级结构产生结构化的测试驱动程序,可以节省大量的单元测试用例的编写时间。

根据变量的不同类型,对全局变量与函数参数的赋值方法如下:

针对基本类型的变量,直接赋值;

针对数据类型的变量,内存拷贝赋值;

针对指针类型的变量,先判断该指针是普通类型的指针还是复杂类型的指针,若是普通类型的指针,则将其作为数组首地址,然后进行内存拷贝赋值;若是复杂类型的指针,则通过指向一个有效的结构地址赋值;

针对属于系统头文件定义类型的变量,通过添加模板进行赋值。

驱动函数自动生成模块能够完成测试用例的全自动生成。对于多层的复杂参数逐级完成所有层级的数据结构的赋值操作,并且在测试驱动程序内部按照层级排列。在每一个层级的变量开始进行赋值的程序构造中,都用成对的大括号进行变量所在层级区域划分和标识。程序自动生成模块可对数组进行识别,采用for循环的方式进行赋值,同样支持数组本身元素是复合类型(例如结构体)的情况。对于链表结构也可以自动识别并完成链表的赋值,对于链表元素可以根据值文件中实际给出的链表的节点的数量将链表结构组织起来。能够对指针和多层指针以及指针和复合结构的复合结构进行识别,并且自动产生对应的赋值程序。再整个赋值过程中,可通过jsonapi对所在层级的数据进行索引,并完成对驱动程序对应的变量进行赋值。

驱动函数自动生成模块可实现对于被测试模块返回值类型的分析,并且自动生成对于复杂参数返回值的分解和打印输出。例如再开始执行测试后,自动输出程序返回值参数,如果参数为复合类型,就逐级进行输出和打印。

驱动函数自动生成模块能够对于公共变量在统一的赋值模块中完成赋值,而不需要产生大量的重复的副本。例如对于某一种类型的复合变量进行赋值,只需要调用自动产生的通用的赋值函数即可。

自动生成的驱动文件中带有注释文件,注释文件标识了某个代码区段是在进行具体的特定参数某一个层级的赋值操作,并且通过这些注释可实现驱动文件,psd文件,值文件的关联链接和高亮显示,方便用例理解和组织驱动程序。

驱动生成过程中,特殊处理的如下:

针对一些特殊函数,例如main函数,static函数等,因为外部无法访问到,驱动生成暂时不做处理。

每个被测源文件,生成对应的一个驱动文件。

如图6所示,本实施例给出了一种驱动函数自动生成的整体流程图。

图7为图3所示的源代码实例生成的部分驱动代码。

测试数据自动生成模块,所述测试数据自动生成模块用于读取psd文件,根据psd文件中保存的函数参数信息,自动生成与函数参数信息一一对应的测试数据,并将生成的测试数据按照参数层级进行组织,最后将生成的多层级的测试数据存储在json文件中。

测试数据自动生成模块用于自动生成测试数据,测试数据与被测函数提取的信息相互对应,数据以一定的层次逻辑关系存储在json文件中。数据和经过分解和展开后的数据类型是一一对应的。这些数据用户可以根据业务要求随意编辑,并且用json文件进行结构化,层次化展示,非常的清晰。其中的测试数据包括全局变量值、被测函数调用时的参数值。通常用户只需要修改值文件就可以,用例驱动的代码是无需调整的。

json文件中存储了对应层级的变量的名称以及对应的值,值文件中只对字符串、数值型变量进行数值存储,值文件中的数据结构层级关系和psd文件中的数据结构层级关系一一对应,同时json文件以可视化表格的方式展示,表格支持多层级变量的展开以及多组测试数据的展示,并支持可视化编辑。psd文件复杂将复杂类型逐级分析为普通数据类型,而自动生成的值文件能够完成层级结构的表达和对最底层基础数据类型的值的存储。值生成文件对基础数据类型采用随机生成的方式,用户可根据实际的业务测试需要修改实际的测试数据。针对一个被测试模块的值文件可以有多组,以便执行多组的测试。json文件也提供一种表格的显示模式,见图9。表格在变量上以树的形式可以对多层次的变量参数进行分层展示,同时支持对多组测试数据的展示。基于表格也可以实现在表格界面上所见即所得的编辑。

图8为利用psd文件生成的一组测试数据的展开格式,每组数据保存为json格式,清晰显示数据的层次关系。针对每个编译单元,默认生成一组所有函数的对应的测试数据文件,测试数据生成可以通过配置,依据测试次数进行修改。

本实施例中的一种面向复杂软件的全自动测试用例驱动生成系统还包括测试结果分析模块,所述测试结构分析模块用于编辑驱动与用例、编译被测程序、执行测试用例以及测试结果输出。

本实施例所述的一种面向复杂软件的全自动测试用例驱动生成系统,主要用于开发阶段的单元测试和系统集成阶段的模块测试。该系统包括程序参数深度分析模块、驱动函数自动生成模块和测试数据自动生成模块。该系统可以对被测源程序中任意复杂的函数参数进行深度分析,将解析到的全局变量信息与函数参数信息保存到psd文件中,基于psd文件,实现驱动函数和测试数据的自动生成。本发明实现了由计算机软件在无人干预的情况下,全自动产生可执行的单元测试用例驱动和对应的测试数据,可大幅度的降低开发阶段对于单元测试的投入,并且进而降低包括系统测试在内的各阶段测试成本投入。本发明具有如下的优点:1.可以对任意复杂的函数参数进行深度解析,将复杂类型逐级分解为简单类型,并按照层次存储为psd(程序参数描述文件)文件。2.基于psd能够自动完成对于被测试函数的调用环境的构建,包括对于复杂参数的赋值,引用的必要的全局变量赋值以及对于返回值的自动获取和打印。3.自动产生和psd结构一一对应的测试数据,并按照参数层次进行组织。

显然,上述实施例仅仅是为清楚地说明所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引伸出的显而易见的变化或变动仍处于本发明创造的保护范围之中。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1