一种函数测试代码的生成方法及装置与流程

文档序号:12123625阅读:213来源:国知局
一种函数测试代码的生成方法及装置与流程

本发明涉及软件技术领域,特别涉及一种函数测试代码的生成方法及装置。



背景技术:

随着信息技术的不断发展,应用程序的开发及应用得到飞速的发展。应用程序的开发过程中,为了保证代码中逻辑的正确性,通常会编写测试用例代码用于检测函数功能的正确性。

在Java语言开发的项目中,使用最多的测试框架是由Erich Gamma和Kent Beck编写的一个回归测试框架:Junit单元测试框架。使用该测试框架能够帮助开发人员测试代码中函数功能的正确性。但是,这个方案有一个非常致命的缺陷,那就是所有的测试代码都需要人工手动编写,这样就会花费大量的人力成本,同时,由于人工手动编写测试代码大大降低了开发过程中的测试效率。

可见,现有技术的应用程序开发过程中存在测试效率低下的技术问题。



技术实现要素:

本发明实施例提供一种函数测试代码的生成方法及装置,解决现有技术的应用程序开发过程中存在测试效率低下的技术问题,提高测试效率。

本申请实施例提供一种函数测试代码的生成方法,所述方法包括:

对待测试的目标函数设置函数测试埋点,所述函数测试埋点为表征所述目标函数各组成部分的位置;

基于所述函数测试埋点,读取并解析所述目标函数的代码源文件,获得所述目标函数的函数名称、函数参数、函数返回类型的值;

基于所述目标的函数名称、函数参数、函数返回类型的值,构造所述目标函数的测试函数,并生成所述目标函数的测试代码文件。

可选的,所述对目标函数设置函数测试埋点,包括:

分别对所述目标函数的函数名称、函数参数、返回类型设置函数测试埋点。

可选的,所述基于所述函数测试埋点,读取并解析所述目标函数的代码源文件,包括:

通过文档读取方式打开所述目标函数的源文件;

将打开的源文件转换为输入流,从输入流中获得所述函数测试埋点的埋点标示符;

读取所述埋点标示符对应的起始位置标识和结束位置标识之间的目标数据;

将所述目标数据作为所述埋点标示符对应的函数名称、函数参数或者函数返回类型。

可选的,所述基于所述目标的函数名称、函数参数、函数返回类型的值,构造所述目标函数的测试函数,包括:

基于所述目标函数的函数名称的值构造所述测试函数的函数名称;

通过数据交换格式JSON解析,获得所述目标函数中函数参数的值对应的所有参数值,由所述所有参数值构造出所述测试函数的函数参数;

设置与所述目标函数的函数返回类型的值相同的变量来接收并保存所述测试函数的函数返回值。

可选的,所述生成所述目标函数的测试代码文件,包括:

将所述测试函数的函数名称、函数参数、函数返回值以及打印所述函数返回值功能的信息写入所述测试代码文件中。

本申请实施例还提供一种函数测试代码的生成装置,所述装置包括:

埋点单元,用于对待测试的目标函数设置函数测试埋点,所述函数测试埋点为表征所述目标函数各组成部分的位置;

解析单元,用于基于所述函数测试埋点,读取并解析所述目标函数的代码源文件,获得所述目标函数的函数名称、函数参数、函数返回类型的值;

生成单元,用于基于所述目标的函数名称、函数参数、函数返回类型的值,构造所述目标函数的测试函数,并生成所述目标函数的测试代码文件。

可选的,所述埋点单元,用于:分别对所述目标函数的函数名称、函数参数、返回类型设置函数测试埋点。

可选的,所述解析单元,包括:

打开子单元,用于通过文档读取方式打开所述目标函数的源文件;

获取子单元,用于将打开的源文件转换为输入流,从输入流中获得所述函数测试埋点的埋点标示符;

读取子单元,用于读取所述埋点标示符对应的起始位置标识和结束位置标识之间的目标数据;将所述目标数据作为所述埋点标示符对应的函数名称、函数参数或者函数返回类型。

可选的,所述生成单元,包括:

名称构造子单元,用于基于所述目标函数的函数名称的值构造所述测试函数的函数名称;

参数构造子单元,用于通过数据交换格式JSON解析,获得所述目标函数中函数参数的值对应的所有参数值,由所述所有参数值构造出所述测试函数的函数参数;

返回值构造子单元,用于设置与所述目标函数的函数返回类型的值相同的变量来接收并保存所述测试函数的函数返回值。

可选的,所述生成单元,还用于:将所述测试函数的函数名称、函数参数、函数返回值以及打印所述函数返回值功能的信息写入所述测试代码文件中。

本申请实施例中的上述一个或多个技术方案,至少具有如下一种或多种技术效果:

本申请实施例提供一种函数测试代码的生成方法,对待测试的目标函数设置函数测试埋点,并基于函数测试埋点读取并解析目标函数的函数名称、函数参数及函数返回类型的值,进而根据目标函数的函数名称、函数参数及函数返回类型的值构造测试函数并生成测试代码文件,实现了测试代码的自动生成,不再需要开发人员手动编写测试代码,从而解决了现有技术的应用程序开发过程中测试效率低下的技术问题,提高了测试效率。

附图说明

图1为本申请实施例提供的一种函数测试代码的生成方法的流程图;

图2为本申请实施例提供的读取及解析代码源文件的流程图;

图3为本申请实施例提供的生成测试代码文件的示意图;

图4为本申请实施例提供的一种函数测试代码的生成装置。

具体实施方式

在本申请实施例提供的技术方案中,通过对待测试的目标函数设置函数测试埋点,来读取并解析目标函数的各组成部分,并根据目标函数的各组成部分构造测试函数、生成测试代码文件,实现测试代码的自动生成,解决现有技术中因手动编写测试代码导致的测试效率低下的技术问题。

下面结合附图对本申请实施例技术方案的主要实现原理、具体实施方式及其对应能够达到的有益效果进行详细的阐述。

实施例一

请参考图1,本申请实施例提供一种函数测试代码的生成方法,该方法包括:

S101:对待测试的目标函数设置函数测试埋点,所述函数测试埋点为表征所述目标函数各组成部分的位置;

S102:基于所述函数测试埋点,读取并解析所述目标函数的代码源文件,获得所述目标函数的函数名称、函数参数、函数返回类型的值;

S103:基于所述目标的函数名称、函数参数、函数返回类型的值,构造所述目标函数的测试函数,并生成所述目标函数的测试代码文件。

在具体实施过程中,为了能够方自动生成测试代码,本申请实施例首先执行S101在源代码中进行埋点设置。设置函数测试埋点主要就是在函数上添加以埋点标示符开头的测试描述信息。其中,埋点标示符为用于区别目标函数所在应用程序的变量或者函数的字符,且不影响应用程序的运行,例如:Java语法中变量或者函数等都不能使用@开头,那么在Java程序中可以使用@作为埋点标示符。需要说明的是,本申请实施例并不限制埋点标示符的具体形式,采用不同变成语言的程序,可以使用不同的埋点标示符,如假设在C++程序中#不能用于变量或者函数的开头,那么在C++程序中可以采用#作为埋点标示符。

下面以Junit单元测试框架下,Java程序中用@对源代码中的待测试函数进行埋点为例,对本申请实施例提供的埋点设置进行详细说明。

一个函数通常包含有三组成部分:1、函数名;2、函数参数;3、函数返回值,所以对函数进行埋点设置时,可以分别对函数名称、函数参数及函数返回类型设置函数测试埋点,通过这三个函数测试埋点的设置就能够非常准确的标识一个函数,以便于后续对其解析生成对应的测试代码。

函数测试埋点用于表征目标函数各组成部分的位置,包括:埋点标示符,与埋点标示符对应的起始位置标识和结束位置标识,例如:@funName:[函数名称]、@funParam:[函数参数]、@return:[返回类型],“[”和“]”分别为@对应的起始位置标识和结束位置标识,即在“[”和“]”内的目标数据为需要进行读取并解析的函数数据。

a)@funName:[函数名称]

为了方便理解埋点注视规则,对上述形式举例如下:@funName:[addFun],表示对addFun的函数(addFun为具体的函数名称)进行埋点注解,埋点的函数后面会对埋点进行解析然后生成该函数对应的测试代码。

b)@funParam:[函数参数]

同样的,形式举例如下:@funParam:[A],表示对参数A进行埋点注解,需要对该参数A进行解析生成对应的测试代码。

其中“[函数参数]”中的函数参数通过JSON((JavaScript Object Notation,是一种轻量级的数据交换格式)形式来进行描述。JSON能够很方便的描述一个或者多个对象的具体信息。通过JSON能够很方便的将多个参数描述清晰。

例如:下面的格式来描述Person参数的信息:

对上面JSON字符串的解释如下:

Param1:Param1代表第一个参数,有几个参数就是param几。Param1内部是对该参数的描述,示例中Param1中的参数是Person。

Person:是一个自定义类型,接下来Person里面的内容是对Person的描述,其中描述了age(年龄)是10岁,name(名字)是tom,height(身高)是180。

Param2:Param2代表传入该函数的第二个参数,这个参数仅仅包含一个hobby变量,其值是play。

c)@return:[返回类型]

如果一个函数有返回值那么将该返回值通过@return语句进行埋点,例如:@return:[String],这句话的意思表示该函数会有返回值,且返回值是String类型。

针对埋点设置完成的目标函数,执行S102读取并解析目标函数的代码源文件,具体实施过程如下:

步骤1、通过文档读取方式打开目标函数的源文件。

其中,具体可以通过File类(Java语言JDK自带的工具类)实现,例如:通过调用File file=File(filePath)(File是方法名称,filePath表示文件所在的绝对路径),就能够将filePath对应的文件打开,并将打开的文件命名为file。

步骤2、将打开的源文件转换为输入流,从输入流中获得函数测试埋点的埋点标示符。

具体的,可以采用fileInputStream=new FileInputStream(file),将file转换成为输入流,并将输入流命名为fileInputStream,)针对输入流fileInputStream,可以采用readline方法(读取输入流所对应文件的一整行的函数方法)去逐行读取文件中的一行信息。采用逐行读取就是循环的去调用fileInputStream中的readline方法,并将读取到的当前行的数据保存到String类型的变量lineString中。

在lineString中通过调用contains(“@”)方法(该方法主要功能是判断该字符串中是否包含@这个字符串)来判断当前行中是否包含@这个埋点标示符。如果没有包含@这个标示符,那么继续读取下一行的数据,如图2所示。读取下一行的数据同样是调用fileInputStream中的readline方法。如果包含了@这个标示符执行步骤3。

步骤3、读取埋点标示符对应的起始位置标识和结束位置标识之间的目标数据。

由于读取到了@这个标示符,说明这一行中包含需要解析的信息。这一步骤中则需要确定lineString中标示符@的位置。在lineString中可以通过调用indexOf(“@”)函数来定位标示符@的位置信息,这个函数主要功能是返回lineString中的@这个字符串所在位置信息(假设用pos1来表示这个位置)。从pos1这个位置开始,然后通过循环遍历的方式取出后面第一个“[]”符号之内的所有数据,如图2所示。从pos1这个位置开始,一次取出一个字符(使用charAt(pos1)的函数获得pos1的字符串值,循环过程中每次的位置值加1),然后判断这个字符是不是和”[“或者”]”,这两个字符相等。如果是和“[”相等,那么从此开始记录后面的数据。如果是和“]”相等,那么停止记录数据。从开始位置标识处开始,到结束位置标识处结束,读取到的数据就是需要获取的真实数据值,即目标数据。

步骤4、将目标数据作为埋点标示符对应的函数名称、函数参数或者函数返回类型的值。若@后面紧跟的字符串为funName,那么@后面的第一个“[]”符号里的目标数据则为函数名称的值;若@后面紧跟的字符串为funParam,那么@后面的第一个“[]”符号里的目标数据则为函数参数的值;若@后面紧跟的字符串为return,那么@后面的第一个“[]”符号里的目标数据则为函数返回类型的值。

需要说明的是:为了后续描述方便,本申请实施例用funName来表示函数名称@funName的具体值信息;用returnValue来表示函数返回类型@return的具体值信息;用paramValue来表示函数参数@funParam的具体值信息。

在S102之后,执行S103基于读取的函数名称、函数参数、函数返回类型的值,构造目标函数的测试函数,并生成目标函数的测试代码文件。

请参考图3,构造目标函数的测试函数,具体包括如下步骤:

S31:基于目标函数的函数名称的值构造测试函数的函数名称。

通过上面S102的解析已确定需要测试的目标函数名称是funName,为了统一命名规则可以构造测试函数的名称是testfunName,就是在原来的函数名称前面添加test的前缀,其主要目的是为了明确测试函数功能和统一命名规则。本申请实施例并不限制测试函数的函数名称的具体命名,也可以是t-funName、funNametest等。

S32:通过数据交换格式JSON解析,获得目标函数中函数参数的值对应的所有参数值,由所有参数值构造出测试函数的函数参数。

由于函数参数是标准的JSON格式,可以通过JSON解析(通用技术),解析出paramValue中所有的参数值,然后根据解析出来的值来构造出来测试函数的函数参数。例如:上述Person参数的信息,解析出Person中的具体值包括:"age":"10","name":"tom","height":180,那么通过Person的构造函数实例化Person对象出来。

S33:设置与目标函数的函数返回类型的值相同的变量来接收并保存测试函数的函数返回值。

通过returnValue已确认目标函数的返回数据是什么,为此,可以使用相同类型的变量对测试函数的返回类型的值进行接收并保存在returnValue2中。将函数返回值打印出来,通过系统的打印函数System.println(“returnValue2”)(这个函数主要功能是打印,将括号内的信息打印到控制台上),将函数的返回值打印到控制台中。

通过上述测试函数的构造,获得了测试函数的函数名称、函数参数、函数返回值,接下来,生成目标函数的测试代码文件。具体的,将上述测试函数的函数名称、函数参数、函数返回值、以及打印返回值功能等信息全部写入到文件中。写入文件的方式是通过FileWriter类(JDK提供的工具类)完成。通过调用FileWriter中的write函数(该函数主要功能是将信息写入到文件中),将相应的信息写入到文件中。

写入文件的操作如下:

1、通过FileWriter类的构造函数得到FileWriter对象,构造函数(例如:FileWriter("C:\\demo1.java",false);)中需要传递2个参数:第一个参数:是需要写入文件的位置,即写入的文件;第二个参数:是否文件续写(也就是文件追加写入),如果是true就是追加写入,如果是false就是重新开始写入。

2、FileWriter的构造函数返回后得到一个FileWriter的对象fw,fw里面有一个write函数,这个函数的主要功能是写入文件操作。(例如:fw.write(“写入一些信息”),这样将会把双引号的内容写入文件中)。

3、文件写入完毕以后,fw里面有一个close函数,通过调用close函数后,系统会关闭相应的文件操作的资源占用,释放文件读写的内存等资源。

通过上述实施例提供的一种函数测试代码的生成方法中实现了自动化生成测试代码的功能,能够大大节省开发人员编写测试代码的时间,极大的提高了开发过程中的测试效率。

基于同一发明构思,本申请实施例还基于上述函数测试代码的生成方法,对应提供一种函数测试代码的生成装置,如图4所示,该装置包括:

埋点单元41,用于对待测试的目标函数设置函数测试埋点,所述函数测试埋点为表征所述目标函数各组成部分的位置;

解析单元42,用于基于所述函数测试埋点,读取并解析所述目标函数的代码源文件,获得所述目标函数的函数名称、函数参数、函数返回类型的值;

生成单元43,用于基于所述目标的函数名称、函数参数、函数返回类型的值,构造所述目标函数的测试函数,并生成所述目标函数的测试代码文件。

在具体实施过程中,所述埋点单元41,用于:分别对所述目标函数的函数名称、函数参数、返回类型设置函数测试埋点。

所述解析单元42包括:打开子单元、获取子单元及读取子单元。打开子单元用于通过文档读取方式打开所述目标函数的源文件;获取子单元用于将打开的源文件转换为输入流,从输入流中获得所述函数测试埋点的埋点标示符;读取子单元用于读取所述埋点标示符对应的起始位置标识和结束位置标识之间的目标数据;将所述目标数据作为所述埋点标示符对应的函数名称、函数参数或者函数返回类型。

所述生成单元43,包括:名称构造子单元、参数构造子单元及返回值构造子单元。名称构造子单元用于基于所述目标函数的函数名称的值构造所述测试函数的函数名称;参数构造子单元用于通过数据交换格式JSON解析,获得所述目标函数中函数参数的值对应的所有参数值,由所述所有参数值构造出所述测试函数的函数参数;返回值构造子单元用于设置与所述目标函数的函数返回类型的值相同的变量来接收并保存所述测试函数的函数返回值。

所述生成单元43在生成测试代码文件时,具体用于:将所述测试函数的函数名称、函数参数、函数返回值以及打印所述函数返回值功能的信息写入所述测试代码文件中。

关于上述实施例中的装置,其中各个单元执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。

通过本申请实施例中的一个或多个技术方案,可以实现如下一个或多个技术效果:

本申请实施例提供一种函数测试代码的生成方法,对待测试的目标函数设置函数测试埋点,并基于函数测试埋点读取并解析目标函数的函数名称、函数参数及函数返回类型的值,进而根据目标函数的函数名称、函数参数及函数返回类型的值构造测试函数并生成测试代码文件,实现了测试代码的自动生成,不再需要开发人员手动编写测试代码,从而解决了现有技术的应用程序开发过程中测试效率低下的技术问题,提高了测试效率。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

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