基于人工智能的单元测试方法及相关设备与流程

文档序号:31201359发布日期:2022-08-20 01:43阅读:85来源:国知局
基于人工智能的单元测试方法及相关设备与流程

1.本技术涉及人工智能技术领域,尤其涉及一种基于人工智能的单元测试方法、装置、电子设备及存储介质。


背景技术:

2.单元测试通常是开发者编写一段代码,以用于检测被测单元在特定条件下的功能是否正确,所述被测单元通常是一个类、方法或函数。
3.在单元测试时,被测单元有可能对其它外部服务有依赖关系,当依赖的外部服务不可用或者发生变化时,会导致编写的测试代码执行失败,这就需要单元测试的过程中模拟这些存在依赖关系的外部服务,返回我们指定的内容,屏蔽掉真实环境变化的影响。
4.现有技术中,每进行一次单元测试都需要解析代码的语义信息以获取与被测单元存在依赖关系的外部服务,然而代码的解析过程耗时较大,待测试单元数量众多,从而导致单元测试效率低下。


技术实现要素:

5.鉴于以上内容,有必要提出一种基于人工智能的单元测试方法及相关设备,以解决如何提高单元测试效率这一技术问题,其中,相关设备包括基于人工智能的单元测试装置、电子设备及存储介质。
6.本技术提供基于人工智能的单元测试方法,所述方法包括:
7.解析待测源码的语义信息以构建源码依赖树;
8.获取预设的目标单元的id信息,并依据所述id信息查询所述源码依赖树得到目标单元的依赖服务和输入参数;
9.依据模拟工具模拟所述依赖服务得到所述依赖服务的输出结果备选值;
10.设置所述目标单元的输入参数的取值范围得到输入参数备选值;
11.对所述依赖服务的输出结果备选值和所述输入参数备选值进行排列组合得到测试案例;
12.基于所述测试案例进行测试以获取单元测试结果。
13.如此,通过解析代码文件的语义信息构建源码依赖树,然后依据源码依赖树获取被测单元的依赖服务,并对依赖服务进行模拟以实现单元测试,加快了依赖服务获取速度的同时避免了调用真实的依赖服务,从而提高单元测试效率。
14.在一些实施例中,所述解析待测源码的语义信息以构建源码依赖树包括:
15.将待测源码中的每一个待测单元以及每一个待测单元的输入参数作为一个节点,并获取每一个节点的id信息,所述待测单元为所述待测源码中的类和方法,所述节点包括类节点、方法节点和输入参数节点;
16.判断任意两个节点之间是否存在归属关系,若存在,则用无向边连接对应的两个节点,并遍历所有节点以构建源码结构树;
17.在源码结构树的基础上,判断任意类节点之间是否存在继承关系,若存在,则使用从被继承类节点指向继承类节点的有向边连接两节点,遍历所有类节点以构建源码继承树;
18.在源码继承树的基础上,判断任意方法节点之间是否存在调用关系,若存在,则使用从被调用方法节点指向调用方法节点的有向边连接两节点,遍历所有方法节点以构建所述源码依赖树。
19.如此,在单元测试之前获取源码依赖树结构,在单元测试的过程中,仅通过源码依赖树即可获取被测单元的依赖服务和输入参数,避免对源码文件的重复解析,加快为单元测试的速度。
20.在一些实施例中,获取预设的目标单元的id信息,并依据所述id信息查询所述源码依赖树得到目标单元的依赖服务和输入参数包括:
21.获取所述预设的目标单元的id信息;
22.基于所述目标单元的id信息搜索到所述源码依赖树中对应的目标节点;
23.获取指向目标节点的有向边对应的方法节点作为所述目标单元的依赖服务;
24.获取连接目标节点的无向边对应的输入参数节点作为所述目标单元的输入参数。
25.如此,仅需要选定的目标单元的id信息即可快速获取目标单元的依赖服务和输入参数。
26.在一些实施例中,所述设置所述目标单元的输入参数的取值范围得到输入参数备选值包括:
27.依据数据类型对所述目标单元的输入参数进行分类以获取分类结果,所述分类结果包括简单参数和复杂参数;
28.若所述分类结果为简单参数,则直接设置对应所述输入参数的取值范围以获取输入参数备选值;
29.若分类结果为复杂参数,则依据序列化工具处理对应的所述输入参数后,再设置所述输入参数的取值范围以获取输入参数备选值。
30.如此,不同类型的输入参数采用不同的设置方法,开发人员根据需要灵活设置参数取值范围,简化复杂参数的取值范围设置过程,提高了复杂参数的设置效率。
31.在一些实施例中,所述对所述依赖服务的输出结果备选值和所述输入参数备选值进行排列组合得到测试案例包括:
32.对所述依赖服务的输出结果备选值和所述输入参数备选值进行排列组合以获取预选测试案例;
33.依据预设数量阈值筛选所述预选测试案例以获取所述测试案例。
34.如此,能够自动生成测试案例,降低可开发人员的劳动强度,用于后续的单元测试。
35.在一些实施例中,所述依据预设数量阈值筛选所述预选测试案例以获取所述测试案例包括:
36.若所述预选测试案例的数量不大于预设数量阈值,则将所有所述预选测试案例作为所述测试案例;
37.若所述预选测试案例的数量大于预设数量阈值,则随机选择固定数量的所述预选
测试案例作为所述测试案例,所述固定数量为预设数量阈值。
38.如此,能够对自动生成的测试案例进行筛选,避免得到的测试案例数量过大导致单元测试的效率降低。
39.在一些实施例中,所述基于所述测试案例进行测试以获取单元测试结果包括:
40.依据预设脚本获取目标单元测试代码;
41.基于所述测试案例执行所述目标单元测试代码以获取单元测试结果。
42.如此,借助现有的单元测试代码自动生成的脚本和自动生成的测试案例实现单元测试的自动化,提高单元测试效率。
43.本技术实施例还提供一种基于人工智能的单元测试装置,所述装置包括:
44.解析单元,用于解析待测源码的语义信息以构建源码依赖树;
45.查询单元,用于获取预设的目标单元的id信息,并依据所述id信息查询所述源码依赖树得到目标单元的依赖服务和输入参数;
46.模拟单元,用于依据模拟工具模拟所述依赖服务得到所述依赖服务的输出结果备选值;
47.设置单元,用于设置所述输入参数的取值范围得到输入参数备选值;
48.组合单元,用于对所述依赖服务的输出结果备选值和所述输入参数备选值进行排列组合得到测试案例;
49.测试单元,用于基于所述测试案例进行测试以获取单元测试结果。
50.本技术实施例还提供一种电子设备,所述电子设备包括:
51.存储器,存储至少一个指令;
52.处理器,执行所述存储器中存储的指令以实现所述的基于人工智能的单元测试方法。
53.本技术实施例还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有至少一个指令,所述至少一个指令被电子设备中的处理器执行以实现所述的基于人工智能的单元测试方法。
附图说明
54.图1是本技术所涉及的基于人工智能的单元测试方法的较佳实施例的流程图。
55.图2是本技术所涉及的源码依赖树的结构图。
56.图3是本技术所涉及的基于人工智能的单元测试装置的较佳实施例的功能模块图。
57.图4是本技术所涉及的基于人工智能的单元测试方法的较佳实施例的电子设备的结构示意图。
具体实施方式
58.为了能够更清楚地理解本技术的目的、特征和优点,下面结合附图和具体实施例对本技术进行详细描述。需要说明的是,在不冲突的情况下,本技术的实施例及实施例中的特征可以相互结合。在下面的描述中阐述了很多具体细节以便于充分理解本技术,所述描述的实施例仅是本技术一部分实施例,而不是全部的实施例。
59.此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个所述特征。在本技术的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。
60.除非另有定义,本文所使用的所有的技术和科学术语与属于本技术的技术领域的技术人员通常理解的含义相同。本文中在本技术的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本技术。本文所使用的术语“和/或”包括一个或多个相关的所列项目的任意的和所有的组合。
61.本技术实施例提供一种基于人工智能的单元测试方法,可应用于一个或者多个电子设备中,电子设备是一种能够按照事先设定或存储的指令,自动进行数值计算和/或信息处理的设备,其硬件包括但不限于微处理器、专用集成电路(application specific integrated circuit,asic)、可编程门阵列(field-programmable gate array,fpga)、数字处理器(digital signal processor,dsp)、嵌入式设备等。
62.电子设备可以是任何一种可与客户进行人机交互的电子产品,例如,个人计算机、平板电脑、智能手机、个人数字助理(personal digital assistant,pda)、游戏机、交互式网络电视(internet protocol television,iptv)、智能式穿戴式设备等。
63.电子设备还可以包括网络设备和/或客户设备。其中,所述网络设备包括,但不限于单个网络服务器、多个网络服务器组成的服务器组或基于云计算(cloud computing)的由大量主机或网络服务器构成的云。
64.电子设备所处的网络包括但不限于互联网、广域网、城域网、局域网、虚拟专用网络(virtual private network,vpn)等。
65.如图1所示,是本技术基于人工智能的单元测试方法的较佳实施例的流程图。根据不同的需求,该流程图中步骤的顺序可以改变,某些步骤可以省略。
66.s10,解析待测源码的语义信息以构建源码依赖树。
67.在一个可选的实施例中,所述解析待测源码的语义信息以构建源码依赖树包括:
68.s101,将待测源码中的每一个待测单元以及每一个待测单元的输入参数作为一个节点,并获取每一个节点的id信息,所述待测单元为所述待测源码中的类和方法,所述节点包括类节点、方法节点和输入参数节点;
69.s102,判断任意两个节点之间是否存在归属关系,若存在,则用无向边连接对应的两个节点,并遍历所有节点以构建源码结构树;
70.s103,在源码结构树的基础上,判断任意类节点之间是否存在继承关系,若存在,则使用从被继承类节点指向继承类节点的有向边连接两节点,遍历所有类节点以构建源码继承树;
71.s104,在源码继承树的基础上,判断任意方法节点之间是否存在调用关系,若存在,则使用从被调用方法节点指向调用方法节点的有向边连接两节点,遍历所有方法节点以构建所述源码依赖树。
72.在一个可选的实施例中,所述待测源码为开发人员为达到开发目的而编写的代码,其中包含所有待测试单元,所述待测试单元为代码中的一个类或方法;所述源码依赖树为可以反应所述待测源码中各类或方法之间的逻辑调用关系的树结构。
73.该可选的实施例中,所述待测源码中包含多个类,每一个类中又包含了类名以及多个方法,其中,类名是字母或数字构成的字符串,且类名与类存在一一对应的关系,故可以将类名作为对应类的id信息;所述方法是类中声明的可以实现特定功能的代码块,在同一个类中每一个方法也会对应一个专属的方法名,故可以将“类名+方法名”作为对应方法的id信息,进一步获取每一个方法的所有输入参数,为同一个方法下的输出参数进行编号,将“方法id信息+编号”作为输入参数的id信息。
74.该可选的实施例中,将所述待测源码作为根节点,获取所述待测源码中所有的类,将所述类的id信息作为节点的id信息得到类节点,并将所有类节点作为第二层节点,进一步获取每一个类节点对应的类中的方法,将方法的id信息作为节点的id信息得到方法节点,并将所有方法节点作为第三层节点,获取每一个方法中的输入变量作为输入参数节点,将输入参数节点作为第四层节点。
75.该可选的实施例中,用无方向的直线将根节点与每一个类节点直接相连,判断方法节点与类节点之间的归属关系,当方法节点对应的方法属于类节点对应的类时,用无方向的直线连接该方法节点和类节点,进一步判断方法节点与输入参数节点之间的归属关系,当输入参数节点对应的输入参数属于方法节点对应的方法时,用无方向的直线连接该方法节点和输入参数节点,遍历所有的节点以构建所述源码结构树。
76.该可选的实施例中,依据类的代码中的关键词获取不同类之间的继承关系,其中,所述继承关系是指新的类在不需重新编写原来类的情况下,可直接使用原来类下所有的属性及方法,所述关键词与具体的开发语言有关。
77.该可选的实施例中,在源码结构树的基础上,按照上述方法判断任意类节点之间是否存在继承关系,若存在则用从被继承类节点指向继承类节点的有向边连接两节点,遍历所有类节点以构建源码继承树。
78.示例性的,若使用的开发语言为java语言,则所述关键词为extends,代码“public class a extends b”表示类别a继承了类别b,则在类a中可直接调用类b中所有的属性值和方法,此时则在所述源码结构树中绘制一条从类b类节点指向类a类节点的有向边,该有向边表示类a继承了类b。
79.该可选的实施例中,依据所述源码继承树判断不同方法之间的调用关系,首先选择一个方法作为目标方法,获取所述目标方法对应的目标类的id信息,利用智能搜索引擎在所述源码继承树中对该id信息进行搜索得到所述目标类节点,根据指向所述目标类节点的有向边获取与所述目标类存在继承关系的继承类,获取所述继承类下所有的方法名构成目标方法的方法集合,进一步,遍历所述目标方法的方法集合中的每一个方法名,在所述目标方法的代码内容中对所述方法名进行查找,若查找到所述方法名,则说明所述方法名对应的方法被目标方法调用,否则则说明所述方法名对应的方法没有被目标方法调用。其中,所述智能搜索是结合了人工智能技术的新一代搜索引擎,该引擎除了能提供传统的快速检索、相关度排序等功能,还能提供节点id信息过滤和推送等功能。
80.该可选的实施例中,在源码继承树的基础上,按照上述方法判断任意方法节点之间是否存在调用关系,若存在则用从被调用方法节点指向调用方法节点的有向边连接两节点,遍历所有类节点以构建源码依赖树,所述源码依赖树的结构示意图如图2所示,所述源码依赖树可以反应每一个方法的依赖服务,所述方法的依赖服务为与所述方法存在调用关
系的所有方法。
81.示例性的,当方法1被方法2调用时,则绘制一条从方法节点1指向方法节点2的有向边表示对应的调用关系,其中,所述方法节点2和方法节点1分别对应方法2和方法1。
82.如此,在单元测试之前获取源码依赖树结构,在单元测试的过程中,仅通过源码依赖树即可获取被测单元的依赖服务和输入参数,避免对源码文件的重复解析,加快单元测试的速度。
83.s11,获取预设的目标单元的id信息,并依据所述id信息查询所述源码依赖树得到目标单元的依赖服务和输入参数。
84.在一个可选的实施例中,获取预设的目标单元的id信息,并查询所述源码依赖树得到目标单元的依赖服务和输入参数包括:
85.s111,获取所述预设的目标单元的id信息;
86.s112,基于所述目标单元的id信息搜索到所述源码依赖树中对应的目标节点;
87.s113,获取指向目标节点的有向边对应的方法节点作为所述目标单元的依赖服务;
88.s114,获取连接目标节点的无向边对应的输入参数节点作为所述目标单元的输入参数。
89.在一个可选的实施例中,所述预设的目标单元是开发人员从所述待测源码中选定的任意待测单元,当所述目标单元为方法时,直接获取对应方法的id信息作为所述目标单元的id信息,当所述目标单元为类时,则需要对该类下的所有方法进行测试,只有当该类下的所有方法测试通过时,所述目标单元的测试才会通过,故获取该类中所有方法的id信息作为所述目标单元的id信息。
90.该可选的实施例中,利用智能搜索引擎在所述源码依赖树中对所述目标单元的id信息进行搜索,提取到目标单元在所述源码依赖树对应的方法节点,获取指向目标节点的所有有向边对应的方法节点,将所述方法节点对应的方法作为所述依赖服务,同时,获取所述源码依赖树中连接目标节点的所有无向边对应的输入参数节点,所述输入参数节点对应的参数即为所述目标单元的输入参数。
91.如此,仅需要选定的目标单元的id信息即可快速获取目标单元的依赖服务和输入参数。
92.s12,依据模拟工具模拟所述依赖服务得到所述依赖服务的输出结果备选值。
93.在一个可选的实施例中,所述依赖服务为目标单元调用的目标单元之外的方法,要完成目标单元的测试任务,必须调用依赖服务以获取依赖服务输出结果,当所述依赖服务不可用或者发生变化时,会导致目标单元测试失败。
94.该可选的实施例中,利用模拟工具对所述依赖服务进行模拟,获取一个虚拟对象来替代所述依赖服务,使得单元测试时不用实际调用真实的依赖服务,仅通过虚拟对象即可获取所述依赖服务可能的输出结果,所述依赖服务可能的输出结果由开发人员依据单元测试的需要进行设置,所述一个依赖服务可能的输出结果可以包含一个,也可以包含多个,将所有可能的输出结果作为对应依赖服务的输出结果备选值,按照相同的方法获取每一个依赖服务的输出结果备选值,需要说明的是,每一个依赖服务可以包括多个输出结果备选值。
95.该可选的实施例中,使用的模拟工具为jmockit工具,所述jmockit为开源的模拟工具,可以实现方法的模拟以完成单元测试。
96.示例性的,设所述依赖服务为获取目标用户的姓名和身份证号时,利用jmockit工具可以对依赖服务进行模拟获取虚拟对象,所述虚拟对象如下:
[0097][0098]
在测试过程中直接调用虚拟对象即可生成随机的姓名和身份证号以满足测试需求,也可以根据开发人员的需求输出特定的结果。
[0099]
s13,设置所述目标单元的输入参数的取值范围得到输入参数备选值。
[0100]
在一个可选的实施例中,所述设置所述目标单元的输入参数的取值范围得到输入参数备选值包括:
[0101]
s131,依据数据类型对所述目标单元的输入参数进行分类以获取分类结果,所述分类结果包括简单参数和复杂参数;
[0102]
s132,若所述分类结果为简单参数,则直接设置对应所述输入参数的取值范围以获取输入参数备选值;
[0103]
s133,若分类结果为复杂参数,则依据序列化工具处理对应的所述输入参数后,再设置所述输入参数的取值范围以获取输入参数备选值。
[0104]
在一个可选的实施例中,在对所述目标单元的每一个输入参数设置取值范围之前,需要对每一个输入参数进行分类,当所述输入参数为基本类型的数据时,该输入参数的分类结果为简单参数,开发人员可以直接对该输入参数进行取值范围的设置,获取该输入参数的备选值,其中,所述基本类型的数据包括string、int、long、double、float、bool、void等数据类型。
[0105]
该可选的实施例中,当所述输入参数不是基本类型的数据时,该输入参数的分类结果为复杂参数,则利用序列化工具将该输入参数转化为json字符串,所述json字符可以直观的观察到所述复杂参数中每一个属性及其对应的属性值,开发人员对json字符串中的需要测试的属性进行取值范围的设置,再将与单元测试无关的属性删除,得到更新后的json字符串,所述更新后的json字符串即为输入参数的备选值,进一步利用反序列化工具对所述更新后的json字符串处理再获取设置后的输入参数,其中,所述序列化工具为new gson().tojson()方法,所述反序列化工具为new gson().fromjson()方法。
[0106]
该可选的实施例中,按照上述的方法对目标单元的每一个输入参数的取值范围进行设定获取每一个输入参数的备选值,所述输入参数的备选值可以一个或多个。
[0107]
示例性的,现有输入参数a的分类结果为复杂参数,经序列化工具处理后得到输入参数a的json字符串为:
[0108]
{
个组合作为所述测试案例,预设的数量阈值n0取值为10。
[0132]
如此,能够自动生成测试案例,降低可开发人员的劳动强度,用于后续的单元测试。
[0133]
s15,基于所述测试案例进行测试以获取单元测试结果。
[0134]
在一个可选的实施例中,所述基于所述测试案例进行测试以获取单元测试结果包括:
[0135]
s151,依据预设脚本获取目标单元测试代码;
[0136]
s152,基于所述测试案例执行所述目标单元测试代码以获取单元测试结果。
[0137]
在一个可选的实施例中,利用预设脚本依据依赖服务生成单元测试代码,利用所述单元测试代码对所述测试案例进行测试,由开发人员判断所述单元测试代码的输出结果是否与所述测试案例的预期结果一致,若一致,则表示单元测试通过,被测单元功能正常,否则表示被测单元功能异常,提示开发人员修改代码,所述预设脚本为现有的单元测试代码自动生成工具。
[0138]
如此,借助现有的单元测试代码自动生成的脚本和自动生成的测试案例实现单元测试的自动化,提高单元测试效率。
[0139]
请参见图3,图3是本技术基于人工智能的单元测试装置的较佳实施例的功能模块图。基于人工智能的单元测试装置11包括解析单元110、查询单元111、模拟单元112、设置单元113、组合单元114、测试单元115。本技术所称的模块/单元是指一种能够被处理器13所执行,并且能够完成固定功能的一系列计算机可读指令段,其存储在存储器12中。在本实施例中,关于各模块/单元的功能将在后续的实施例中详述。
[0140]
在一个可选的实施例中,解析单元110用于解析待测源码的语义信息以构建源码依赖树。
[0141]
在一个可选的实施例中,所述解析单元110用于解析待测源码的语义信息以构建源码依赖树包括:
[0142]
将待测源码中的每一个待测单元以及每一个待测单元的输入参数作为一个节点,并获取每一个节点的id信息,所述待测单元为所述待测源码中的类和方法,所述节点包括类节点、方法节点和输入参数节点;
[0143]
判断任意两个节点之间是否存在归属关系,若存在,则用无向边连接对应的两个节点,并遍历所有节点以构建源码结构树;
[0144]
在源码结构树的基础上,判断任意类节点之间是否存在继承关系,若存在,则使用从被继承类节点指向继承类节点的有向边连接两节点,遍历所有类节点以构建源码继承树;
[0145]
在源码继承树的基础上,判断任意方法节点之间是否存在调用关系,若存在,则使用从被调用方法节点指向调用方法节点的有向边连接两节点,遍历所有方法节点以构建所述源码依赖树。
[0146]
在一个可选的实施例中,所述待测源码为开发人员为达到开发目的而编写的代码,其中包含所有待测试单元,所述待测试单元为代码中的一个类或方法;所述源码依赖树为可以反应所述待测源码中各类或方法之间的逻辑调用关系的树结构。
[0147]
该可选的实施例中,所述待测源码中包含多个类,每一个类中又包含了类名以及
多个方法,其中,类名是字母或数字构成的字符串,且类名与类存在一一对应的关系,故可以将类名作为对应类的id信息;所述方法是类中声明的可以实现特定功能的代码块,在同一个类中每一个方法也会对应一个专属的方法名,故可以将“类名+方法名”作为对应方法的id信息,进一步获取每一个方法的所有输入参数,为同一个方法下的输出参数进行编号,将“方法id信息+编号”作为输入参数的id信息。
[0148]
该可选的实施例中,将所述待测源码作为根节点,获取所述待测源码中所有的类,将所述类的id信息作为节点的id信息得到类节点,并将所有类节点作为第二层节点,进一步获取每一个类节点对应的类中的方法,将方法的id信息作为节点的id信息得到方法节点,并将所有方法节点作为第三层节点,获取每一个方法中的输入变量作为输入参数节点,将输入参数节点作为第四层节点。
[0149]
该可选的实施例中,用无方向的直线将根节点与每一个类节点直接相连,判断方法节点与类节点之间的归属关系,当方法节点对应的方法属于类节点对应的类时,用无方向的直线连接该方法节点和类节点,进一步判断方法节点与输入参数节点之间的归属关系,当输入参数节点对应的输入参数属于方法节点对应的方法时,用无方向的直线连接该方法节点和输入参数节点,遍历所有的节点以构建所述源码结构树。
[0150]
该可选的实施例中,依据类的代码中的关键词获取不同类之间的继承关系,其中,所述继承关系是指新的类在不需重新编写原来类的情况下,可直接使用原来类下所有的属性及方法,所述关键词与具体的开发语言有关。
[0151]
该可选的实施例中,在源码结构树的基础上,按照上述方法判断任意类节点之间是否存在继承关系,若存在则用从被继承类节点指向继承类节点的有向边连接两节点,遍历所有类节点以构建源码继承树。
[0152]
示例性的,若使用的开发语言为java语言,则所述关键词为extends,代码“public class a extends b”表示类别a继承了类别b,则在类a中可直接调用类b中所有的属性值和方法,此时则在所述源码结构树中绘制一条从类b类节点指向类a类节点的有向边,该有向边表示类a继承了类b。
[0153]
该可选的实施例中,依据所述源码继承树判断不同方法之间的调用关系,首先选择一个方法作为目标方法,获取所述目标方法对应的目标类的id信息,利用智能搜索引擎在所述源码继承树中对该id信息进行搜索得到所述目标类节点,根据指向所述目标类节点的有向边获取与所述目标类存在继承关系的继承类,获取所述继承类下所有的方法名构成目标方法的方法集合,进一步,遍历所述目标方法的方法集合中的每一个方法名,在所述目标方法的代码内容中对所述方法名进行查找,若查找到所述方法名,则说明所述方法名对应的方法被目标方法调用,否则则说明所述方法名对应的方法没有被目标方法调用。其中,所述智能搜索是结合了人工智能技术的新一代搜索引擎,该引擎除了能提供传统的快速检索、相关度排序等功能,还能提供节点id信息过滤和推送等功能。
[0154]
该可选的实施例中,在源码继承树的基础上,按照上述方法判断任意方法节点之间是否存在调用关系,若存在则用从被调用方法节点指向调用方法节点的有向边连接两节点,遍历所有类节点以构建源码依赖树,所述源码依赖树的结构示意图如图2所示,所述源码依赖树可以反应每一个方法的依赖服务,所述方法的依赖服务为与所述方法存在调用关系的所有方法。
[0155]
示例性的,当方法1被方法2调用时,则绘制一条从方法节点1指向方法节点2的有向边表示对应的调用关系,其中,所述方法节点2和方法节点1分别对应方法2和方法1。
[0156]
在一个可选的实施例中,查询单元111用获取预设的目标单元的id信息,并依据所述id信息查询所述源码依赖树得到目标单元的依赖服务和输入参数。
[0157]
在一个可选的实施例中,所述查询单元111获取预设的目标单元的id信息,并依据所述id信息查询所述源码依赖树得到目标单元的依赖服务和输入参数包括:
[0158]
获取所述预设的目标单元的id信息;
[0159]
基于所述目标单元的id信息搜索到所述源码依赖树中对应的目标节点;
[0160]
获取指向目标节点的有向边对应的方法节点作为所述目标单元的依赖服务;
[0161]
获取连接目标节点的无向边对应的输入参数节点作为所述目标单元的输入参数。
[0162]
在一个可选的实施例中,所述预设的目标单元是开发人员从所述待测源码中选定的任意待测单元,当所述目标单元为方法时,直接获取对应方法的id信息作为所述目标单元的id信息,当所述目标单元为类时,则需要对该类下的所有方法进行测试,只有当该类下的所有方法测试通过时,所述目标单元的测试才会通过,故获取该类中所有方法的id信息作为所述目标单元的id信息。
[0163]
该可选的实施例中,利用智能搜索引擎在所述源码依赖树中对所述目标单元的id信息进行搜索,提取到目标单元在所述源码依赖树对应的方法节点,获取指向目标节点的所有有向边对应的方法节点,将所述方法节点对应的方法作为所述依赖服务,同时,获取所述源码依赖树中连接目标节点的所有无向边对应的输入参数节点,所述输入参数节点对应的参数即为所述目标单元的输入参数。
[0164]
在一个可选的实施例中,模拟单元112用于依据模拟工具模拟所述依赖服务得到所述依赖服务的输出结果备选值。
[0165]
在一个可选的实施例中,所述依赖服务为目标单元调用的目标单元之外的方法,要完成目标单元的测试任务,必须调用依赖服务以获取依赖服务输出结果,当所述依赖服务不可用或者发生变化时,会导致单元测试失败。
[0166]
该可选的实施例中,利用模拟工具对所述依赖服务进行模拟,获取一个虚拟对象来替代所述依赖服务,使得单元测试时不用实际调用真实的依赖服务,仅通过虚拟对象即可获取所述依赖服务可能的输出结果,所述依赖服务可能的输出结果由开发人员依据单元测试的需要进行设置,所述一个依赖服务可能的输出结果可以包含一个,也可以包含多个,将所有可能的输出结果作为对应依赖服务的输出结果备选值,按照相同的方法获取每一个依赖服务的输出结果备选值,需要说明的是,每一个依赖服务可以包括多个输出结果备选值。
[0167]
该可选的实施例中,使用的模拟工具为jmockit工具,所述jmockit为开源的模拟工具,可以实现方法的模拟以完成单元测试。
[0168]
示例性的,设所述依赖服务为获取目标用户的姓名和身份证号时,利用jmockit工具可以对依赖服务进行模拟获取虚拟对象,所述虚拟对象如下:
[0169][0170]
在测试过程中直接调用虚拟对象即可生成随机的姓名和身份证号以满足测试需求,也可以根据开发人员的需求输出特定的结果。
[0171]
在一个可选的实施例中,设置单元113用于设置所述输入参数的取值范围得到输入参数备选值。
[0172]
在一个可选的实施例中,所述设置单元113设置所述目标单元的输入参数的取值范围得到输入参数备选值包括:
[0173]
依据数据类型对所述目标单元的输入参数进行分类以获取分类结果,所述分类结果包括简单参数和复杂参数;
[0174]
若所述分类结果为简单参数,则直接设置对应所述输入参数的取值范围以获取输入参数备选值;
[0175]
若分类结果为复杂参数,则依据序列化工具处理对应的所述输入参数后,再设置所述输入参数的取值范围以获取输入参数备选值。
[0176]
在一个可选的实施例中,在对所述目标单元的每一个输入参数设置取值范围之前,需要对每一个输入参数进行分类,当所述输入参数为基本类型的数据时,该输入参数的分类结果为简单参数,开发人员可以直接对该输入参数进行取值范围的设置,获取该输入参数的备选值,其中,所述基本类型的数据包括string、int、long、double、float、bool、void等数据类型。
[0177]
该可选的实施例中,当所述输入参数不是基本类型的数据时,该输入参数的分类结果为复杂参数,则利用序列化工具将该输入参数转化为json字符串,所述json字符可以直观的观察到所述复杂参数中每一个属性及其对应的属性值,开发人员对json字符串中的需要测试的属性进行取值范围的设置,再将与单元测试无关的属性删除,得到更新后的json字符串,所述更新后的json字符串即为输入参数的备选值,进一步利用反序列化工具对所述更新后的json字符串处理再获取设置后的输入参数,其中,所述序列化工具为new gson().tojson()方法,所述反序列化工具为new gson().fromjson()方法。
[0178]
该可选的实施例中,按照上述的方法对目标单元的每一个输入参数的取值范围进行设定获取每一个输入参数的备选值,所述输入参数的备选值可以一个或多个。
[0179]
示例性的,现有输入参数a的分类结果为复杂参数,经序列化工具处理后得到输入参数a的json字符串为:
[0180]
{
[0181]
name:null,
[0182]
age:null,
[0183]
income:null
[0184]
}
[0185]
其中,null表示空值,即所述输入参数a中name对应的属性值为空,开发人员的依据单元测试需要对所述输入参数a的json字符串中的属性值进行设置,如将属性income的属性值设置为2000,并将属性值为空的属性删除,得到更新后的json字符串,得到输入参数a的一个备选值:
[0186]
{
[0187]
income:20000.0
[0188]
}
[0189]
进一步利用反序列化工具将更新后的json字符串转化为输入参数a,完成输入参数a取值范围的设定,获取所有的备选值。
[0190]
在一个可选的实施例中,组合单元114用于对所述依赖服务的输出结果备选值和所述输入参数备选值进行排列组合得到测试案例。
[0191]
在一个可选的实施例中,所述组合单元114用于对所述依赖服务的输出结果备选值和所述输入参数备选值进行排列组合得到测试案例包括:
[0192]
对所述依赖服务的输出结果备选值和所述输入参数备选值进行排列组合以获取预选测试案例;
[0193]
依据预设数量阈值筛选所述预选测试案例以获取所述测试案例。
[0194]
在一个可选的实施例中,将所述依赖服务和所述输入参数作为变量因子,将每一个依赖服务的所有输出结果备选值以及每一个输入参数的所有备选值作为变量因子的备选值,则对所有备选值进行排列组合得到所有的预选测试案例,所述预选测试案例数量n的计算方法如下:
[0195][0196]
其中,ni表示第i个变量因子的备选值数量,m为所述单元测试中变量因子的备选值的数量。
[0197]
示例性的,假设共有两个变量因子:因子a和因子b,因子a有三个备选值,因子b有两个备选值,就可以进行全排列组合:
[0198]
因子a:a,b,c
[0199]
因子b:d,e
[0200]
会产生3*2=6种预选测试案例:
[0201]
因子a,因子b:a,d;a,e;b,d;b,e;c,d;c,e。
[0202]
该可选的实施例中,将所述预选测试案例数量n与预设的数量阈值n0进行对比,若所述预选测试案例的数量不大于预设数量阈值,则将所有所述预选测试案例作为所述测试案例;若所述预选测试案例的数量大于预设数量阈值,则则在n种预选测试案例中随机挑选n0个组合作为所述测试案例,预设的数量阈值n0取值为10。
[0203]
在一个可选的实施例中,测试单元115用于基于所述测试案例进行测试以获取单元测试结果。
[0204]
在一个可选的实施例中,所述测试单元115用于基于所述测试案例进行测试以获取单元测试结果包括:
[0205]
依据预设脚本获取目标单元测试代码;
[0206]
基于所述测试案例执行所述目标单元测试代码以获取单元测试结果。
[0207]
在一个可选的实施例中,利用预设脚本依据依赖服务生成单元测试代码,利用所述单元测试代码对所述测试案例进行测试,由开发人员判断所述单元测试代码的输出结果是否与所述测试案例的预期结果一致,若一致,则表示单元测试通过,被测单元功能正常,否则表示被测单元功能异常,提示开发人员修改代码,所述预设脚本为现有的单元测试代码自动生成工具。
[0208]
由以上技术方案可以看出,本技术能够通过解析代码文件的语义信息构建源码依赖树,然后依据源码依赖树获取被测单元的依赖服务,加快了依赖服务获取速度的同时避免了调用真实的依赖服务,从而提高单元测试效率。
[0209]
请参见图4,是本技术实施例提供的一种电子设备的结构示意图。电子设备1包括存储器12和处理器13。存储器12用于存储计算机可读指令,处理器13用执行所述储器中存储的计算机可读指令以实现上述任一实施例所述的基于人工智能的单元测试方法。
[0210]
在一个可选的实施例中,电子设备1还包括总线、存储在所述存储器12中并可在所述处理器13上运行的计算机程序,例如基于人工智能的单元测试程序。
[0211]
图4仅示出了具有存储器12和处理器13的电子设备1,本领域技术人员可以理解的是,图4示出的结构并不构成对电子设备1的限定,可以包括比图示更少或者更多的部件,或者组合某些部件,或者不同的部件布置。
[0212]
结合图1,电子设备1中的所述存储器12存储多个计算机可读指令以实现一种基于人工智能的单元测试方法,所述处理器13可执行所述多个指令从而实现:
[0213]
解析待测源码的语义信息以构建源码依赖树;
[0214]
获取预设的目标单元的id信息,并依据所述id信息查询所述源码依赖树得到目标单元的依赖服务和输入参数;
[0215]
依据模拟工具模拟所述依赖服务得到所述依赖服务的输出结果备选值;
[0216]
设置所述目标单元的输入参数的取值范围得到输入参数备选值;
[0217]
对所述依赖服务的输出结果备选值和所述输入参数备选值进行排列组合得到测试案例;
[0218]
基于所述测试案例进行测试以获取单元测试结果。
[0219]
具体地,所述处理器13对上述指令的具体实现方法可参考图1对应实施例中相关步骤的描述,在此不赘述。
[0220]
本领域技术人员可以理解,所述示意图仅仅是电子设备1的示例,并不构成对电子设备1的限定,电子设备1可以是总线型结构,也可以是星形结构,电子设备1还可以包括比图示更多或更少的其他硬件或者软件,或者不同的部件布置,例如电子设备1还可以包括输入输出设备、网络接入设备等。
[0221]
需要说明的是,电子设备1仅为举例,其他现有的或今后可能出现的电子产品如可适应于本技术,也应包含在本技术的保护范围以内,并以引用方式包含于此。
[0222]
其中,存储器12至少包括一种类型的可读存储介质,所述可读存储介质可以是非易失性的,也可以是易失性的。所述可读存储介质包括闪存、移动硬盘、多媒体卡、卡型存储器(例如:sd或dx存储器等)、磁性存储器、磁盘、光盘等。存储器12在一些实施例中可以是电
子设备1的内部存储单元,例如该电子设备1的移动硬盘。存储器12在另一些实施例中也可以是电子设备1的外部存储设备,例如电子设备1上配备的插接式移动硬盘、智能存储卡(smart media card,smc)、安全数字(secure digital,sd)卡、闪存卡(flash card)等。存储器12不仅可以用于存储安装于电子设备1的应用软件及各类数据,例如基于人工智能的单元测试程序的代码等,还可以用于暂时地存储已经输出或者将要输出的数据。
[0223]
处理器13在一些实施例中可以由集成电路组成,例如可以由单个封装的集成电路所组成,也可以是由多个相同功能或不同功能封装的集成电路所组成,包括一个或者多个中央处理器(central processing unit,cpu)、微处理器、数字处理芯片、图形处理器及各种控制芯片的组合等。处理器13是电子设备1的控制核心(control unit),利用各种接口和线路连接整个电子设备1的各个部件,通过运行或执行存储在所述存储器12内的程序或者模块(例如执行基于人工智能的单元测试程序等),以及调用存储在所述存储器12内的数据,以执行电子设备1的各种功能和处理数据。
[0224]
所述处理器13执行所述电子设备1的操作系统以及安装的各类应用程序。所述处理器13执行所述应用程序以实现上述各个基于人工智能的单元测试方法实施例中的步骤,例如图1所示的步骤。
[0225]
示例性的,所述计算机程序可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在所述存储器12中,并由所述处理器13执行,以完成本技术。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机可读指令段,该指令段用于描述所述计算机程序在电子设备1中的执行过程。例如,所述计算机程序可以被分割成解析单元110、查询单元111、模拟单元112、设置单元113、组合单元114、测试单元115。
[0226]
上述以软件功能模块的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、计算机设备,或者网络设备等)或处理器(processor)执行本技术各个实施例所述的基于人工智能的单元测试方法的部分。
[0227]
电子设备1集成的模块/单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指示相关的硬件设备来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。
[0228]
其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-only memory)、随机存储器及其他存储器等。
[0229]
进一步地,计算机可读存储介质可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序等;存储数据区可存储根据区块链节点的使用所创建的数据等。
[0230]
本技术所指区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链(blockchain),本质上是一个去中心化的数据库,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次网络交易的信息,用于验
证其信息的有效性(防伪)和生成下一个区块。区块链可以包括区块链底层平台、平台产品服务层以及应用服务层等。
[0231]
总线可以是外设部件互连标准(peripheral component interconnect,简称pci)总线或扩展工业标准结构(extended industry standard architecture,简称eisa)总线等。该总线可以分为地址总线、数据总线、控制总线等。为便于表示,在图4中仅用一根箭头表示,但并不表示仅有一根总线或一种类型的总线。所述总线被设置为实现所述存储器12以及至少一个处理器13等之间的连接通信。
[0232]
本技术实施例还提供一种计算机可读存储介质(图未示),计算机可读存储介质中存储有计算机可读指令,计算机可读指令被电子设备中的处理器执行以实现上述任一实施例所述的基于人工智能的单元测试方法。
[0233]
在本技术所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。
[0234]
所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
[0235]
另外,在本技术各个实施例中的各功能模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能模块的形式实现。
[0236]
此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。说明书陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一、第二等词语用来表示名称,而并不表示任何特定的顺序。
[0237]
最后应说明的是,以上实施例仅用以说明本技术的技术方案而非限制,尽管参照较佳实施例对本技术进行了详细说明,本领域的普通技术人员应当理解,可以对本技术的技术方案进行修改或等同替换,而不脱离本技术技术方案的精神和范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1