星云测试推出重磅产品Wings-单元测试用例自动生成软件提供乐橙娱乐官网,d88尊龙等产品欢迎广大客户前来洽谈业务合作

d88尊龙

你现在的位置:首页 > 视频展示 > 内容

星云测试推出重磅产品Wings-单元测试用例自动生成软件

2018-08-25 来源:本站

  在软件开发领域,有一个一直以来无法攻克的难题,也是计算机软件诞生以来就伴随的问题,即测试用例的自动生成。软件测试过程实质是一种对被测试软件广阔输入空间的枚举过程,提升软件测试的效率,其根本在于自动测试用例生成系统的技术突破。而在这个技术突破前,软件测试冗长耗时又基于人工经验的黑盒枚举和验证过程,让众多企业无法避免,只能硬着头皮上。

  制约测试用例生成,最关键的底层技术是复杂的参数解析技术。即:能够在编译器层面对于任意复杂的类型,任意定义嵌套层级的递归解析。如果没有这个关键技术的突破,那么测试用例自动生成系统要么无法商用,要么将以极低的效率来演化、产生合规的测试数据。例如著名的模糊测试工具American Fuzzy Lop,它并不能够识别用户的程序所需要的结构类型,需要从最外层进行基于搜索算法进行演化。而程序的特性是接口层面的输入和内部某个模块的数据要求距离很远,外部数据通常是经过层层复杂转换才可以成为内部模块所需要的数据结构类型,因此从外层探索所需要的计算量和时间将是难以想象的。基于American Fuzzy Lop,为了能够生成一个合法的SQL 语句,让程序内部模块能够通过外围数据校验需要探索时间以天数计。如果从软件内部结构分析产生用例驱动,就需要对软件的编译结构进行深度理解。可行的测试用例生成系统,应该是基于程序的中间(关键入口)作为测试切入最为合适。这些模块的输入,已经将模糊的输入转化为高度结构化的参数。只要能够识别这些复杂结构,将复杂数据类型一步步降解为简单数据类型,同时完成参数构造,就可以自动完成驱动用例的生成。

  基于模块的测试,可以划归为传统的单元测试,它是将缺陷发现并遏制在研发阶段最好的方法。但受限于单元测试需要开发大量的驱动程序,在行业内的推广和应用受到了极大的限制。当然单元测试也可以在系统集成完毕后执行,避免构建虚拟的桩程序。针对单元测试中面临的上述问题,星云测试通过大量研究和测试,发布测试用例驱动自动生成系统Wings,研究并解决了如下难点,现分享给大家。

  Wings通过编译器底层技术,将输入的源文件,按照函数为单位,形成模块对象。对象中包含函数的输入参数,返回值类型等信息,供驱动函数模块和测试用例模块使用。每个文件作为一个单元,针对其中的每个函数的每个参数进行深度解析,对于嵌套类型,复杂类型等都可以实现精确的解析和分解,将复杂类型逐层讲解为基础数据类型,并产生参数结构的描述文件(PSD)。

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

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

  Wings提供了一种自动生成驱动函数的单元测试方法,其中主要包含以下几个步骤:

  通过对源程序的扫描提取出函数的结构信息,使用户不需要关心程序的结构信息,而被测程序的结构信息,主要包含程序中的全局变量以及函数信息,而函数信息主要包括函数的参数个数,参数类型以及返回值类型。而全局变量以及参数,最主要的提取出其中的符号信息,以及类型信息,针对一些复杂的类型,通过层层进行解析为基本数据类型,完成全局变量以及函数参数的构造。

  变量的类型一般大致分为基本类型、构造类型、指针类型及空类型。Wings通过底层编译技术,针对不同的变量类型,进行不同的处理方式。

  l 数组类型,例如int array[2][3],数组名称为array,类型为int以及二维数组的长度,行为2,列为3。

  (5) 系统类型,例如File、size_t等,标记为系统类型,不在对其往下进行分析,会添加到模板中,由用户进行赋值操作。

  针对被测源程序的每个编译单元,将解析到的函数信息,保存在对应的PSD结构中,针对以下源代码实例进行说明:

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

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

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

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

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

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

  在上文中,针对全局变量和函数的结构信息,进行了分析和提取,以下将利用提取到保存在PSD中的信息,完成被测源程序的驱动框架整体生成。

  Ø 全局变量的赋值,针对分析得到函数使用的全局变量的个数,依次进行赋值操作

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

  l 驱动控制包含在Driver_main.cpp中,可以通过宏自动配置函数的测试次数

  l 针对系统内置参数,以及用户比较特殊的参数,通过模板方式统一配置赋值方式。

  测试用例的自动生成,利用提取到保存在PSD中的函数信息,进行测试用例数据的生成,以下是图三中PSD格式生成的一组数据,每组数据保存为JSON格式,更容易看到数据的层次关系。

  针对每个编译单元,默认生成一组所有函数的对应的测试数据文件,值生成可以通过配置次数进行修改。

  如何完成驱动框架的生成,下面针对开源程序MySQL完整的生成过程,进行详细说明。

  点击文件按钮,设置被测源程序的工程目录。设置完成之后,点击功能操作,功能操作主要包括参数解析、驱动生成、值文件生成以及模板添加四个操作。分析对应生成以下几个文件夹:

  其中,参数解析模块,对应生成FunXml以及GlobalXml,分别存放提取到的每个编译单元的函数信息及全局变量的信息。

  驱动生成模块,会对应生成Wings_Projects文件夹,其中存放每个编译单元的驱动文件

  下图为Mysql对应加载的驱动文件结构体信息,左侧导航树为生成的对应驱动文件,包含每个编译单元的函数以及函数的参数、全局变量的信息。点击其中某个编译单元,可以加载对应的驱动文件以及对应的值文件。

  以上是Mysql的整体生成对应的驱动文件以及值文件,针对以下代码详细说明驱动文件。

  l 驱动函数,统一命名为Driver_XXX的方式,JSON作为获取测试数据的方式,times代表单函数的测试次数。

  l 针对每个参数的赋值操作,利用解析到的PSD存储格式,对每层结构依次进行赋值操作。

  Wings的应用非常简单,下面是以在Visual Studio2015 中可正常编译的Mysql 代码为例,生成的测试数据的统计指标,整个生成过程无需任何人工介入,仅需要制定所需要生成驱动的源码的路径即可。

  以下是使用源码统计工具得到的结果,虽然多达 400 多万行有效的单元测试代码是由Wings全自动生成的,有意思的是可以看到这些代码采用人工开发的成本高达 1079 个人月,成本更是达到了 1079 万之多。

  Wings实现了由程序自动生成程序的第一步探索,目前发布的是第一版,有兴趣的开发者直接在码云平台,商业授权提供了一个月无限功能体验期,可以快速体验Wings的神奇能力,Wings c语言版支持多平台,例如visual studio、vxworks、gcc、qt等。Wings由星云测试(设计和研发,有兴趣的开发者可以通过码云的互动平台与星云测试团队取得联系,贡献自己的设计思路和产品使用反馈(凡被采纳的优秀建议,星云可以延长其免费使用期至少为三个月)。Wings具有强大的、底层的大幅度改进软件质量的基因,未来Wings的将深度优化自动编写的程序的可读性(更接近优秀程序员的编写水平)以及对于c++语言的支持。

推荐新闻