一种嵌入式系统自动化测试代码生成方法及装置与流程

文档序号:23857764发布日期:2021-02-05 15:36阅读:142来源:国知局
一种嵌入式系统自动化测试代码生成方法及装置与流程

[0001]
本文涉及自动化测试领域,尤其涉及一种嵌入式系统自动化测试代码生成方法及装置。


背景技术:

[0002]
嵌入式系统的函数测试中,一般都是人工阅读函数声明,找到函数声明及其相关的变量列表,然后,再根据每个变量,逐个声明,逐个分配空间,逐个赋值,再调用被测函数,在获取被测函数返回值,然后编写保存文件的代码,将函数返回值保存为变量文件。此过程及其繁琐,并且,测试人员编写的代码和开发人员编写的代码存在大量冗余定义,和逻辑,这些现状导致测试人员的工作效率很低,在实际测试工作中,至少有50%以上的精力用于做重复无用的工作。
[0003]
在同类技术领域中,大多数处理方法只提供单一的基于脚本执行的简单调用逻辑,无法处理动态调整变量的维度、变量边界值等,需要测试人员手动编写测试报告,当被测函数的变量很多,层级关系比较大时,编写测试用例表头本身也很耗时,当被测函数稍有变更,测试人员必须非常小心谨慎的维护测试用例列表,稍有不慎,都会影响到整个测试的结果。这些现状极大降低了测试人员的工作效率,无法将精力和时间用在测试用例的设计上。且测试人员不同,编写出的测试代码也不同(即测试代码生成过程的差异性较大),这将增加测试代码维护难度。
[0004]
现有的嵌入式系统自动化测试代码生成过程仅适用于逻辑简单仅包括单值型的被测函数,无法适用于复杂逻辑被测函数测试代码的生成。


技术实现要素:

[0005]
本文用于解决现有技术中人工生成嵌入式系统测试代码的方式存在浪费人力、工作效率低、测试代码生成过程差异性较大的技术问题,以及自动生成嵌入式系统测试代码的方式存在不适用于复杂逻辑的被测函数。
[0006]
为了解决上述技术问题,本文的第一方面提供一种嵌入式系统自动化测试代码生成方法,包括:
[0007]
从被测函数所在的c语言头文件中,解析得到常量信息及变量列表;
[0008]
从被测函数的测试用例中,解析得到变量值信息;
[0009]
根据所述常量信息、变量列表及变量值信息,自动生成被测函数的测试代码。
[0010]
本文的进一步实施例中,从被测函数所在c语言头文件中,解析得到变量列表,包括:
[0011]
根据c语言的语法结构,从被测函数所在头文件中,识别变量声明、结构体声明、函数声明及宏定义信息;
[0012]
根据c语言的语法规范,解析变量声明及结构体声明,得到单值信息、指针维度信息、数组维度信息及变量路径信息;
[0013]
根据宏定义信息、单值信息、指针维度信息、数组维度信息及变量路径信息,得到变量依赖关系;
[0014]
根据正则表达式,解析函数声明,得到被测函数信息,其中,被测函数信息包括:被测函数名称、返回值、形参列表及形参的输入输出标记;
[0015]
根据单值信息、宏定义信息、指针维度信息、数组维度信息、变量路径信息、变量依赖关系及被测函数信息,得到变量列表。
[0016]
本文的进一步实施例中,从被测函数的测试用例中,解析得到变量值信息,包括:
[0017]
解析被测函数的测试用例,确定变量值类型;
[0018]
根据变量值类型,解析变量值信息。
[0019]
本文的进一步实施例中,根据变量值类型,解析变量值信息,包括:
[0020]
若变量值类型为文件类型,则读取文件,将文件内容转换为一维数组;
[0021]
若变量值类型为脚本类型,则获取脚本返回值,将脚本返回值转换为一维数组;
[0022]
若变量值类型为边界类型,则展开边界,得到边界值序列;
[0023]
若变量值类型为单值类型,则得到单点值;
[0024]
所述一维数组、边界值序列及单点值组成变量值信息。
[0025]
本文的进一步实施例中,根据所述常量信息、变量列表及变量值信息,自动生成被测函数的测试代码,包括:
[0026]
根据所述常量信息、变量列表及变量值信息,结合目标语言的语法结构及编码规范,生成各类型代码段;
[0027]
组合所述代码段,生成测试代码,关联测试代码与所述被测函数的测试用例。
[0028]
本文的进一步实施例中,根据所述常量信息、变量列表及变量值信息,结合目标语言的语法结构及编码规范,生成各类型代码段,包括:
[0029]
根据宏定义信息及常量信息,生成宏定义代码段及常量代码段;
[0030]
根据单值信息、指针维度信息、数组维度信息、变量路径信息及变量依赖关系,生成变量声明代码段及变量分配空间代码段;
[0031]
根据变量列表及变量值信息,生成变量赋值代码段及被测函数返回值代码段。
[0032]
本文的进一步实施例中,嵌入式系统自动化测试代码生成方法还包括:
[0033]
根据用户信息,生成注释代码段;
[0034]
根据所述被测函数所在的c语言头文件,生成包含代码段。
[0035]
本文的第二方面提供一种嵌入式系统自动化测试代码生成装置,包括:
[0036]
第一解析模块,用于从被测函数所在的c语言头文件中,解析得到常量信息及变量列表;
[0037]
第二解析模块,用于从被测函数的测试用例中,解析得到变量值信息;
[0038]
代码生成模块,用于根据所述常量信息、变量列表及变量值信息,自动生成被测函数的测试代码。
[0039]
本文的第三方面提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现前述任一实施例所述的嵌入式系统自动化测试代码生成方法。
[0040]
本文的第四方面提供一种计算机可读存储介质,所述计算机可读存储介质存储有
执行计算机程序,所述计算机程序被处理器执行时实现前述任一项所述的嵌入式系统自动化测试代码生成方法。
[0041]
本文提供的嵌入式系统自动化测试代码生成方法及装置,通过从被测函数所在的c语言头文件中,解析得到常量信息及变量列表;从被测函数的测试用例中,解析得到变量值信息;根据所述常量信息、变量列表及变量值信息,能够代替人员手动编写测试代码,自动化生成被测函数的测试代码,节省了测试人员大量的时间精力(至少50%以上的工作量),测试人员可以将更多的时间和精力用在测试用例本身的编写上。本文解决了测试人员在白盒测试过程中,需要编写大量步骤繁琐的测试代码,且编码过程中极易产生人为编码错误,严重降低测试效率的问题,也简化了测试人员在编码层面的复杂度,无需深入了解c语言的语法结构,即可完成测试工作。同时,本文还可以统一测试代码的生产规范,适用于各种复杂逻辑的被测函数生成测试代码。
[0042]
为让本文的上述和其他目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附图式,作详细说明如下。
附图说明
[0043]
为了更清楚地说明本文实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本文的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0044]
图1示出了本文实施例嵌入式系统自动化测试代码生成方法的流程图;
[0045]
图2示出了本文实施例被测函数头文件解析过程的流程图;
[0046]
图3示出了本文实施例测试用例解析过程的流程图;
[0047]
图4示出了本文实施例根据解析结果自动生成测试代码过程的流程图;
[0048]
图5a示出了本文实施例代码段生成过程的第一流程图;
[0049]
图5b示出了本文实施例代码段生成过程的第二流程图;
[0050]
图6示出了本文实施例示出了嵌入式系统自动化测试代码生成装置的结构图;
[0051]
图7示出了本文实施例计算机设备的结构图。
[0052]
附图符号说明:
[0053]
610、第一解析模块;
[0054]
620、第二解析模块;
[0055]
630、代码生成模块;
[0056]
702、计算机设备;
[0057]
704、处理器;
[0058]
706、存储器;
[0059]
708、驱动机构;
[0060]
710、输入/输出模块;
[0061]
712、输入设备;
[0062]
714、输出设备;
[0063]
716、呈现设备;
[0064]
718、图形用户接口;
[0065]
720、网络接口;
[0066]
722、通信链路;
[0067]
724、通信总线。
具体实施方式
[0068]
下面将结合本文实施例中的附图,对本文实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本文一部分实施例,而不是全部的实施例。基于本文中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本文保护的范围。
[0069]
本文支持的开发语言包括但不限于嵌入式标准c语言、matlab语言等等,应用的嵌入式系统包括但不限于sylixos、vxworks等目前常用的嵌入式系统。
[0070]
本文一实施例中,如图1所示,提供一种嵌入式系统自动化测试代码生成方法,用于解决现有技术中人工生成嵌入式系统测试代码的方式存在浪费人力、工作效率低、测试代码生成过程差异性较大的技术问题,以及自动生成嵌入式系统测试代码的方式存在不适用于复杂逻辑的被测函数。本文所述的嵌入式系统自动化测试代码生成方法适用于被测代码复杂、修改频度高、变量数量比较大、层次结构复杂的情形,可以运行于智能终端,包括智能手机、平板电脑、台式计算机、服务器等,可以为单独的应用程序、内嵌于其他程序中的小程序等,或者也可以为网页形式等。
[0071]
具体的,嵌入式系统自动化测试代码生成方法包括:
[0072]
步骤110,从被测函数所在的c语言头文件中,解析得到常量信息及变量列表;
[0073]
步骤120,从被测函数的测试用例中,解析得到变量值信息;
[0074]
步骤130,根据所述常量信息、变量列表及变量值信息,自动生成被测函数的测试代码。
[0075]
本文所述的被测函数由c语言编程得到,被测函数的源代码中包含被测函数声明、被测函数形参中涉及到的结构体声明、数组、指针维度中出现的变量声明、宏定义、常量声明等头文,步骤110可从被测函数源程序中确定c语言头文件(通过识别#include关键字,递归获取)。常量信息指的是不变化的量,例如pi=3.14,变量列表中包含变化量的信息,包括数组、指针等。本步骤中,先识别被测函数c语言头文件,得到被测函数声明(返回值、形参列表、函数名称)、宏定义、常量声明(包括常量信息)、变量声明(包括变量类型、名称、数组或指针的维度维数,数组或指针的维数的声明)、结构体声明,然后再根据被测函数声明、宏定义、变量声明、结构体声明,得到变量列表。
[0076]
具体实施时,为了便于后续步骤调用,被测函数声明、宏定义、常量声明、变量声明、结构体声明以字典的形式进行缓存。
[0077]
本文中的形参列表指的是c语言头文件中,通过正则化表达式识别出来的形参名称的列表,单纯指字符串列表,存储的是数据对象,包括父子变量、数组、指针维度等信息。变量列表指的是经过解析,将每个形参转化为变量路径存储的内存对象,其中,变量路径是在一个被测函数相关的源码文件及头文件作用域内,用于唯一标识变量的字符串。
[0078]
上述步骤120中,被测函数的测试用例可通过如下方式确定:步骤110得到的变量
列表以树形表格形式展示在页面中,用户可通过该页面设置树形表格中每个节点的属性,例如,设置变量的维数、维度、默认值、边界值等等;属性设置完后,自动生成测试用例框架,用户根据实际需要,为每个变量设置对应的变量值(包括单值、文件、边界、脚本等多种格式赋值);节点属性及变量值设置完成后,得到测试用例。
[0079]
具体实施时,上述步骤110至步骤130均可由系统自动完成,或由用户通过点击控制页面按钮的方式触发自动生成测试代码的过程。
[0080]
上述步骤130生成的被测函数测试代码,按照一定规则生成测试程序源文件,以c语言为例,测试你程序源文件为*.c文件。
[0081]
本实施例通过从被测函数所在的c语言头文件中,解析得到常量信息及变量列表;从被测函数的测试用例中,解析得到变量值信息;根据所述常量信息、变量列表及变量值信息,能够代替人员手动编写测试代码,自动化生成被测函数的测试代码,节省了测试人员大量的时间精力(至少50%以上的工作量),测试人员可以将更多的时间和精力用在测试用例本身的编写上。本实施例解决了测试人员在白盒测试过程中,需要编写大量步骤繁琐的测试代码,且编码过程中极易产生人为编码错误,严重降低测试效率的问题,也简化了测试人员在编码层面的复杂度,无需深入了解c语言的语法结构,即可完成测试工作。同时,本实施例还可以统一测试代码的生产规范,适用于各种复杂逻辑的被测函数生成测试代码。复杂逻辑的被测函数例如为形参包括数十个,且未结构体数组、指针数组,结构体存在多层子节点,多层子节点又存在指针、数组、子结构等多种组合。
[0082]
本文一实施例中,如图2所示,上述步骤110的解析过程是基于正则表达式、c语言的语法结构及c语言的编码规范实现的,正则表达式、c语言的语法结构及c语言的编码规范具体参见现有技术,本文对此不再详述,具体的,上述步骤110的解析过程包括:
[0083]
步骤201,根据c语言的语法结构,从被测函数所在头文件中,识别常量信息、变量声明、结构体声明、函数声明及宏定义信息;
[0084]
步骤202,根据c语言的语法规范,解析变量声明及结构体声明,得到单值信息、指针维度信息、数组维度信息及变量路径信息;
[0085]
步骤203,根据宏定义信息、单值信息、指针维度信息、数组维度信息及变量路径信息,得到变量依赖关系;
[0086]
步骤204,根据正则表达式,解析函数声明,得到被测函数信息,其中,被测函数信息包括:被测函数名称、返回值、形参列表及形参的输入输出标记;
[0087]
步骤205,根据宏定义信息、单值信息、指针维度信息、数组维度信息、变量路径信息、变量依赖关系及被测函数信息,得到变量列表。
[0088]
具体的,步骤201中,按照c语言语法结构一,识别变量声明,c语言语法结构一如下:
[0089]
变量类型变量名称;//单值、对象
[0090]
变量类型*变量名称;//指针
[0091]
变量类型变量名称[];//数组
[0092]
按照c语言语法结构二,识别结构体声明,c语言语法结构二如下:
[0093]
typedef struct_xxx{
[0094]
变量声明列表
[0095]
}xxx;
[0096]
按照c语言语法结构三,识别函数声明,c语言语法结构三如下:
[0097]
返回值函数名称(形参列表);
[0098]
宏定义的名称和值,存储于宏定义字典中,在解析中,通过宏定义字典,可以识别到宏定义。
[0099]
常量的名称和值,存储于常量字典中,在解析中,通过常量字典,可以识别到常量。另外,根据static const关键字组合,识别常量并添加到常量字典中。
[0100]
上述步骤202中,解析变量声明中星号个数,确定指针的维数,解析变量声明中方括号的个数,确定数组的维数。根据c语言的语法规范,指针的每维的维度在等号右值中new关键字之后提取,数组每维的维度在方括号中提取。如果变量的声明中既没有星号也没有方括号标志,则视为单值型参数。
[0101]
在生成变量列表后,用户可以通过页面,设置指针和数组每维的维度(维度支持单值型数据、宏定义、脚本、函数及四则运算表达式)。
[0102]
结构体及其内部成员实际上是一对多的关系,用一对多的数据结构维护,结构体本身作为父节点,成员变量作为子点,对于结构体的解析是一个递归过程,当一个变量无任何子节点时,称该变量为叶子节点,当全部叶子节点解析完后,生成各节点的变量路径信息,变量路径记录有结构体中成员变量的路径信息,例如,假设结构体a有两个成员变量b和c,那么结构体a解析完成后得到的变量路径有3个,分别为a、a.b、a.c。
[0103]
上述步骤203中,根据步骤201及步骤202得到的结果,得到变量的依赖关系。如果变量的右值或者变量的数组、指针的维度中,存在其它类型的变量,则需要解析该变量的依赖关系,在后续处理逻辑中,被依赖的变量,需要优先声明赋值。举例来说,如果存在变量int a=5;当另一个变量声明为int*b=new int[a]时,则a、b存在依赖关系,b依赖于a,在后续生成代码段时,a变量必须优先于b变量声明赋值。否则会导致程序执行异常。本文中,所有变量最终以变量路径形式,存储为一个一维数组,再按优先声明赋值的顺序,保存所有变量路径。变量依赖关系的建立逻辑如下:
[0104]
当前变量的数组、指针维度中出现的变量(由指针维度信息、数组维度信息确定),优先于当前变量声明赋值;
[0105]
结构体中,父节点优先于子节点声明,其中,父节点及子节点由变量路径信息;
[0106]
当前变量(由宏定义确定)等号右值优先于左值声明赋值。
[0107]
上述步骤204中,形参的输入输出标记可根据c语言编码规范的约定确定,或是由人为进行标注,具体的,被测函数信息以图形化展示,并提供人机交互接口,用户仅需简单设置,即可完成对被测函数中形参的输入、输出变量的定义,而不需要用户编写代码。
[0108]
上述步骤205中,根据步骤203得到的变量依赖关系分别将输入标记及输出标记对应的宏定义信息、指针维度信息、数组维度信息、变量路径信息分别存储于输入变量字典和输出变量字典中。
[0109]
本文一实施例中,如图3所示,上述步骤120从被测函数的测试用例中,解析得到变量值信息,包括:
[0110]
步骤301,解析被测函数的测试用例,确定变量值类型;
[0111]
步骤302,根据变量值类型,解析变量值信息。
[0112]
步骤301确定出的变量值类型包括但不限于文件类型、脚本类型、边界类型、单值类型。
[0113]
详细的说,步骤302根据变量值类型,解析变量值信息,包括:
[0114]
若变量值类型为文件类型,则读取文件,将文件内容转换为一维数组。为了保证数据个数一致,确保升维降维处理过程中,不会越界,例如一个3x4x5的整形数组,在转换为一维数组时,它的数据字节数应该为:3x4x5xsizeof(int),即含有60个int型数据的一维数组,在将文件内容转换为一维数组之前,还包括根据变量的数据类型和维度维数信息(可由变量列表确定),验证文件内容是否匹配,若匹配,则将文件内容转换为一维数组。
[0115]
若变量值类型为脚本类型,脚本可以通过上传方式保存在服务器中,也可以从服务器中现有的脚本中选择,配置脚本运行环境并执行脚本,得到脚本返回值,将脚本返回值转换为一维数组。
[0116]
若变量值类型为边界类型,则展开边界,得到边界值序列,缓存到内存中。边界值约定必须是以方括号括起来的一组值,取数列中的最大值和最小值,在分别计算最大最小值的加减给定最小步长的值(比如最大值为100,步长为1,则100将展开为99、100、101三个值。再比如最小值为0.0,步长为0.2,则0.0将展开为-0.2、0.0、0.2三个值)。
[0117]
若变量值类型为单值类型,则得到单点值。其中,单值类型例如为int、float、double、char之一(支持有无符号),按单点值形式缓存到内存中。
[0118]
文件类型、脚本类型及边界类型,按照数组或指针维度记性赋值,单值类型变量值可直接赋值。
[0119]
所述一维数组、边界值序列及单点值组成变量值信息。变量值信息以字典形式缓存在内存中,字典的key为变量路径,字典的值为经过步骤302解析后的内存值。详细的说,本文中提到的“字典”,是指编程语言中的数据结构,字典是一种可变容器模型,且可存储任意类型对象。字典中的每个键值可以用key-value键值对表示,键值对中的key和value用冒号分割,每个键值对之间用逗号分割,整个字典包括在花括号中。整个字典中,键必须具有唯一性,值则不必,值可以取任何数据类型,但键必须是不可变数据类型,如:字符串,整型,元组。字典查询效率高,内部使用key来计算一个内存地址,一般用hash。
[0120]
本文一实施例中,如图4所示,上述步骤130根据所述常量信息、变量列表及变量值信息,自动生成被测函数的测试代码,包括:
[0121]
步骤401,根据常量信息、变量列表及变量值信息,结合目标语言的语法结构及编码规范,生成各类型代码段;
[0122]
步骤402,组合各类型代码段,生成测试代码,关联测试代码与所述被测函数的测试用例。具体实施时,各代码段以字符串的形式拼接到一起,并以utf8格式,保存为文件。为了便于查找,可按下述规则生成文件名称:test_被测函数名称.c。
[0123]
步骤401中所述的目标语言包括但不限于c语言,matlab语言,java语言,phthon语言等等,本文对目标语言具体为何不做限定。目标语言的语法结构及编码规范可参见现有技术,本文对此不作限定。代码段为构成测试代码的一段代码,对应于不同类型的代码段,例如,c语言代码中涉及的变量声明的代码段、变量分配空间代码段、变量赋值代码段及被测函数返回值代码段。代码段以文件流形式存储于本地磁盘中。
[0124]
一些具体实施方式中,如图5a所示,上述步骤401根据常量信息、变量列表及变量
值信息,结合目标语言的语法结构及编码规范,生成各类型代码段生成各类型代码段的过程包括:
[0125]
步骤501,根据宏定义信息及常量信息,生成宏定义代码段及常量代码段;
[0126]
步骤502,根据单值信息、指针维度信息、数组维度信息、变量路径信息及变量依赖关系,生成变量声明代码段及变量分配空间代码段;
[0127]
步骤503,根据变量列表(宏定义信息、单值信息、指针维度信息、数组维度信息、变量路径信息、变量依赖关系、被测函数信息)及变量值信息,生成变量赋值代码段及被测函数返回值代码段。
[0128]
步骤504,根据被测函数信息,生成被测函数调用代码段。
[0129]
在步骤501中,根据宏定义信息按如下语法结构生成宏定义代码段:
[0130]
#define宏定义名称(宏定义值)。
[0131]
根据常量信息按如下语法结构生成常量代码段:
[0132]
const常量类型常量名称=常量值;
[0133]
在步骤502中,变量声明的代码段格式为如下三种任意组合的声明形式:
[0134]
变量类型变量名称;//单值型变量,变量类型可以是基础数据类型,也可以是结构体。
[0135]
变量类型*变量名称;//指针型变量。星号个数可以有多个。
[0136]
变量类型变量名称[xxx];//数组型变量,方括号个数可以有多个,其中xxx必须符合c语言语法规范。
[0137]
其中,单值型变量由单值信息及变量路径信息生成。指针型变量由指针维度信息生成,数组型变量由数组维度信息生成。
[0138]
变量声明代码段中声明变量的顺序按照变量依赖关系依次声明。
[0139]
在c语言中,指针型变量,需要预先分配存储空间后才能使用,分配空间的变量即包括输入变量,也包括输出变量,分配空间时,以目标语言为c语言为例,按照以下逻辑处理:
[0140]
(1)如果该变量存在父节点,则优先处理父节点的分配空间逻辑;
[0141]
(2)如果该变量存在依赖的变量,则优先处理依赖变量的分配空间逻辑;
[0142]
(3)如果该变量存在数组,则按数组维数和维度,从右向左的顺序计算数据个数,举例如下,假设存在一个数组:
[0143]
int a[2][3];
[0144]
则分配的空间大小为:sizeof(int)*3*2;
[0145]
(4)如果该变量存在指针,则按指针维数和维度,从右向左的顺序计算数据个数,举例如下,假设存在一个双指针变量:
[0146]
int**b;,其中*b中的数据维度为3,**b中的数据维度为2
[0147]
分配指针空间时,必须遵循从左往右的原则,以b变量为例说明,先分配左侧第一个星号的空间,在分配左侧第二个星号的空间,代码逻辑如下:
[0148]
b=malloc(sizeof(int*)*2);
[0149]
for(int i=0;i<2;i++)
[0150]
ꢀꢀ
b[i]=malloc(sizeof(int)*3);
[0151]
(5)上述原则可以自由组合使用。
[0152]
在步骤503中,对于变量赋值代码段而言,需要赋值的变量包括变量列表中标记为输入标记的变量,根据变量依赖关系依次赋值变量。以目标语言为c语言为例,赋值过程与分配空间过程类似,不同之处在于,将malloc语句,替换为赋值语句,如果存在数组或指针,则需要将一维数组转换为真实数组和指针的维度,以步骤502中b变量为例说明赋值过程,首先,在测试用例的变量值信息中,找到b变量的数据值,假设为:data[6]={1,2,3,4,5,6},则赋值语句如下:
[0153]
for(int i=0;i<2;i++)
[0154]
ꢀꢀ
for(int j=0;j<3;j++)
[0155]
ꢀꢀꢀꢀ
b[i][j]=data[sizeof(int)*3*i+j]
[0156]
一些其它实施方式中,还可以将数组作为一段连续的内存空间,通过memcpy函数,赋值给b[i]指向的空间。此处不再详细描述。
[0157]
对于被测函数返回值代码段而言,需要获取的变量仅包括变量列表中具有输出标记的变量,同输入变量一样,也要确保按照变量依赖关系依次取值。取值过程与赋值过程类似,不同之处在于,当存在数组或指针时,赋值的过程是升维的,取值的过程是降维的,即需要将真实数组和指针的维度转换为一维数组。以步骤502中的b变量举例说明取值过程(假设b变量即为输入变量也为输出变量)其取值语句如下:
[0158]
data=new int[sizeof(int)*3*2];
[0159]
for(int i=0;i<2;i++)
[0160]
ꢀꢀ
for(int j=0;j<3;j++)
[0161]
ꢀꢀꢀꢀ
data[sizeof(int)*3*i+j]=b[i][j];
[0162]
同赋值一样,这里也存在更优化的取值方法是,将数组作为一段连续的内存空间,通过memcpy函数,赋值给b[i]指向的空间。此处不再详细描述。
[0163]
被测函数返回值代码段读取的数据缓存至测试结果的字典中,或者以变量文件形式输出至本地磁盘。
[0164]
步骤504中,根据被测函数信息,依次生成返回值语句、函数名称语句及变量列表语句,返回值语句、函数名称语句及变量列表语句组成被测函数调用代码段。
[0165]
具体实施时,如图5b所示,除了生成上述代码段外,还包括:
[0166]
步骤5011,根据用户信息,生成注释代码段;
[0167]
步骤5012,根据所述被测函数所在的c语言头文件,生成包含代码段。
[0168]
在步骤5011中,用户信息指的是用户输入的作者信息及摘要信息,可利用注释代码模板生成注释代码段,其中,注释代码段模板包括:文件名称、文件标识、摘要信息、当前版本、作者信息、日期等字段。文件名称和文件标识根据指定规则自动生成。摘要信息通过在测试用例页面中,用户手动录入获取。当前版本和日期系统自动生成。作者信息通过登录用户的真实名称获取。注释代码段来源于文件模板,程序首先读取注释代码模板,然后将其中特殊标识的字段替换为当前真实数据。注释代码模板内容如下所示:
[0169]
/*
[0170]
*copyright(c)${createtime}
[0171]
*all rights reserved
[0172]
*文件名称:${filename}
[0173]
*文件标识:${identity}
[0174]
*摘要:${summary}
[0175]
*当前版本:${version}
[0176]
*作者:${author}
[0177]
*完成日期:${modifytime}
[0178]
*/。
[0179]
上述步骤5012中,包含代码段用于包含头文件,这些头文件包括被测函数所在的c语言头文件,还包括通用头文件,其中,通用头文件是由用户自行维护,当被测函数单一、不复杂的情况下,无需引入通用头文件。头文件可按照以下规则添加到包含代码段中:
[0180]
#include"头文件名"。
[0181]
本文一实施例中,为了满足用户个性化生成测试代码的需求,生成代码段的过程还包括:
[0182]
生成自定义函数代码段,自定义函数为用户自行维护的函数代码,包括函数声明、变量声明、赋值等内容。具体实施时,自动化测试代码生成程序可仅提供一个植入用户自定义函数代码的入口,自定义函数作为字符串直接复制到此处,程序不做任何额外处理。
[0183]
本文提供的嵌入式系统自动化测试代码生成方法能够实现如下技术效果:
[0184]
(1)根据被测函数声明的头文件自动提取变量列表;
[0185]
(2)自动实现了测试用例的解析,得到变量值信息,不需要用户手动编写测试用例变量值信息;
[0186]
(3)自动生成被测函数的测试程序源代码,不需要用户手动编写测试程序源代码。
[0187]
基于同一发明构思,本文还提供一种嵌入式系统自动化测试代码生成装置,如下面的实施例所述。由于嵌入式系统自动化测试代码生成装置解决问题的原理与嵌入式系统自动化测试代码生成方法相似,因此嵌入式系统自动化测试代码生成装置的实施可以参见嵌入式系统自动化测试代码生成方法,重复之处不再赘述。
[0188]
如图6所示,嵌入式系统自动化测试代码生成装置包括多个功能单元和模块,均可以由专用或者通用芯片实现,还可以通过软件程序实现,具体的,嵌入式系统自动化测试代码生成装置包括:
[0189]
第一解析模块610,用于从被测函数所在的c语言头文件中,解析得到常量信息及变量列表;
[0190]
第二解析模块620,用于从被测函数的测试用例中,解析得到变量值信息;
[0191]
代码生成模块630,用于根据所述常量信息、变量列表及变量值信息,自动生成被测函数的测试代码。
[0192]
本文进一步实施例中,第一解析模块610从被测函数所在c语言头文件中,解析得到变量列表,包括:
[0193]
根据c语言的语法结构,从被测函数所在头文件中,识别变量声明、结构体声明、函数声明及宏定义信息;
[0194]
根据c语言的语法规范,解析变量声明及结构体声明,得到单值信息、指针维度信息、数组维度信息及变量路径信息;
[0195]
根据宏定义信息、单值信息、指针维度信息、数组维度信息及变量路径信息,得到变量依赖关系;
[0196]
根据正则表达式,解析函数声明,得到被测函数信息,其中,被测函数信息包括:被测函数名称、返回值、形参列表及形参的输入输出标记;
[0197]
根据宏定义信息、单值信息、指针维度信息、数组维度信息、变量路径信息、变量依赖关系及被测函数信息,得到变量列表。
[0198]
本文进一步实施例中,第二解析模块620从被测函数的测试用例中,解析得到变量值信息,包括:解析被测函数的测试用例,确定变量值类型;根据变量值类型,解析变量值信息。
[0199]
具体实施时,根据变量值类型,解析变量值信息,包括:
[0200]
若变量值类型为文件类型,则读取文件,将文件内容转换为一维数组;
[0201]
若变量值类型为脚本类型,则获取脚本,将脚本转换为一维数组;
[0202]
若变量值类型为边界类型,则展开边界,得到边界值序列;
[0203]
若变量值类型为单值类型,则得到单点值;
[0204]
所述一维数组、边界值序列及单点值组成变量值信息。
[0205]
本文进一步实施例中,代码生成模块630根据所述常量信息、变量列表及变量值信息,自动生成被测函数的测试代码,包括:
[0206]
根据所述常量信息、变量列表及变量值信息,结合目标语言的语法结构及编码规范,生成各类型代码段;
[0207]
组合所述代码段,生成测试代码,关联测试代码与所述被测函数的测试用例。
[0208]
其中,根据所述常量信息、变量列表及变量值信息,结合目标语言的语法结构及编码规范,生成各类型代码段,包括:
[0209]
根据宏定义信息及常量信息,生成宏定义代码段及常量代码段;
[0210]
根据单值信息、指针维度信息、数组维度信息、变量路径信息及变量依赖关系,生成变量声明代码段及变量分配空间代码段;
[0211]
根据变量列表及变量值信息,生成变量赋值代码段及被测函数返回值代码段;
[0212]
根据被测函数信息,生成被测函数调用代码段。
[0213]
本文进一步实施例中,代码生成模块630还用于根据用户信息,生成注释代码段;根据所述被测函数所在的c语言头文件,生成包含代码段。
[0214]
本文提供的嵌入式系统自动化测试代码生成装置,通过从被测函数所在的c语言头文件中,解析得到常量信息及变量列表;从被测函数的测试用例中,解析得到变量值信息;根据所述常量信息、变量列表及变量值信息,能够代替人员手动编写测试代码,自动化生成被测函数的测试代码,节省了测试人员大量的时间精力(至少50%以上的工作量),测试人员可以将更多的时间和精力用在测试用例本身的编写上。本文解决了测试人员在白盒测试过程中,需要编写大量步骤繁琐的测试代码,且编码过程中极易产生人为编码错误,严重降低测试效率的问题,也简化了测试人员在编码层面的复杂度,无需深入了解c语言的语法结构,即可完成测试工作。同时,本文还可以统一测试代码的生产规范,适用于各种复杂逻辑的测试代码。
[0215]
本文一实施例中,还提供一种计算机设备,如图7所示,计算机设备702可以包括一
个或多个处理器704,诸如一个或多个中央处理单元(cpu),每个处理单元可以实现一个或多个硬件线程。计算机设备702还可以包括任何存储器706,其用于存储诸如代码、设置、数据等之类的任何种类的信息。非限制性的,比如,存储器706可以包括以下任一项或多种组合:任何类型的ram,任何类型的rom,闪存设备,硬盘,光盘等。更一般地,任何存储器都可以使用任何技术来存储信息。进一步地,任何存储器可以提供信息的易失性或非易失性保留。进一步地,任何存储器可以表示计算机设备702的固定或可移除部件。在一种情况下,当处理器704执行被存储在任何存储器或存储器的组合中的相关联的指令时,计算机设备702可以执行相关联指令的任一操作,具体的,处理器704执行时,实现前述任一实施例所述的嵌入式系统自动化测试代码生成方法。计算机设备702还包括用于与任何存储器交互的一个或多个驱动机构708,诸如硬盘驱动机构、光盘驱动机构等。
[0216]
计算机设备702还可以包括输入/输出模块710(i/o),其用于接收各种输入(经由输入设备712)和用于提供各种输出(经由输出设备714))。一个具体输出机构可以包括呈现设备716和相关联的图形用户接口(gui)718。在其他实施例中,还可以不包括输入/输出模块710(i/o)、输入设备712以及输出设备714,仅作为网络中的一台计算机设备。计算机设备702还可以包括一个或多个网络接口720,其用于经由一个或多个通信链路722与其他设备交换数据。一个或多个通信总线724将上文所描述的部件耦合在一起。
[0217]
通信链路722可以以任何方式实现,例如,通过局域网、广域网(例如,因特网)、点对点连接等、或其任何组合。通信链路722可以包括由任何协议或协议组合支配的硬连线链路、无线链路、路由器、网关功能、名称服务器等的任何组合。
[0218]
本文一实施例中,还提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述任一实施例所述的嵌入式系统自动化测试代码生成方法。
[0219]
本文一实施例中,还提供一种计算机可读指令,其中当处理器执行所述指令时,其中的程序使得处理器执行任一实施例所述的嵌入式系统自动化测试代码生成方法。
[0220]
应理解,在本文的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本文实施例的实施过程构成任何限定。
[0221]
还应理解,在本文实施例中,术语“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系。例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
[0222]
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本文的范围。
[0223]
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0224]
在本文所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通
过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口、装置或单元的间接耦合或通信连接,也可以是电的,机械的或其它的形式连接。
[0225]
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本文实施例方案的目的。
[0226]
另外,在本文各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以是两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0227]
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本文的技术方案本质上或者说对现有技术做出贡献的部分,或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本文各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0228]
本文中应用了具体实施例对本文的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本文的方法及其核心思想;同时,对于本领域的一般技术人员,依据本文的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本文的限制。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1