一种单元测试脚本的生成方法及装置与流程

文档序号:26804657发布日期:2021-09-29 02:23阅读:133来源:国知局
一种单元测试脚本的生成方法及装置与流程

1.本发明涉及计算机技术领域,具体涉及一种单元测试脚本的生成方法及装置。


背景技术:

2.单元测试驱动开发(unit test driven development,简称utdd),是敏捷开发中的一项核心实践和技术,其原理是在开发功能代码之前,先编写单元测试用例代码,具有降低开发者负担和快速反馈等优点。
3.现有技术中,单元测试脚本的算法和工具主要基于源代码的解析,采用自然语言处理的方式生成脚本或通过全量模拟(mock)的方式产出单元测试脚本,并且源代码自动解析出的脚本可读性和可维护性差,若程序较为复杂,往往只能覆盖异常分支,无法覆盖具有价值的业务代码。因此,如何通过utdd的方式生成单元测试脚本,成为本领域需要解决的重要课题。


技术实现要素:

4.针对现有技术中的问题,本发明实施例提供一种单元测试脚本的生成方法及装置,能够至少部分地解决现有技术中存在的问题。
5.一方面,本发明提出一种单元测试脚本的生成方法,包括:
6.导入单元测试驱动开发的设计案例,所述单元测试驱动开发的设计案例是预先生成的;
7.获取目标源代码,并将所述目标源代码转换为抽象语法树;
8.根据所述单元测试驱动开发的设计案例和所述目标源代码的抽象语法树,生成单元测试脚本。
9.进一步地,所述单元测试驱动开发的设计案例采用预设模版对业务功能进行描述,包括至少一个表达式语句;相应地,所述根据所述单元测试驱动开发的设计案例和所述目标源代码的抽象语法树,生成单元测试脚本包括:
10.为每个表达式语句创建一个对应的方法名,并将每个表达式语句作为对应的方法名的注解。
11.进一步地,所述单元测试脚本的生成方法还包括:
12.为每个表达式语句对应的方法名补充案例设计描述。
13.进一步地,所述将所述目标源代码转换为抽象语法树包括:
14.对所述目标源代码的类、方法和成员变量进行解析,获得所述目标源代码的抽象语法树。
15.进一步地,所述成员变量包括外部成员变量;相应地,所述根据所述单元测试驱动开发的设计案例和所述目标源代码的抽象语法树,生成单元测试脚本包括:
16.根据所述外部成员变量生成模拟语句,并声明所述外部成员变量。
17.进一步地,所述单元测试脚本的生成方法还包括:
18.根据所述单元测试脚本生成单元测试驱动开发复核文档。
19.另一方面,本发明提供一种单元测试脚本的生成装置,包括:
20.导入模块,用于导入单元测试驱动开发的设计案例,所述单元测试驱动开发的设计案例是预先生成的;
21.转换模块,用于获取目标源代码,并将所述目标源代码转换为抽象语法树;
22.生成模块,用于根据所述单元测试驱动开发的设计案例和所述目标源代码的抽象语法树,生成单元测试脚本。
23.进一步地,所述单元测试驱动开发的设计案例采用预设模版对业务功能进行描述,包括至少一个表达式语句;相应地,所述生成模块具体用于:
24.为每个表达式语句创建一个对应的方法名,并将每个表达式语句作为对应的方法名的注解。
25.再一方面,本发明提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述任一实施例所述单元测试脚本的生成方法的步骤。
26.又一方面,本发明提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述任一实施例所述单元测试脚本的生成方法的步骤。
27.本发明实施例提供的单元测试脚本的生成方法及装置,能够导入预先生成的单元测试驱动开发的设计案例,获取目标源代码,并将目标源代码转换为抽象语法树,根据单元测试驱动开发的设计案例和目标源代码的抽象语法树,生成单元测试脚本,能够覆盖业务功能,提高了单元测试脚本的覆盖率和有效性。
附图说明
28.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
29.图1是本发明一实施例提供的单元测试脚本的生成方法的流程示意图。
30.图2是本发明一实施例提供的单元测试脚本的生成装置的结构示意图。
31.图3是本发明另一实施例提供的单元测试脚本的生成装置的结构示意图。
32.图4是本发明又一实施例提供的单元测试脚本的生成装置的结构示意图。
33.图5是本发明一实施例提供的电子设备的实体结构示意图。
具体实施方式
34.为使本发明实施例的目的、技术方案和优点更加清楚明白,下面结合附图对本发明实施例做进一步详细说明。在此,本发明的示意性实施例及其说明用于解释本发明,但并不作为对本发明的限定。需要说明的是,在不冲突的情况下,本技术中的实施例及实施例中的特征可以相互任意组合。
35.为了便于理解本技术提供的技术方案,下面先对本技术技术方案的研究背景进行简单说明。现有技术基于源代码生成的单元测试脚本,往往只能覆盖异常分支,无法覆盖具
有价值的业务代码,导致覆盖率高有效性低。而本发明实施例提供的单元测试脚本的生成方法,基于utdd的设计案例生成单元测试脚本,使测试能够覆盖业务代码,提高了单元测试脚本的覆盖率和有效性。
36.图1是本发明一实施例提供的单元测试脚本的生成方法的流程示意图,如图1所示,本发明实施例提供的单元测试脚本的生成方法,包括:
37.s101、导入单元测试驱动开发的设计案例,所述单元测试驱动开发的设计案例是预先生成的;
38.具体地,开发人员在程序设计阶段以utdd案例的设计方式,对业务需求进行梳理,对业务功能进行描述以完成案例设计,生成utdd的设计案例并保存。计算机可以导入utdd的设计案例。其中,在导入utdd的设计案例时,可以为设计案例的注解添加htil标签。本发明实施例提供的单元测试脚本的生成方法的执行主体包括但不限于计算机。
39.例如,开发人员在程序设计阶段基于等价类、边界值、路径法等方法完成案例设计,案例设计会以utdd案例的设计的方式进行,完成对业务需求的梳理,可以通过given

when

then的表达式对业务功能进行描述,生成utdd的设计案例。生成的utdd的设计案例可以包括given

when

then的表达式语句,以及对应的注解。生成的utdd的设计案例可以以excel的形式保存,计算机可以读取保存utdd的设计案例的excel文件实现utdd的设计案例的导入。
40.given

when

then可以成为一个公式或者模板,采用given

when

whrn的模版来指导开发人员以“用户故事”的方式编写测试用例。其中,given指定了一个上下文,即测试预设,when指导了一系列操作,即执行方法,then指定了一系列可观察的结果,即测试断言。
41.例如,计算机可以通过intellij idea插件导入utdd的设计案例。
42.s102、获取目标源代码,并将所述目标源代码转换为抽象语法树;
43.具体地,所述计算机在导入utdd的设计案例之后,会获取目标源代码,然后将所述目标源代码转换为所述目标源代码的抽象语法树,所述抽象语法树包括类、方法和成员变量。其中,所述目标源代码可以是当前正在编辑的源代码。在本发明实施例中,所述目标源代码是一个程序框架,可以包括类的声明,该类所需调用的各个方法名,成员变量的声明等,可以不包括具体的可执行代码。其中,所述目标源代码根据实际需要进行设置,本发明实施例不做限定。
44.s103、根据所述单元测试驱动开发的设计案例和所述目标源代码的抽象语法树,生成单元测试脚本。
45.具体地,所述计算机基于所述目标源代码的抽象语法树完成对单元测试脚本的初步构造,然后将所述单元测试驱动开发的设计案例添加到初步构造的单元测试脚本中,生成单元测试脚本,生成的所述单元测试脚本是标准化的utdd脚本。
46.例如,目标源代码a的抽象语法树包括类a,类a调用的方法b和方法c,成员变量d,所述utdd的设计案例包括表达式语句x和表达式语句y,那么计算机在生成单元测试脚本时,根据类a,类a调用的方法b和方法c初步构造的单元测试脚本表示如下:
[0047][0048]
计算机将表达式语句x和表达式语句y添加到上述初步构造的单元测试脚本中,获得的单元测试脚本如下:
[0049][0050]
其中,上述单元测试脚本中的方法x对应表达式语句x,可以将表达式语句x作为方法x的注解;上述单元测试脚本中的方法y对应表达式语句y,可以将表达式语句y作为方法y的注解。
[0051]
本发明实施例提供的单元测试脚本的生成方法,能够导入预先生成的单元测试驱动开发的设计案例,获取目标源代码,并将目标源代码转换为抽象语法树,根据单元测试驱动开发的设计案例和目标源代码的抽象语法树,生成单元测试脚本,单元测试脚本能够覆盖业务功能,提高了单元测试脚本的覆盖率和有效性。由于单元测试脚本的覆盖率的提高,能够更全面的对测试对象进行测试,较少后续测试对象出现问题的风险。
[0052]
在上述各实施例的基础上,进一步地,所述单元测试驱动开发的设计案例采用预设模版对业务功能进行描述,包括至少一个表达式语句;相应地,所述根据所述单元测试驱动开发的设计案例和所述目标源代码的抽象语法树,生成单元测试脚本包括:
[0053]
为每个表达式语句创建一个对应的方法名,并将每个表达式语句作为对应的方法名的注解。
[0054]
具体地,开发人员在进行案例设计时,可以通过预设模版对业务功能进行描述,使
生成的utdd的设计案例包括至少一个表达式语句。其中,所述预设模版可以采用given

when

then表达式的模版,根据实际需要进行设置,本发明实施例不做限定。
[0055]
所述计算机在生成单元测试脚本时,会为utdd的设计案例中的每个表达式语句创建一个方法名,然后将所述表达式语句作为对应的方法名的注解。
[0056]
例如,可以采用should+表达式的方式创建所述表达式语句对应的方法名。所述表达式语句为given xxx when xxx then xxx,对应的方法名为should_【given_xxx_when_then_xxx】。
[0057]
在上述各实施例的基础上,进一步地,本发明实施例提供的单元测试脚本的生成方法还包括:
[0058]
为每个表达式语句对应的方法名补充案例设计描述。
[0059]
具体地,utdd的设计案例包括至少一个表达式语句,每个表达式语句对应有注解,所述注解为开发人员添加的对表达式语句的自然语言解释说明。所述计算机在为每个表达式语句创建一个对应的方法名之后,获取每个表达式语句对应的注解作为每个表达式语句对应的方法名的案例设计描述。
[0060]
在上述各实施例的基础上,进一步地,所述将所述目标源代码转换为抽象语法树包括:
[0061]
对所述目标源代码的类、方法和成员变量进行解析,获得所述目标源代码的抽象语法树。
[0062]
具体地,所述计算机可以通过语法分析工具对所述目标源代码的类、方法和成员变量进行解析,获得所述目标源代码的抽象语法树,所述抽象语法树包括类名、至少一个方法名和至少一个成员变量名称。
[0063]
例如,所述目标源代码采用java语言编写,那么可以通过java compiler compiler(javacc)工具对所述目标源代码就那些分析,生成所述目标源代码的抽象语法树。
[0064]
在上述各实施例的基础上,进一步地,所述成员变量包括外部成员变量;相应地,所述根据所述单元测试驱动开发的设计案例和所述目标源代码的抽象语法树,生成单元测试脚本包括:
[0065]
为所述外部成员变量生成模拟语句,并声明所述外部成员变量。
[0066]
具体地,所述成员变量包括外部成员变量,外部成员变量用于对外部类或者方法进行调用,而utdd的测试脚本,对于外部成员变量不会真实的进行调用。所述计算机在生成所述单元测试脚本时,会为所述外部成员变量生成模拟(mock)语句,实现对外部依赖的mock,并声明所述外部成员变量。
[0067]
例如,目标源代码a的抽象语法树还包括外部成员变量e,那么初步构造的单元测试脚本表示如下:
[0068][0069]
在上述各实施例的基础上,进一步地,本发明实施例提供的单元测试脚本的生成方法还包括:
[0070]
根据所述单元测试脚本生成单元测试驱动开发复核文档。
[0071]
具体地,所述计算机在生成所述单元测试脚本之后,可以根据所述单元测试脚本生成单元测试驱动开发复核(review)文档,即将所述单元测试脚本中的方法定义、注释等信息汇总存储到utdd review文档中,以便于测试人员进行查看。
[0072]
其中,utdd review文档是代码review的一种延伸,测试人员在功能测试前针对开发人员编写的utdd脚本进行review以用于快速确认对应的单元测试脚本是否可测,评估开发的单元测试脚本的质量。
[0073]
例如,可以将所述单元测试脚本中的方法定义和注释,汇总到html文件中形成utdd review文档,以方便测试人员查看。
[0074]
图2是本发明一实施例提供的单元测试脚本的生成装置的结构示意图,如图2所示,本发明实施例提供的单元测试脚本的生成装置包括导入模块201、转换模块202和生成模块203,其中:
[0075]
导入模块201用于导入单元测试驱动开发的设计案例,所述单元测试驱动开发的设计案例是预先生成的;转换模块202用于获取目标源代码,并将所述目标源代码转换为抽象语法树;生成模块203用于根据所述单元测试驱动开发的设计案例和所述目标源代码的抽象语法树,生成单元测试脚本。
[0076]
具体地,开发人员在程序设计阶段以utdd案例的设计方式,对业务需求进行梳理,对业务功能进行描述以完成案例设计,生成utdd的设计案例并保存。导入模块201可以导入utdd的设计案例。其中,在导入utdd的设计案例时,可以为设计案例的注解添加htil标签。
[0077]
在导入utdd的设计案例之后,转换模块202会获取目标源代码,然后将所述目标源代码转换为所述目标源代码的抽象语法树,所述抽象语法树包括类、方法和成员变量。其中,所述目标源代码可以是当前正在编辑的源代码。在本发明实施例中,所述目标源代码是一个程序框架,可以包括类的声明,该类所需调用的各个方法名,成员变量的声明等,可以不包括具体的可执行代码。其中,所述目标源代码根据实际需要进行设置,本发明实施例不做限定。
[0078]
生成模块203基于所述目标源代码的抽象语法树完成对单元测试脚本的初步构造,然后将所述单元测试驱动开发的设计案例添加到初步构造的单元测试脚本中,生成单
元测试脚本,生成的所述单元测试脚本是标准化的utdd脚本。
[0079]
本发明实施例提供的单元测试脚本的生成装置,能够导入预先生成的单元测试驱动开发的设计案例,获取目标源代码,并将目标源代码转换为抽象语法树,根据单元测试驱动开发的设计案例和目标源代码的抽象语法树,生成单元测试脚本,单元测试脚本能够覆盖业务功能,提高了单元测试脚本的覆盖率和有效性。由于单元测试脚本的覆盖率的提高,能够更全面的对测试对象进行测试,较少后续测试对象出现问题的风险。
[0080]
在上述各实施例的基础上,进一步地,所述单元测试驱动开发的设计案例采用预设模版对业务功能进行描述,包括至少一个表达式语句;相应地,生成模块203具体用于:
[0081]
为每个表达式语句创建一个对应的方法名,并将每个表达式语句作为对应的方法名的注解。
[0082]
具体地,开发人员在进行案例设计时,可以通过预设模版对业务功能进行描述,使生成的utdd的设计案例包括至少一个表达式语句。其中,所述预设模版可以采用given

when

then表达式的模版,根据实际需要进行设置,本发明实施例不做限定。
[0083]
生成模块203在生成单元测试脚本时,会为utdd的设计案例中的每个表达式语句创建一个方法名,然后将所述表达式语句作为对应的方法名的注解。
[0084]
图3是本发明另一实施例提供的单元测试脚本的生成装置的结构示意图,如图3所示,在上述各实施例的基础上,进一步地,本发明实施例提供的单元测试脚本的生成装置还包括补充模块204,其中:
[0085]
补充模块204用于为每个表达式语句对应的方法名补充案例设计描述。
[0086]
具体地,utdd的设计案例包括至少一个表达式语句,每个表达式语句对应有注解,所述注解为开发人员添加的对表达式语句的自然语言解释说明。在为每个表达式语句创建一个对应的方法名之后,补充模块204获取每个表达式语句对应的注解作为每个表达式语句对应的方法名的案例设计描述。
[0087]
在上述各实施例的基础上,进一步地,转换模块202具体用于:
[0088]
对所述目标源代码的类、方法和成员变量进行解析,获得所述目标源代码的抽象语法树。
[0089]
具体地,转换模块202可以通过语法分析工具对所述目标源代码的类、方法和成员变量进行解析,获得所述目标源代码的抽象语法树,所述抽象语法树包括类名、至少一个方法名和至少一个成员变量名称。
[0090]
在上述各实施例的基础上,进一步地,所述成员变量包括外部成员变量;相应地,生成模块203具体用于:
[0091]
根据所述外部成员变量生成模拟语句,并声明所述外部成员变量。
[0092]
具体地,所述成员变量包括外部成员变量,外部成员变量用于对外部类或者方法进行调用,而utdd的测试脚本,对于外部成员变量不会真实的进行调用。生成模块203具在生成所述单元测试脚本时,会为所述外部成员变量生成模拟(mock)语句,实现对外部依赖的mock,并声明所述外部成员变量。
[0093]
图4是本发明又一实施例提供的单元测试脚本的生成装置的结构示意图,如图4所示,在上述各实施例的基础上,进一步地,本发明实施例提供的单元测试脚本的生成装置还包括文档生成模块205,其中:
[0094]
文档生成模块205用于根据所述单元测试脚本生成单元测试驱动开发复核文档。
[0095]
具体地,在生成所述单元测试脚本之后,文档生成模块205可以根据所述单元测试脚本生成utdd review文档,即将所述单元测试脚本中的方法定义、注释等信息汇总存储到utdd review文档中,以便于测试人员进行查看。
[0096]
本发明实施例提供的装置的实施例具体可以用于执行上述各方法实施例的处理流程,其功能在此不再赘述,可以参照上述方法实施例的详细描述。
[0097]
需要说明的是,本发明实施例提供的单元测试脚本的生成方法及装置可用于金融领域,也可用于除金融领域之外的任意技术领域,本发明实施例对单元测试脚本的生成方法及装置的应用领域不做限定。
[0098]
图5是本发明一实施例提供的电子设备的实体结构示意图,如图5所示,该电子设备可以包括:处理器(processor)501、通信接口(communications interface)502、存储器(memory)503和通信总线504,其中,处理器501,通信接口502,存储器503通过通信总线504完成相互间的通信。处理器501可以调用存储器503中的逻辑指令,以执行如下方法:导入单元测试驱动开发的设计案例,所述单元测试驱动开发的设计案例是预先生成的;获取目标源代码,并将所述目标源代码转换为抽象语法树;根据所述单元测试驱动开发的设计案例和所述目标源代码的抽象语法树,生成单元测试脚本。
[0099]
此外,上述的存储器503中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read

only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0100]
本实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:导入单元测试驱动开发的设计案例,所述单元测试驱动开发的设计案例是预先生成的;获取目标源代码,并将所述目标源代码转换为抽象语法树;根据所述单元测试驱动开发的设计案例和所述目标源代码的抽象语法树,生成单元测试脚本。
[0101]
本实施例提供一种计算机可读存储介质,所述计算机可读存储介质存储计算机程序,所述计算机程序使所述计算机执行上述各方法实施例所提供的方法,例如包括:导入单元测试驱动开发的设计案例,所述单元测试驱动开发的设计案例是预先生成的;获取目标源代码,并将所述目标源代码转换为抽象语法树;根据所述单元测试驱动开发的设计案例和所述目标源代码的抽象语法树,生成单元测试脚本。
[0102]
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd

rom、光学存储器等)上实施的计算机程序产
品的形式。
[0103]
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0104]
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0105]
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0106]
在本说明书的描述中,参考术语“一个实施例”、“一个具体实施例”、“一些实施例”、“例如”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
[0107]
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1