单元测试代码生成方法、装置、设备、介质及程序产品与流程

文档序号:29466693发布日期:2022-04-02 03:35阅读:122来源:国知局
单元测试代码生成方法、装置、设备、介质及程序产品与流程

1.本技术涉及计算机技术领域,尤其涉及一种单元测试代码生成方法、装置、设备、介质及程序产品。


背景技术:

2.单元测试(unit testing)是指对软件程序中的最小可测试单元进行检查和验证,在软件系统开发过程中,单元测试占了很重要的位置。但是编写单元测试代码的工作量甚至超过了开发软件系统代码的工作量。
3.在现有技术中,主要由开发人员手动编写单元测试代码,编写单元测试代码的方法复杂,编写单元测试代码消耗的时间长。


技术实现要素:

4.本技术提供一种单元测试代码生成方法、装置、设备、介质及程序产品,用以解决开发人员手动编写单元测试代码,编写单元测试代码的方法复杂,编写单元测试代码消耗的时间长的问题。
5.第一方面,本技术提供一种单元测试代码生成方法,包括:
6.获取目标测试对象;所述目标测试对象包括目标测试对象的可执行代码;
7.确定所述目标测试对象的可执行代码中所包含的目标方法和目标模拟对象;所述目标模拟对象为预设类型的属性;
8.获取预先构建的所有类型单元测试代码中各参数值与方法之间的第一映射关系表,以及各需调用模拟对象与需调用模拟对象调用方法及参数值与之间的第二映射关系表;
9.根据所述第一映射关系表确定与所述目标方法具有映射关系的目标参数值,并根据所述第二映射关系表确定与所述目标参数值具有映射关系的需调用模拟对象调用方法;
10.定义构造函数,并对所述需调用模拟对象调用方法及所述目标模拟对象进行实例化;
11.将所述目标参数值、所述构造函数、所述目标方法对应的调用代码、实例化后的需调用模拟对象调用方法对应的代码及实例化后的目标模拟对象配置到单元测试文件中的预设区域,以生成目标单元测试代码。
12.第二方面,本技术提供一种单元测试代码生成装置,包括:
13.对象获取模块,用于获取目标测试对象;所述目标测试对象包括目标测试对象的可执行代码;
14.确定模块,用于确定所述目标测试对象的可执行代码中所包含的目标方法和目标模拟对象;所述目标模拟对象为预设类型的属性;
15.关系表获取模块,用于获取预先构建的所有类型单元测试代码中各参数值与方法之间的第一映射关系表,以及各需调用模拟对象与需调用模拟对象调用方法及参数值与之
间的第二映射关系表;
16.确定模块,还用于根据所述第一映射关系表确定与所述目标方法具有映射关系的目标参数值,并根据所述第二映射关系表确定与所述目标参数值具有映射关系的需调用模拟对象调用方法;
17.实例化模块,用于定义构造函数,并对所述需调用模拟对象调用方法及所述目标模拟对象进行实例化;
18.配置模块,用于将所述目标参数值、所述构造函数、所述目标方法对应的调用代码、实例化后的需调用模拟对象调用方法对应的代码及实例化后的目标模拟对象配置到单元测试文件中的预设区域,以生成目标单元测试代码。
19.第三方面,本技术提供一种电子设备,包括:处理器,以及与所述处理器通信连接的存储器;
20.所述处理器及所述存储器之间电路互连;
21.所述存储器存储计算机执行指令;
22.所述处理器执行所述存储器存储的计算机执行指令,以实现上述所述的单元测试代码生成方法。
23.第四方面,本技术提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现上述所述的单元测试代码生成方法。
24.第五方面,本技术提供一种计算机程序产品,包括计算机执行指令,该计算机执行指令被处理器执行时实现上述所述的单元测试代码生成方法。
25.本技术提供的单元测试代码生成方法、装置、设备、介质及程序产品,通过获取目标测试对象;确定所述目标测试对象的可执行代码中所包含的目标方法和目标模拟对象;获取预先构建的所有类型单元测试代码中各参数值与方法之间的第一映射关系表,以及各需调用模拟对象与需调用模拟对象调用方法及参数值与之间的第二映射关系表;根据所述第一映射关系表确定与所述目标方法具有映射关系的目标参数值,并根据所述第二映射关系表确定与所述目标参数值具有映射关系的需调用模拟对象调用方法;定义构造函数,并对所述需调用模拟对象调用方法及所述目标模拟对象进行实例化;将所述目标参数值、所述构造函数、所述目标方法对应的调用代码、实例化后的需调用模拟对象调用方法对应的代码及实例化后的目标模拟对象配置到单元测试文件中的预设区域,以生成目标单元测试代码。根据第一映射关系表,可以确定与目标方法具有映射关系的目标参数值,根据第二映射关系表,可以确定与目标参数值具有映射关系的需调用模拟对象调用方法,通过自动确定目标方法对应的参数值和需调用模拟对象调用方法,就可以实现生成目标单元测试代码的自动化,从而简化编写单元测试代码的方法,减少编写单元测试代码消耗的时间。
附图说明
26.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本技术的实施例,并与说明书一起用于解释本技术的原理。
27.图1为本技术的一种应用场景示意图;
28.图2为本技术实施例一提供的单元测试代码生成方法流程图;
29.图3为本技术提供的一种单元测试文件的组成结构示意图;
30.图4为本技术实施例二提供的单元测试代码生成方法流程图;
31.图5为本技术实施例三提供的单元测试代码生成方法流程图;
32.图6为本技术实施例四提供的单元测试代码生成装置的结构示意图;
33.图7为本技术实施例五提供的电子设备的结构示意图。
34.通过上述附图,已示出本技术明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本技术构思的范围,而是通过参考特定实施例为本领域技术人员说明本技术的概念。
具体实施方式
35.这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本技术相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本技术的一些方面相一致的装置和方法的例子。
36.术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。在以下各实施例的描述中,“多个”的含义是两个以上,除非另有明确具体的限定。
37.首先对本技术所涉及的名词进行解释:
38.pojo类:只包含set,get属性的类,一般作为参数对象存在。
39.ast(抽象语法树):通过ast算法可以获取源代码的结构和上下文等内容。
40.模拟对象,也即mock对象:一个方法中会调用另一个方法,在单元测试中,通过mock(模拟/打桩)的方式来模拟对象的调用。
41.构造函数是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。为类提供的构造函数可自动完成对象的初始化任务。
42.鲁棒性是指一个程序中对可能导致程序崩溃的各种情况都充分考虑到,并且作相应的处理,在程序遇到异常情况时还能正常工作,而不至于死机。
43.对于单元测试中单元,要根据实际情况去判定其具体含义,如c语言中单元指一个函数,java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
44.针对现有技术中,编写单元测试代码的方法复杂,消耗的时间多的问题,发明人在研究中发现,虽然单元测试代码的编写复杂,但通常使用mock(模拟/打桩)的方式实现测试单元之间的引用,因此,只要识别出测试单元中需要被mock(模拟/打桩)的模拟对象,并确定模拟对象的调用方法,就可以实现单元测试代码的自动生成,无需开发人员手动编写单元测试代码,减少编写单元测试代码消耗的时间。
45.图1为本技术的一种应用场景示意图,如图1所示,在测试目标测试对象时目标测试对象需要调用真实对象,但是真实对象可能不容易构造或者不容易获取,且可能会由于真实对象的因素对目标测试对象的测试产生影响,因此用模拟对象模拟真实对象的行为,
以使在测试目标测试对象时目标测试对象调用模拟对象而不是真实对象。
46.下面以具体地实施例对本技术的技术方案以及本技术的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本技术的实施例进行描述。
47.实施例一
48.图2为本技术实施例一提供的单元测试代码生成方法流程图,本技术实施例针对开发人员手动编写单元测试代码,编写单元测试代码的方法复杂,编写单元测试代码消耗的时间长的问题,提供了单元测试代码生成方法。本实施例中的方法应用于单元测试代码生成装置,单元测试代码生成装置可以位于电子设备中。其中,电子设备可以为表示各种形式的数字计算机。诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。
49.如图2所示,该方法具体步骤如下:
50.步骤s101、获取目标测试对象。
51.本技术实施例中,目标测试对象包括目标测试对象的可执行代码,目标测试对象是指软件程序中待测试的最小可测试单元。
52.示例性地,可以通过获取目标测试对象文件的方式获取目标测试对象,目标测试对象文件中包括目标测试对象的可执行代码。本技术实施例对获取目标测试对象的实现方式不做具体限定,可以根据实际应用场景的需要进行设置和调整。
53.步骤s102、确定目标测试对象的可执行代码中所包含的目标方法和目标模拟对象。
54.其中,目标模拟对象为预设类型的属性,目标方法是指目标测试对象中待测试的方法。
55.具体地,确定目标测试对象的可执行代码中所包含的目标方法和属性,其中,属性包括属性值;判断属性是否为预设类型的属性;将预设类型的属性确定为标识对象。例如,预设类型可以为属性值非基本属性且非pojo类的属性,若属性只有get方法和set方法,则该属性不为预设类型的属性,该属性不为目标模拟对象;若属性非基本属性,且除了get方法和set方法外还有其他方法,则该属性为预设类型的属性,将该属性确定为标识对象。
56.可选地,本步骤的一种实现方式可以为:采用抽象语法树算法ast确定目标测试对象的可执行代码中所包含的目标方法;采用抽象语法树算法ast或反射算法确定目标测试对象的可执行代码中所包含的目标模拟对象。
57.具体的,可以通过解析目标测试对象语法树的方法确定目标测试对象的可执行代码中所包含的目标方法和属性,并根据属性确定目标模拟对象;或者可以通过解析目标测试对象语法树的方法确定目标测试对象的可执行代码中所包含的目标方法,通过反射算法获取目标测试对象的可执行代码中所包含的属性,并根据属性确定目标模拟对象。
58.可选地,还可以通过人工输入的方式确定目标方法,本实施例对确定目标方法和目标模拟对象的具体实现方式不做具体限定。
59.步骤s103、获取预先构建的所有类型单元测试代码中各参数值与方法之间的第一映射关系表,以及各需调用模拟对象与需调用模拟对象调用方法及参数值之间的第二映射关系表。
60.其中,第一映射关系表是指包含参数值与方法之间的映射关系的数据表,第一映射关系表中还可以包括参数值在方法中对应的预期返回值、参数值的序号、参数值对应的测试对象等信息。第二映射关系表是指包含模拟对象与需调用模拟对象调用方法(也即返回值方法)及参数值之间的映射关系的数据表,第二映射关系表中还可以包括模拟对象的类型,及调用模拟对象的方法等信息。需调用模拟对象是指目标方法需调用模拟对象。
61.示例性地,第一映射关系表和第二映射关系表可以存储在数据库中,通过在数据库中查找第一映射关系表和第二映射关系表的标识,获取第一映射关系表以及第二映射关系表,本技术实施例对获取第一映射关系表以及第二映射关系表的具体实现方式不做具体限定。
62.步骤s104、根据第一映射关系表确定与目标方法具有映射关系的目标参数值,并根据第二映射关系表确定与目标参数值具有映射关系的需调用模拟对象调用方法。
63.具体地,在确定目标方法和获取第一映射关系表后,可以在第一映射关系表中查找目标方法,以确定与目标方法具有映射关系的目标参数值;在确定目标参数值和获取第二映射关系表后,可以在第二映射关系表中查找目标参数值,以确定与目标参数值具有映射关系的需调用模拟对象及其调用方法。
64.本技术实施例中,在第二映射关系表中查找目标参数值的方式可以为查找目标参数值的序号,也可以为查找目标参数值对应的参数名和参数值。
65.步骤s105、定义构造函数,并对需调用模拟对象调用方法及目标模拟对象进行实例化。
66.具体的,可以预先设置规则库,规则库中可以包括定义构造函数的规则、实例化目标模拟的规则。可以获取预先设置的规则库,根据规则库中的定义构造函数的规则,定义构造函数;根据规则库中的实例化目标模拟的规则对目标模拟对象进行实例化;对需调用模拟对象调用方法进行实例化。其中,实例化目标模拟的规则包括声明目标模拟的规则。
67.示例性地,对需调用模拟对象调用方法进行实例化的一种实现方式可以为:将需调用模拟对象的名称配置到需调用模拟对象调用方法的对应位置,以完成对需调用模拟对象调用方法的实例化。
68.步骤s106、将目标参数值、构造函数、目标方法对应的调用代码、实例化后的需调用模拟对象调用方法对应的代码及实例化后的目标模拟对象配置到单元测试文件中的预设区域,以生成目标单元测试代码。
69.其中,目标方法对应的调用代码是指调用目标方法的代码,预先设置的规则库中可以包括生成目标方法对应的调用代码的规则,可以根据规则库中的规则生成目标方法对应的调用代码,并将目标方法对应的调用代码配置到单元测试文件中的预设区域。本技术实施例对确定目标方法对应的调用代码的实现方式不做具体限定。
70.具体地,预设区域可以包括目标参数值、构造函数、目标方法对应的调用代码、实例化后的需调用模拟对象调用方法对应的代码及实例化后的目标模拟对象的对应区域,分别将目标参数值、构造函数、目标方法对应的调用代码、实例化后的需调用模拟对象调用方法对应的代码及实例化后的目标模拟对象配置到单元测试文件中的预设区域中。
71.可选地,预设区域可以包括:目标模拟对象声明区、测试代码构造区及测试区;测试区包括:目标参数区、需调用模拟对象调用声明区及测试代码调用区;将目标参数值,构
造函数、目标方法对应的调用代码、实例化后的需调用模拟对象调用方法对应的代码及实例化后的目标模拟对象配置到单元测试文件中的预设区域,包括:
72.将实例化后的目标模拟对象配置到目标模拟对象声明区;将构造函数配置到测试代码构造区;将目标参数值配置到目标参数区;将实例化后的需调用模拟对象调用方法对应的代码配置到需调用模拟对象调用声明区;将目标方法对应的调用代码配置到测试代码调用区。
73.其中,测试区可以包括一个或多个目标方法对应的目标参数区、需调用模拟对象调用声明区及测试代码调用区,一个目标方法对应一个目标参数区、一个需调用模拟对象调用声明区及一个测试代码调用区。
74.示例性地,图3为本技术提供的一种单元测试文件的组成结构示意图,如图3所示,预设区域包括:目标模拟对象声明区、测试代码构造区及测试区;测试区包括:目标参数区、需调用模拟对象调用声明区及测试代码调用区;预设区域还包括:单元测试名称区,测试区还包括:方法测试名称区。将目标测试对象对应的单元测试名称配置到单元测试名称区,将目标方法对应的方法测试名称配置到方法测试名称区。本技术实施例对确定单元测试名称和方法测试名称的方式不做具体限定,例如,规则库中可以包括生成单元测试名称的规则和生成方法测试名称的规则,可以根据规则库中生成单元测试名称的规则确定单元测试名称,根据规则库中生成方法测试名称的规则确定方法测试名称,其中,生成方法测试名称的规则可以为test目标方法名+顺序编号。
75.本技术实施例中,获取目标测试对象;确定目标测试对象的可执行代码中所包含的目标方法和目标模拟对象;目标模拟对象为预设类型的属性;获取预先构建的所有类型单元测试代码中各参数值与方法之间的第一映射关系表,以及各需调用模拟对象与需调用模拟对象调用方法及参数值与之间的第二映射关系表;根据第一映射关系表确定与目标方法具有映射关系的目标参数值,并根据第二映射关系表确定与目标参数值具有映射关系的需调用模拟对象调用方法;定义构造函数,并对需调用模拟对象调用方法及目标模拟对象进行实例化;将目标参数值、构造函数、目标方法对应的调用代码、实例化后的需调用模拟对象调用方法对应的代码及实例化后的目标模拟对象配置到单元测试文件中的预设区域,以生成目标单元测试代码。根据第一映射关系表,可以确定与目标方法具有映射关系的目标参数值,根据第二映射关系表,可以确定与目标参数值具有映射关系的需调用模拟对象调用方法,通过自动确定目标方法对应的参数值和需调用模拟对象调用方法,就可以实现生成目标单元测试代码的自动化,从而简化编写单元测试代码的方法,减少编写单元测试代码消耗的时间。
76.实施例二
77.图4为本技术实施例二提供的单元测试代码生成方法流程图,在上述实施例的基础上,本实施例中,步骤s106将目标参数值、构造函数、目标方法对应的调用代码、实例化后的需调用模拟对象调用方法对应的代码及实例化后的目标模拟对象配置到单元测试文件中的预设区域,以生成目标单元测试代码之后,还包括:
78.循环执行以下步骤,直到路径覆盖率大于或等于预设路径覆盖率阈值为止,如图4所示,具体步骤如下:
79.步骤s201、采用jacoco插件对目标单元测试代码生成测试报告,测试报告中包括
目标单元测试代码的路径覆盖率。
80.本技术实施例中,可以采用jacoco插件,并执行mvn verify命令的方式生成测试报告,jacoco是一个开源的测试覆盖率工具。此外,还可以执行其他外部命令生成测试报告,本技术实施例中对生成测试报告的具体实现方式不做限定。
81.在本技术实施例中,在生成测试报告之后,将测试报告中的目标单元测试代码的路径覆盖率与预设路径覆盖率阈值做对比,若路径覆盖率大于预设路径覆盖率阈值,则结束流程,若路径覆盖率小于预设路径覆盖率阈值,则执行步骤s302增加第一映射关系表中的各参数的参数值。
82.步骤s202、若确定路径覆盖率小于预设路径覆盖率阈值,则增加第一映射关系表中的各参数的参数值,以获得调整后的第一映射关系表;并根据增加后的各参数值调整第二映射关系表,以获得调整后的第二映射关系表。
83.具体地,在第一映射关系表中增加各参数的参数值,并可以更新增加的参数值对应的预期返回值、参数值的序号、参数值对应的测试对象等信息,以获得调整后的第一映射关系表;并在第二映射关系表中添加增加的参数值与对应的需调用模拟对象的第二映射关系,以获得调整后的第二映射关系表。
84.步骤s203、根据调整后的第一映射关系表和第二映射关系表重新生成目标单元测试代码。
85.本技术实施例中,在重新生成目标单元测试代码后,执行步骤s301采用jacoco插件对目标单元测试代码生成测试报告,并将测试报告中的目标单元测试代码的路径覆盖率与预设路径覆盖率阈值做对比。
86.需要理解的是,路径覆盖是指覆盖所有可能执行的路径,路径覆盖率是指在测试时,运行被测程序后,程序中所有可能的路径被执行过的比率。基于安全功能的单元测试往往要求路径覆盖率达到一定要求,并且路径覆盖是“最强的覆盖”,因此路径覆盖率越高,越能保证被测程序的鲁棒性。
87.本技术实施例中,可以通过在第一映射关系表中增加参数值的方式,增加目标单元测试代码的路径覆盖率。通过循环增加参数值生成目标单元测试代码,并将目标单元测试代码的路径覆盖率与预设路径覆盖率阈值做对比的方式,就可以最终获得路径覆盖率大于预设路径覆盖率阈值的目标单元测试代码,使目标单元测试代码达到路径覆盖率的要求,进一步地可以保证目标测试对象的鲁棒性。
88.实施例三
89.在上述实施例的基础上,本实施例中涉及的是步骤s103获取预先构建的所有类型单元测试代码中各参数值与方法之间的第一映射关系表,以及各需调用模拟对象与需调用模拟对象调用方法及参数值与之间的第二映射关系表之前,生成第一映射关系表和第二映射关系表的具体实现方式。
90.图5为本技术实施例三提供的单元测试代码生成方法流程图,如图5所示,构建第一映射关系表的步骤包括:
91.步骤s301、获取所有类型单元测试代码对应的测试对象的可执行代码。
92.本技术实施例中,获取测试对象的可执行代码的实现方式与实施例一中获取目标测试对象的实现方式类似,在此不再一一赘述。
93.步骤s302、采用抽象语法树算法ast确定各单元测试代码对应的测试对象的可执行代码中所包含的待映射方法和所有模拟对象。
94.其中,待映射方法是指测试对象的可执行代码中所包含的所有方法。
95.本技术实施例中,确定测试对象的可执行代码中所包含的待映射方法和所有模拟对象的实现方式与实施例一中的类似,在此不再一一赘述。
96.步骤s303、对各待映射方法进行解析,若确定某待映射方法中含有参数,则对参数赋值,并构建赋值后的各参数值与待映射方法之间的第一映射关系,根据第一映射关系生成第一映射关系表。
97.具体的,可以采用抽象语法树算法ast解析各待映射方法,若确定某待映射方法中含有参数,则对该参数赋值,并自动生成包含该待映射方法和该赋值后的参数值的记录,以构建该待映射方法和该赋值后的参数值之间的第一映射关系。
98.本技术实施例中,生成的第一映射关系表包含多条记录,一条记录对应一个参数值,记录中还可以包括输入的预期返回值、参数值的序号、参数值对应的测试对象等信息。
99.如图5所示,构建第二映射关系表的步骤包括:
100.步骤s304、对含有参数的待映射方法进行解析,若确定待映射方法中需调用模拟对象,则根据各需调用模拟对象在对应待映射方法中的上下文信息确定各需调用模拟对象的类型。
101.具体的,各需调用模拟对象的类型可以为有参数返回值、无参数返回值、异常。若根据需调用模拟对象在对应待映射方法中的上下文信息,确定需调用模拟对象的对应待映射方法中有参数返回值,则确定需调用模拟对象的类型为有参数返回值,并确定与需调用模拟对象具有第二映射关系的参数及参数值;若根据需调用模拟对象在对应待映射方法中的上下文信息,确定需调用模拟对象的对应待映射方法中无参数返回值,则确定需调用模拟对象的类型为无参数返回值;若根据需调用模拟对象在对应待映射方法中的上下文信息,确定需调用模拟对象的对应待映射方法中返回值为异常,则确定需调用模拟对象的类型为异常。
102.示例性地,确定与需调用模拟对象具有第二映射关系的参数的方法可以为:通过第一映射关系表确定需调用模拟对象对应待映射方法中的参数,从需调用模拟对象对应待映射方法中的参数中,确定与需调用模拟对象具有第二映射关系的参数。例如,显示需调用模拟对象对应待映射方法中的参数,通过开发人员的选择操作,确定与需调用模拟对象具有第二映射关系的参数。
103.步骤s305、根据各需调用模拟对象的类型确定各需调用模拟对象调用方法。
104.具体地,规则库中还包括有返回值、无参数、异常等模拟对象的类型对应的生成调用方法的规则,根据规则库及各需调用模拟对象的类型可以确定各需调用模拟对象调用方法。
105.步骤s306、根据各需调用模拟对象、各需调用模拟对象调用方法及对应的参数值构建第二映射关系表。
106.具体地,在第二映射关系表中记录待映射方法及需调用模拟对象、需调用模拟对象调用方法、与需调用模拟对象具有第二映射关系的参数值。此外,若需调用模拟对象的类型为有参数返回值,则记录与需调用模拟对象具有第二映射关系的参数值对应的参数返回
值信息,一个参数返回值信息对应一条记录,参数返回值信息可以由开发人员输入。还可以在第二映射关系表中记录需调用模拟对象的类型、需调用模拟对象的序号、需调用模拟对象对应的测试对象等信息。
107.其中,记录与需调用模拟对象具有第二映射关系的参数值的方法可以为记录第一映射关系表中参数值的序号。
108.本技术实施例中,采用抽象语法树算法ast对待映射方法进行解析,可以识别出与待映射方法之间具有第一映射关系的参数,以构建第一映射关系表;还可以识别出与待映射方法之间具有第二映射关系的需调用模拟对象,并确定需调用模拟对象的类型,根据规则库中的规则,确定需调用模拟对象调用方法,以构建第二映射关系表。在完成第一映射关系表和第二映射关系表的构建后,可以根据第一映射关系表和第二映射关系表生成目标单元测试代码。
109.可选地,在上述实施例的基础上,在步骤s106将目标参数值、构造函数、实例化后的需调用模拟对象调用方法对应的代码及实例化后的目标模拟对象配置到单元测试文件中的预设区域,以生成目标单元测试代码之后,还包括:采用目标单元测试代码对目标测试对象进行测试。
110.具体地,可以运行目标单元测试代码,以完成对目标测试对象的测试。
111.本技术实施例中,通过采用目标单元测试代码对目标测试对象进行测试,可以检查目标测试对象是否存在错误,以使开发人员对目标测试对象进行改进,可以保证目标测试对象的鲁棒性。
112.实施例四
113.图6为本技术实施例四提供的单元测试代码生成装置的结构示意图。本技术实施例提供的单元测试代码生成装置可以执行单元测试代码生成方法实施例提供的处理流程。如图6所示,该单元测试代码生成装置60包括:对象获取模块601,确定模块602,关系表获取模块603、实例化模块604和配置模块605。
114.具体地,对象获取模块601,用于获取目标测试对象;目标测试对象包括目标测试对象的可执行代码;
115.确定模块602,用于确定目标测试对象的可执行代码中所包含的目标方法和目标模拟对象;目标模拟对象为预设类型的属性;
116.关系表获取模块603,用于获取预先构建的所有类型单元测试代码中各参数值与方法之间的第一映射关系表,以及各需调用模拟对象与需调用模拟对象调用方法及参数值与之间的第二映射关系表;
117.确定模块602,还用于根据第一映射关系表确定与目标方法具有映射关系的目标参数值,并根据第二映射关系表确定与目标参数值具有映射关系的需调用模拟对象调用方法;
118.实例化模块604,用于定义构造函数,并对需调用模拟对象调用方法及目标模拟对象进行实例化;
119.配置模块605,用于将目标参数值、构造函数、目标方法对应的调用代码、实例化后的需调用模拟对象调用方法对应的代码及实例化后的目标模拟对象配置到单元测试文件中的预设区域,以生成目标单元测试代码。
120.本技术实施例提供的装置可以具体用于执行上述实施例一所提供的方法实施例,具体功能此处不再赘述。
121.可选地,确定模块602,具体用于采用抽象语法树算法ast确定目标测试对象的可执行代码中所包含的目标方法;采用抽象语法树算法ast或反射算法确定目标测试对象的可执行代码中所包含的目标模拟对象。
122.可选地,预设区域包括:目标模拟对象声明区、测试代码构造区及测试区;测试区包括:目标参数区、需调用模拟对象调用声明区及测试代码调用区;配置模块605,具体用于将实例化后的目标模拟对象配置到目标模拟对象声明区;将构造函数配置到测试代码构造区;将目标参数值配置到目标参数区;将实例化后的需调用模拟对象调用方法对应的代码配置到需调用模拟对象调用声明区;将目标方法对应的调用代码配置到测试代码调用区。
123.可选地,单元测试代码生成装置60还包括调整模块,在配置模块605将目标参数值、构造函数、目标方法对应的调用代码、实例化后的需调用模拟对象调用方法对应的代码及实例化后的目标模拟对象配置到单元测试文件中的预设区域,以生成目标单元测试代码之后,调整模块用于循环执行以下步骤,直到路径覆盖率大于或等于预设路径覆盖率阈值为止:采用jacoco插件对目标单元测试代码生成测试报告,测试报告中包括目标单元测试代码的路径覆盖率;若确定路径覆盖率小于预设路径覆盖率阈值,则增加第一映射关系表中的各参数的参数值,以获得调整后的第一映射关系表;并根据增加后的各参数值调整第二映射关系表,以获得调整后的第二映射关系表;根据调整后的第一映射关系表和第二映射关系表重新生成目标单元测试代码,并执行采用jacoco插件对目标单元测试代码生成测试报告。
124.可选地,单元测试代码生成装置60还包括生成模块,在关系表获取模块603获取预先构建的所有类型单元测试代码中各参数值与方法之间的第一映射关系表,以及各需调用模拟对象与需调用模拟对象调用方法及参数值与之间的第二映射关系表之前,生成模块用于获取所有类型单元测试代码对应的测试对象的可执行代码;采用抽象语法树算法ast确定各单元测试代码对应的测试对象的可执行代码中所包含的待映射方法和所有模拟对象;对各待映射方法进行解析,若确定某待映射方法中含有参数,则对参数赋值,并构建赋值后的各参数值与待映射方法之间的第一映射关系,根据第一映射关系生成第一映射关系表。
125.可选地,生成模块还用于对各待映射方法进行解析,若确定某待映射方法中含有需调用模拟对象,则根据各需调用模拟对象在对应待映射方法中的上下文信息确定各需调用模拟对象的类型;根据各需调用模拟对象的类型确定各需调用模拟对象调用方法;根据各需调用模拟对象、各需调用模拟对象调用方法及对应的参数值构建第二映射关系表。
126.可选地,单元测试代码生成装置60还包括测试模块,在配置模块605将目标参数值、构造函数、目标方法对应的调用代码、实例化后的需调用模拟对象调用方法对应的代码及实例化后的目标模拟对象配置到单元测试文件中的预设区域,以生成目标单元测试代码之后,测试模块用于采用目标单元测试代码对目标测试对象进行测试。
127.本技术实施例提供的装置可以具体用于执行上述方法实施例,具体功能此处不再赘述。
128.实施例五
129.图7为本技术实施例五提供的电子设备的结构示意图。如图7所示,该电子设备70
包括:处理器701、存储器702、收发器703、以及存储在存储器702上并可在处理器701上运行的计算机执行指令。
130.其中,处理器701,存储器702及收发器703之间电路互连;收发器703用于收发数据;处理器701运行计算机执行指令时实现上述任一方法实施例提供的单元测试代码生成方法。
131.本技术实施例还提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机执行指令,计算机执行指令被处理器执行时实现上述任一方法实施例提供的单元测试代码生成方法。
132.本技术实施例还提供了一种计算机程序产品,程序产品包括:计算机执行指令,计算机执行指令存储在可读存储介质中,电子设备的至少一个处理器可以从可读存储介质读取计算机执行指令,至少一个处理器执行计算机执行指令使得电子设备执行上述任一方法实施例提供的方法。
133.本领域技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。上述描述的装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
134.本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本技术的其它实施方案。本技术旨在涵盖本技术的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本技术的一般性原理并包括本技术未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本技术的真正范围和精神由下面的权利要求书指出。
135.应当理解的是,本技术并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本技术的范围仅由所附的权利要求书来限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1