一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

测试接口确定和函数调用链生成方法、装置、设备及介质与流程

2022-11-16 13:14:31 来源:中国专利 TAG:


1.本技术涉及软件开发技术领域,尤其涉及一种测试接口确定和函数调用链生成方法、装置、设备及介质。


背景技术:

2.在软件开发领域,软件代码发生更新时,需要测试人员对更新后的软件代码进行测试。为测试人员推荐出需要执行的测试接口,可降低测试工作量,提高测试效率。然而,现有测试接口推荐方式,处理工作量较大,导致确定测试接口的效率较低。


技术实现要素:

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.在本技术实施例中,可通过对待测软件更新后的源代码的配置文件和中间代码文件进行解析,得到待测软件更新后的源代码的接口列表和函数节点列表;并根据待测软件更新后的源代码的接口列表和函数节点列表,生成接口列表中接口的函数调用链;后续,根据接口列表中接口对应的函数调用链,从接口列表中确定待测软件的变更函数对应的接口为待测软件的测试接口。由于函数调用链是通过对静态的中间代码文件和配置文件解析得到的,因此,本技术实施例得到的函数调用链为静态函数调用链,在生成静态函数调用链的过程中,无需执行待测软件的更新后的源代码,可免去执行待测软件更新后的源代码的耗时,有助于加快函数调用链的生成速度,提高函数调用链的生成效率,进而有助于提高后续基于函数调用链,确定变更函数的测试接口的效率。
附图说明
28.此处所说明的附图用来提供对本技术的进一步理解,构成本技术的一部分,本技术的示意性实施例及其说明用于解释本技术,并不构成对本技术的不当限定。在附图中:
29.图1为本技术实施例提供的测试接口确定方法的流程图;
30.图2为本技术实施例提供的确定函数节点的思维导图;
31.图3为本技术实施例提供的待测软件更新后的源代码的接口列表的确定方法的流程示意图;
32.图4为本技术实施例提供的接口的函数调用链的确定方法的流程示意图;
33.图5为本技术实施例提供的待测软件的变更函数的确定方式的流程示意图;
34.图6为本技术实施例提供的确定测试接口的流程示意图;
35.图7为本技术实施例提供的函数调用链生成方法的流程示意图;
36.图8为本技术实施例提供的计算设备的结构示意图;
37.图9为本技术实施例提供的测试接口确定装置的结构示意图;
38.图10为本技术实施例提供的函数调用链生成装置的结构示意图。
具体实施方式
39.为使本技术的目的、技术方案和优点更加清楚,下面将结合本技术具体实施例及相应的附图对本技术技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
40.在软件开发领域,为测试任务推荐出需要执行的测试接口,可降低测试工作量,提高测试效率。在一些方案中,可测试人员可通过执行测试用例动态录制知识库的方式,建立代码和测试用例的联系,从而在代码发生变更时能够推荐出需要执行的接口或功能的测试用例。但是,录制的知识库存在维护成本,当代码和测试用例关联的最小单元(如函数或定制化的代码块)发生大量变更时,需要重新录制知识库,这些工作难以通过全自动的方式完成,往往需要测试人员手工维护,导致知识库的录制效率低,进而导致确定测试用例的效率较低。
41.在另一些方案中,可通过动态采集函数的实际调用关系生成动态函数调用链(function call graph),从而在代码发生变更时,基于函数调用链推荐出需要执行的测试接口。其中,函数调用链用于表征程序设计语言中函数(function/method)之间的调用关系,可抽象为链表式数据结构。动态函数调用链是指在代码实际运行过程中通过采集并记录函数间的动态调用关系组装而成的函数调用链。但是,动态采集函数调用关系生成函数调用链,需要系统实际运行代码才能实现,而且当代码变动时也需要重新运行代码,但是运行代码需要执行的时间较长,导致函数调用链的生成耗时较长,进而导致后续基于函数调用链确定测试接口效率较低。尤其对于较大规模系统代码的函数调用链的采集,由于系统间的函数调用量较高,通过执行系统代码生成函数调用链的耗时更长。而且,往往采取间隔固定时间采样的方式触发生成函数调用链的流程,但是当实际应用场景没有触发时函数调用链也不会被采集到,没办法保证完整录制函数调用链。
42.基于上述方案中函数调用链生成耗时时间长,导致确定测试接口的效率低下的技术问题,在本技术一些实施例中,可通过对待测软件更新后的源代码的配置文件和中间代码文件进行解析,得到待测软件更新后的源代码的接口列表和函数节点列表;并根据待测软件更新后的源代码的接口列表和函数节点列表,生成接口列表中接口的函数调用链;后续,根据接口列表中接口对应的函数调用链,从接口列表中确定待测软件的变更函数对应的接口为待测软件的测试接口。由于函数调用链是通过对静态的中间代码文件和配置文件解析得到的,因此,本技术实施例得到的函数调用链为静态函数调用链,在生成静态函数调用链的过程中,无需执行待测软件的更新后的源代码,可免去执行待测软件更新后的源代码的耗时,有助于加快函数调用链的生成速度,提高函数调用链的生成效率,进而有助于提高后续基于函数调用链,确定变更函数的测试接口的效率。
43.以下结合附图,详细说明本技术各实施例提供的技术方案。
44.应注意到:相同的标号在下面的附图以及实施例中表示同一物体,因此,一旦某一物体在一个附图或实施例中被定义,则在随后的附图和实施例中不需要对其进行进一步讨论。
45.图1为本技术实施例提供的测试接口确定方法的流程示意图。如图1所示,该测试接口确定方法主要包括:
46.101、获取待测软件更新后的第一源代码的配置文件和多个中间代码文件。
47.102、对多个中间代码进行解析,以得到第一源代码的函数节点列表。
48.103、对配置文件进行解析,以得到第一源代码的接口列表。
49.104、根据接口列表和函数节点列表,生成接口列表中接口的函数调用链。
50.105、根据第一源代码和待测软件更新前的第二源代码,确定待测软件的变更函数。
51.106、根据接口列表中接口对应的函数调用链,从接口列表中确定变更函数对应的接口为待测软件的测试接口。
52.在本实施例中,待测软件为任一软件系统、模块或应用程序(app)等。该软件在开发过程中,软件代码发生更新,需要测试人员对更新代码进行测试。在本技术实施例中,不限定待测软件的代码语言类型。其中,待测软件可为任意编程语言开发的软件。例如,待测软件为php语言、java语言、c语言、c 语言等开发的软件。待测软件可为客户端/服务端(c/s)架构中的服务端软件。上述php语言是一种html内部的服务器端执行的脚本语言,常用于开发动态网站。php作为预处理器,能够在服务器端动态生成html。
53.为了实现为待测软件发生变更的代码进行精准测试,需要确定待测软件的测试接口,并推荐给测试人员。为了确定测试接口,在步骤101中,可获取待测软件更新后的源代码的配置文件和多个中间代码文件。多个是指2个或2个以上。待测软件的源代码是php语言脚本。其中,更新后的源代码的中间代码文件为多个。多个是指2个或2个以上。具体地,源代码中的每个类对应一个中间代码文件。中间代码文件的数量由更新后的源代码中类的数量决定。对于php语言脚本来说,中间代码文件为php的中间代码(operate code,opcode),也可称为操作码。中间代码文件为可执行运行的中间代码。
54.在本技术实施例中,可利用解释器对源代码进行分析,以得到源代码对应的多个中间代码文件。当然,也可在测试接口确定的流程执行之前,利用解释器对源代码进行分析,以得到源代码对应的多个中间代码文件,并存储多个中间代码文件。相应地,在执行测试接口确定的流程时,从存储介质中,读取待测软件更新后的源代码的多个中间代码文件。
55.配置文件主要用于描述待测软件的配置信息。配置文件可为nginx配置文件,主要包括以下4个部分:(1)main:全局设置模块;(2)server模块:虚拟主机设置模块,主要用于指定虚拟机主机域名,ip地址和端口等;(3)upstream模块:上游服务器设置模块,用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡等相关配置;(4)location:定位模块,主要用于url匹配特定位置的设置。
56.在本技术实施例中,不限定获取待测软件更新后的源代码的配置文件的具体实施方式。在一些实施例中,在执行测试接口确定方法的计算设备中可安装配置文件解析器,如nginx parser插件等。可利用配置文件解析器读取待测软件中的配置文件。
57.发明人研究发现中间代码具有一定的语言组织规则,通过对语言组织规则进行解析,可确定源代码中的函数。基于此,在步骤102中,可对多个中间代码文件进行解析,以得到待测软件更新后的源代码的函数节点列表。函数节点列表中的函数节点可包括:调用函数的名称和类以及被调用函数的名称和类。例如,假设函数调用关系为a函数调用b函数和c函数,则调用函数为a函数,被调用函数为b函数和c函数。相应地,函数节点可表示为:
58.a函数;a函数的类;子节点{b函数,b函数的类;c函数,c函数的类}。
59.在本技术实施例中,不限定对多个中间代码文件进行解析的具体实施方式。在一些实施例中,可根据中间代码的语言组织规则,对多个中间代码文件进行解析,得到待测软件更新后的源代码的函数节点列表。由于每个中间代码文件的解析过程相同,因此,下面以多个中间代码文件中的任一中间代码文件为例,并结合图2示出的函数节点列表的确定方式的思维导图,对中间代码文件的解析过程进行示例性说明。其中,为了便于描述,在下文中将示例的中间代码文件,定义为第一中间代码文件。其中,第一中间代码文件为多个中间代码文件中的任一中间代码文件。
60.由于每个中间代码文件对应源代码的一个类,基于此,针对第一中间代码文件,可对第一中间文件进行解析,以确定第一中间代码文件包含的类定义的函数;且确定该类为第一中间代码文件包含的类定义的函数对应的类。具体地,可从第一中间文件中,识别类的关键字,如class;并根据类的关键字,从第一中间文件中提取类的名称(即类名)。例如,类的声明行为“class testclass”,则可确定类名为“testclass”。进一步,可从第一中间文件中,识别类定义的函数的起始点和终止点。例如,可从第一中间文件中,识别函数声明行,如“function name:xxxx”,则确定类中定义的函数的名称为“xxxx”,该函数的类为“testclass”。
61.在确定出第一中间文件包含的类定义的函数之后,可根据第一中间代码文件中该函数的被调用函数的语言组织规则,确定类定义的函数的被调用函数的函数名和类。为了便于描述和区分,将第一中间文件包含的类定义的函数,定义为第一函数a;并将第一函数a调用的函数b(即第一函数a的被调用函数),定义为第二函数b。
62.可选地,可根据第一中间代码文件中被调用函数的语言组织规则,确定第二函数b的函数类型。在本技术实施例中,函数的函数类型主要是指函数为静态函数,还是普通函数。其中,静态函数的函数类型可用关键字static修饰,静态函数限定在本源码文件中使用,不能被本源码文件以外的代码文件调用。例如,对于php中间代码,静态函数在php中间代码中可以“init_static_method_call”表示。普通函数是相对于静态函数而言的,函数类型不存在关键字static。静态函数是指可以被其它代码文件调用的函数。例如,静态函数在php中间代码中可以“init_method_call”表示。
63.对于中间代码来说,不同函数类型的语言组织规则不同,因此,可根据第一中间代码文件中第二函数的函数类型对应的语言组织规则,确定第二函数的类和函数名。对于中间代码文件,同一函数类型下函数包含的操作数数量不同,函数的语言组织规则也不同。其中,函数包含的操作数数量是指指令行包含的操作数的数量,可为双操作数或单操作数。双操作数的指令行的操作数数量为2个;单操作数的指令行的操作数数量为1个。基于此,可从第一中间代码文件中,获取第二函数包含的操作数数量;并根据第一中间代码文件中第二函数的函数类型下的操作数数量对应的语言组织规则,确定第二函数的函数名和第二函数的类。
64.下面结合图2所示的函数节点列表的确定方式的思维导图,对确定第二函数的函数名和第二函数的类的具体实施方式进行示例性说明。
65.如图2所示,针对第二函数的函数类型为静态函数,即“init_static_method_call”,且第二函数的操作数数量为双操作数的情况,可确定双操作数的第二个操作数为第二函数的函数名;并可根据双操作数的第一个操作数的格式,确定第二函数的类。例如,第
二函数为“init_static_method_call

testclass’,

staticdosomething
’”
,则确定双操作数的第二个操作数“staticdosomething”为第二函数的函数名。
66.可选地,根据双操作数的第一个操作数的格式,确定第二函数的类可实现为:若双操作数的第一个操作数的格式不是指定格式,确定第一个操作数为第二函数的类。编程语言不同,指定格式不同。在一些实施例中,编程语言为php语言。相应地,中间代码文件为php语言的中间代码文件,则指定格式可为“$数字”格式。例如,上述“init_static_method_call

testclass’,

staticdosomething
’”
,则确定双操作数的第一个操作数“testclass”为第二函数的函数名。
67.相应地,若双操作数的第一个操作数的格式为指定格式,可根据双操作数所在代码行的前一代码行定义的类的类型,确定第二函数的类。例如,对于下述php的中间代码示例:
68.fet_class self 513$2
69.init_static_method_call $2,

getarr’70.由于双操作数的静态函数的第一个操作数的格式为“$2”,即为“$数字”,则可根据该双操作数所在代码行的前一代码行“fet_class self 513$2”定义的类的类型,确定第二函数的类。
71.其中,双操作数所在代码行的前一代码行定义的类的类型不同,确定第二函数的类的实施方式不同。在一些实施例中,相应地,若双操作数所在代码行的前一代码行定义的类的类型为第一指定类型,确定第二函数的类为第一中间代码文件对应的当前类,即第一中间代码文件对应的类,也是上述第一函数的类。相应地,若双操作数所在代码行的前一代码行的格式为第二指定类型,确定第二函数的类为当前类的父类,即为第一中间代码文件对应的类的父类。进一步,可根据关键字“parent”,在第一中间代码文件中确定父类声明的代码行;并从父类声明的代码行中获取第一中间代码文件对应的类的父类。
72.例如,对于php的中间代码,双操作数所在代码行的前一代码行定义的类的类型可为self类型、static类型或parent类型。相应地,若双操作数所在代码行的前一代码行定义的类的类型为self类型或static类型,确定第二函数的类为第一中间代码文件对应的当前类,即第一中间代码文件对应的类,也是上述第一函数的类。相应地,若双操作数所在代码行的前一代码行的格式为parent类型,确定第二函数的类为当前类的父类,即为第一中间代码文件对应的类的父类。进一步,可根据关键字“parent”,在第一中间代码文件中确定父类声明的代码行;并从父类声明的代码行中获取第一中间代码文件对应的类的父类。
73.在另一些实施例中,如图2所示,第二函数的函数类型为静态函数,其操作数数量为单操作数。相应地,根据第一中间代码文件中第二函数的函数类型下的操作数数量对应的语言组织规则,确定第二函数的函数名及所述第二函数的类,可实现为:确定第二函数的函数名为构造函数,即“_construct”函数;并可根据单操作数的操作数名的格式,确定第二函数的类。
74.可选地,若单操作数的操作数名的格式不是指定格式,确定单操作数的操作数名为第二函数的类。若单操作数的操作数名的格式为指定格式,可根据单操作数所在代码行的前一代码行定义的类的类型,确定第二函数的类。对于php中间代码文件,指定格式可为“$数字”格式。
75.具体地,若单操作数所在代码行的前一代码行定义的类的类型为第一指定类型,确定第二函数的类为第一中间代码文件对应的当前类;若单操作数所在代码行的前一代码行的格式为第二指定类型,确定第二函数的类为当前类的父类。对于php的中间代码文件,第一指定类型可为self类型或static类型;第二指定类型可为parent类型。其中,关于第一中间代码文件对应的当前类的父类的确定方式,可参见上述实施例的相关内容,在此不再赘述。
76.在一些实施例中,如图2所示,第二函数的函数类型为普通函数;第二函数的操作数数量为双操作数。相应地,根据第一中间代码文件中第二函数的函数类型下的操作数数量对应的语言组织规则,确定第二函数的函数名及所述第二函数的类,可实现为:根据该双操作数所在代码行的前一代码行的操作类型,确定第二函数的函数名及所述第二函数的类。
77.具体地,若双操作数所在代码行的前一代码行的操作类型为变量赋值操作,如fetch_obj_r操作,则确定双操作数的第二个操作数名为第二函数的函数名。例如,如下述代码行所示:
78.fetch_obj_r $12
ꢀ‘
ps’79.init_method_call $12,

invoke’80.变量赋值(fetch_obj_r)操作的第二个操作数名“ps”为第二函数的函数名。
81.在确定出第二函数的函数名之后,可通过变量赋值操作对应的变量名在第一中间代码文件中查找对变量名进行声明的变量声明操作行。其中,在php中间代码文件中,变量声明操作行的操作名为“assign_obj”。例如,结合如下述中间代码行所示:
[0082][0083]
上述fetch_obj_r的第二个操作数为变量名“ps”,可利用“ps”在第一中间代码文件中查找对“ps”进行声明的变量声明操作行为“assign_obj

ps
’”

[0084]
在确定出对变量名进行声明的变量声明操作行之后,可根据变量声明操作行,定位第一函数的内部变量赋值操作行。例如,可根据第一中间代码文件中变量声明操作行的位置,定位与变量声明操作行距离最近的变量赋值操作行,为第一函数的内部变量赋值操作行。其中,在php中间代码文件中,内部变量赋值操作名为“assign”。相应地,可根据第一中间代码文件中assign_obj操作行的位置,定义与assign_obj操作行距离最近的assign操作行为第一函数的内部变量赋值操作行,如上述代码行示例中“assign !3,$4”。
[0085]
进一步,可通过内部变量声明操作行对应的内部变量名,在第一中间代码文件中查询对内部变量名的初始化代码行;并确定初始化代码行的操作数名为第二函数的类名。在php中间代码中,初始化操作可实现为new操作,相应地,初始化代码行实现为new操作行。例如,结合上述代码行示例,可通过内部变量声明操作行“assign !3,$4”的内部变量名“$4”在第一中间代码文件中查询,得到对内部变量名的初始化代码行为“new $4
ꢀ‘
xxxxx
’”

进一步,可初始化代码行的操作数名“xxxxx”为第二函数的类名。
[0086]
上述实施例示例性给出了第二函数的函数类型为普通函数;第二函数的操作数数量为双操作数时,该双操作数所在代码行的前一代码行的操作类型为变量赋值操作的情况下,确定第二函数的函数名及所述第二函数的类的具体实施方式。在另一些实施例中,第二函数的函数类型为普通函数;第二函数的操作数数量为双操作数时,该双操作数所在代码行的前一代码行的操作类型也可能不是变量赋值操作,则可确定双操作数的第二个操作数名为第二函数的函数名。例如,对于下述php中间代码:
[0087]
ext_stmt
[0088]
init_method_call !3,

setex’[0089]
针对上述中间代码示例,可确定普通函数对应的双操作数的第二个操作数名“setex”为第二函数的函数名。
[0090]
还可在第一中间代码文件中查找内部变量赋值操作,如assign操作。例如:assign操作可为:assign !3,$8。进一步,可通过内部变量声明操作行对应的内部变量名,在第一中间代码文件中查询对内部变量名进行初始化的第一初始化操作;根据查询第一初始化操作的查询结果,确定第二函数的类。对于php中间代码文件,第一初始化操作可为do_fcall操作。
[0091]
可选地,若查询结果为查询到对内部变量名进行初始化的第一初始化操作,调用执行初始化操作的工厂函数;并确定工厂函数声明的类为第二函数的类。例如,可调用工厂函数显式声明的对象;确定工厂函数显示声明的对象的类为第二函数的类。又例如,可调用工厂函数隐式声明的对象;确定工厂函数显示声明的对象的类为第二函数的类。
[0092]
相应地,若查询结果为未查询到对内部变量名进行初始化的第一初始化操作,则利用所述内部变量名在第一中间代码文件中,查找对内部变量名进行初始化的第二初始化操作;并确定第二初始化操作的操作数名为第二函数的类名。在php中间代码文件中,第二初始化操作可为new操作。
[0093]
上述实施例示例性给出了第二函数的函数类型为普通函数;第二函数的操作数数量为双操作数时,确定第二函数的函数名及所述第二函数的类的具体实施方式。在另一些实施例中,第二函数的函数类型为普通函数;第二函数的操作数数量也可能为单操作数。如图2所示,针对第二函数的函数类型为普通函数;第二函数的操作数数量也可能为单操作数的情况,根据第一中间代码文件在第二函数的函数类型下的操作数数量对应的语言组织规则,确定第二函数的函数名及所述第二函数的类,可实现为:确定单操作数的操作数名为第二函数的函数名;并确定第二函数的类为第一中间代码文件对应的当前类。
[0094]
上述实施例示例性说明了如何确定第一中间代码文件包含的调用函数(第一函数)的函数名及类名,以及,第一中间代码文件包含的调用函数的被调用函数(第二函数)的函数名及类名的具体实施方式。在确定出第一中间文件包含的调用函数的函数名及类名,以及,被调用函数的函数名及类名之后,可根据第一函数的函数名和类名,以及,第二函数的函数名及类名,生成第一中间代码文件对应的函数节点。关于函数节点的实现形式可参见上述实施例的相关内容,在此不再赘述。每个中间代码文件对应的函数节点中的第二函数(被调用函数)是第一函数(调用函数)直接调用的函数。一个函数节点中第一函数为1个。第二函数可为1个或多个。多个是指2个或2个以上。
[0095]
上述仅以多个中间代码文件中的第一中间代码文件为例,对中间代码文件的解析过程进行示例性说明。多个中间代码文件中的每个中间代码文件的解析过程均与第一中间代码文件相同,在此不再赘述。
[0096]
在得到每个中间代码文件的函数节点之后,可根据待测软件更新后的源代码对应的多个中间代码文件对应的函数节点,构建函数节点列表。其中,函数节点列表包括:多个中间代码文件对应的函数节点。
[0097]
在本技术实施例中,为了确定待测软件的测试接口,除了确定待测软件更新后的源代码的函数节点列表之外,还需确定更新后的源代码包含的接口。基于此,在步骤103中,可对待测软件更新后的源代码的配置文件进行解析,得到更新后的源代码的接口列表。在本技术实施例中,接口可为http类型接口,即在客户端/服务器(c/s)架构或浏览器/服务器架构(b/s)网络中后端服务提供给客户端调用的接口名称,如url。
[0098]
基于上述配置文件包含内容的描述,可知虚拟主机设置(server)模块主要用于指定虚拟机主机域名、ip地址和端口的。对于接口url,虚拟机主机域名为url的主要组成部分。而且,虚拟主机设置模块的if语句设置了接口的请求路径。基于此,为了确定待测软件更新后的源代码的接口,可获取配置文件中的虚拟主机设置(server)模块。可选地,可采用findall方法获取配置文件中的虚拟主机设置模块。
[0099]
进一步,可获取虚拟主机设置模块中的虚拟机主机域名;进一步,对虚拟主机设置模块进行解析,以获取第一源代码的接口的请求路径;之后,可对虚拟机主机域名和请求路径进行拼接,以得到第一源代码的接口列表中的接口。
[0100]
在本技术实施例中,不限定获取第一源代码的接口的请求路径的具体实施方式。在一些实施例中,可获取虚拟主机设置模块中的if语句;在if语句中存在包含$request_uri变量的目标if语句的情况下,根据目标if语句的条件记录的路径参数和$request_uri变量,确定接口的请求路径。这主要是因为若if语句中存在$request_uri变量,说明存在接口的请求路径重写,即接口url的请求路径不是直接对应服务所在的文件路径,因此,需要根据目标if语句的条件记录的路径参数和$request_uri变量,确定接口的请求路径。
[0101]
在本技术实施例中,配置文件还包括映射(map)模块。映射模块记录有接口的请求路径的路径参数与参数值的对应关系。基于此,还可从配置文件中获取映射模块。可选地,可采用findall方法获取配置文件中的映射模块。基于配置文件中的映射模块,上述根据目标if语句的条件记录的路径参数和$request_uri变量,确定接口的请求路径,可实现为:根据目标if语句的条件记录的路径参数,查询映射模块,以确定目标if语句的条件记录的路径参数对应的参数值。进一步,可确定目标if语句的条件记录的路径参数对应的参数值为接口的请求路径中位于目标if语句的条件记录的路径参数的下一路径参数,因此,进一步,利用目标if语句的条件记录的路径参数对应的参数值,查询映射模块,以确定下一路径参数的参数值;其中,下一路径参数的参数值为$request_uri变量对应的参数值。进一步,若$request_uri变量下存在子文件,可拼接目标if语句的条件记录的路径参数对应的参数值、$request_uri变量对应的参数值及子文件的文件名,得到接口的请求路径。进一步,可将上述虚拟主机域名和接口的请求路径进行拼接,得到接口url。其中,接口url可实现为:虚拟主机域名/目标if语句的条件记录的路径参数对应的参数值/$request_uri变量对应的参数值/子文件的文件名。
[0102]
相应地,若$request_uri变量下不存在子文件,可拼接目标if语句的条件记录的路径参数对应的参数值和$request_uri变量对应的参数值,得到接口的请求路径。进一步,可将上述虚拟主机域名和接口的请求路径进行拼接,得到接口url。其中,接口url可实现为:虚拟主机域名/目标if语句的条件记录的路径参数对应的参数值/$request_uri变量对应的参数值。
[0103]
对于虚拟主机设置模块中的if语句不存在包含$request_uri变量的目标if语句的情况下,可获取虚拟主机设置模块中的根路径;并从虚拟主机设置模块中获取根路径下的文件名,作为接口的请求路径。进一步,可将上述虚拟主机域名和根路径下的文件名进行拼接,得到接口url。其中,接口url可实现为:虚拟主机域名/根路径下的文件名。
[0104]
下面结合图3所示的具体实施例对确定待测软件更新后的源代码的接口列表的实施方式进行详细说明。如图3所示,该方式主要包括以下步骤:
[0105]
s11、利用nginx parser插件读取待测软件中的nginx配置文件。
[0106]
s12、采用findall方法获取配置文件中的映射模块。
[0107]
s13、采用findall方法获取配置文件中的server模块。
[0108]
s14、判断所有server模块是否遍历完成。若判断结果为是,执行步骤s116;若判断结果为否,执行步骤s15。
[0109]
s15、从尚未遍历的sever模块中,任取目标server模块。
[0110]
s16、采用findparam方法获取目标server模块中的虚拟机域名和根路径。
[0111]
s17、获取目标server模块的if语句。
[0112]
s18、查询if语句中是否存在包含$request_uri变量的目标if语句;若判断结果为是,执行步骤s19;若判断结果为否,执行步骤s114。
[0113]
s19、根据目标if语句条件记录的路径参数,查询映射模块,以确定目标if语句的条件记录的路径参数对应的参数值。
[0114]
s110、以目标if语句的条件记录的路径参数对应的参数值为目标if语句的条件记录的路径参数的下一路径参数,查询映射模块,以确定下一路径参数的参数值;其中,下一路径参数的参数值为$request_uri变量对应的参数值。
[0115]
s111、判断$request_uri变量下是否存在子文件。若判断结果为是,执行步骤s112;若判断结果为否,执行步骤s113。
[0116]
s112、拼接目标server模块中的虚拟机域名、目标if语句的条件记录的路径参数对应的参数值、$request_uri变量对应的参数值及子文件的文件名,得到接口的url。返回执行步骤s14。
[0117]
s113、拼接目标server模块中的虚拟机域名、目标if语句的条件记录的路径参数对应的参数值和$request_uri变量对应的参数值,得到接口的url。返回执行步骤s14。
[0118]
s114、从目标server模块中获取根路径下的文件名。
[0119]
s115、拼接目标server模块中的虚拟机域名和根路径下的文件名,得到接口的url。返回执行步骤s14。
[0120]
s116、利用已拼接的所有接口url组成接口列表,并输出。
[0121]
上述实施例示例性地给出了确定待测软件更新后的源代码的函数节点列表和接口列表的实现方式。在得到更新后的源代码的函数节点列表和接口列表之后,在步骤104
中,可根据更新后的源代码的函数节点列表和接口列表,生成接口列表中接口的调用函数链。
[0122]
具体地,可确定接口列表中接口对应的入口类。在本技术实施例中,不限定确定接口对应的入口类的具体实施方式。在一些实施例中,可根据待测软件更新后的第一源代码的接口的请求路径,确定接口列表中接口对应的入口类。具体地,若第一源代码的接口的请求路径是根据目标if语句的条件记录的路径参数和$request_uri变量确定的,则拼接虚拟主机设置模块中的根路径和$request_uri变量对应的参数值,作为该接口对应的入口类。相应地,若第一源代码的接口的请求路径是虚拟主机设置模块中的根路径下的文件名,确定根路径下的文件名为接口对应的入口类。
[0123]
基于接口列表中接口对应的入口类,可根据函数节点列表,确定接口列表中接口对应的入口类包含的方法;根据入口类包含的方法,确定该接口的入口函数。可选地,若入口类包含的方法存在入口run方法,确定入口run方法为接口的入口函数。若入口类包含的方法不存在入口run方法,确定接口对应入口类的父类为接口的目标入口类;进一步,可确定目标入口类中的run方法为接口的入口函数。对于接口对应入口类的父类,可通过下述方式确定:根据关键字“parent”,在入口类对应的中间代码文件中确定父类声明的代码行;并从父类声明的代码行中获取中间代码文件对应的入口类的父类,即为接口对应入口类的父类。
[0124]
在确定出接口的入口函数之后,可根据入口函数和函数节点,生成接口的函数调用链。具体地,可以接口的入口函数为初始遍历函数,获取以当前遍历到的函数为调用函数的第一函数节点;在第一函数节点存在被调用函数的情况下,将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数递归加入已组装的函数调用链;以当前遍历到的函数的被调用函数为新的调用函数并返回执行获取以当前遍历到的函数为调用函数的第一函数节点的操作,直至第一函数节点无被调用函数,得到接口的函数调用链。
[0125]
可选地,在将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数递归加入已组装的函数调用链之前,可判断第一函数节点中的被调用函数是否存在于已组装的函数调用链中;若判断结果为否,则将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数递归加入接口的已组装的函数调用链。
[0126]
可选地,还可利用第一函数节点中的被调用函数在所述函数节点列表中查询;若在函数节点列表中查询到以第一函数节点中的被调用函数为调用函数的第二函数节点,将将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数,递归加入已组装的函数调用链。相应地,若在函数节点列表中未查询到目标函数节点,利用第一函数节点中的被调用函数在当前遍历到的函数的父类包含的函数中进行查询;若在当前遍历到的函数的父类包含的函数中,查询到第一函数节点中的被调用函数,将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数,递归加入已组装的函数调用链。相应地,若在当前遍历到的函数的父类包含的函数中,未查询到第一函数节点中的被调用函数,将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数,递归加入已组装的函数调用链,并结束循环,得到接口的函数调用链。
[0127]
为了便于理解上述确定接口的函数调用链的具体实施过程,下面结合图4所示的具体实施例进行示例性说明。如图4所示。确定接口的函数调用链的方法主要包括:
[0128]
s21、确定接口列表中接口对应的入口类。
[0129]
s22、判断入口类包含的方法中是否存在入口run方法。若判断结果为是,执行步骤s23;若判断结果为否,执行步骤s24。
[0130]
s23、确定入口run方法为入口函数。接着执行步骤s26。
[0131]
s24、确定接口对应入口类的父类为接口的目标入口类;并接着执行步骤s25。
[0132]
s25、确定目标入口类中的run方法为入口函数。接着执行步骤s26。
[0133]
s26、以入口函数为初始遍历函数,依次在函数节点列表中进行遍历。
[0134]
s27、针对当前遍历到的函数,获取从函数节点列表中,获取以当前遍历到的函数为调用函数的第一函数节点。
[0135]
s28、判断第一函数节点的被调用函数是否为空。若判断结果为否,执行步骤s29;若判断结果为是,执行步骤s218。
[0136]
s29、获取第一函数节点中的被调用函数。
[0137]
s210、判断第一函数节点中的被调用函数是否存在于已组装的函数调用链中。若不存在,执行步骤s211;若存在,第一函数节点的被调用函数不加入函数调用链,并执行步骤s214。
[0138]
s211、利用第一函数节点中的被调用函数在函数节点列表中查询。
[0139]
s212、判断函数节点列表是否存在以第一函数节点中的被调用函数为调用函数的第二函数节点。若判断结果为是,执行步骤s213;若判断结果为否,执行步骤s215。
[0140]
s213、将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数,递归加入已组装的函数调用链。接着执行步骤s214。
[0141]
s214、以第一函数节点中的被调用函数为新的当前遍历到的函数,并返回执行步骤s27。
[0142]
s215、利用第一函数节点中的被调用函数在当前遍历到的函数的父类包含的函数中进行查询。
[0143]
s216、判断当前遍历到的函数的父类包含的函数是否存在第一函数节点中的被调用函数。若判断结果为是,执行步骤s213。若判断结果为否,执行步骤s217。
[0144]
s217、将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数,递归加入已组装的函数调用链。并返回执行步骤s218。
[0145]
s218、结束函数调用链组装,并输出接口的函数调用链。
[0146]
由于上述接口的函数调用链是通过对静态的中间代码文件和配置文件解析得到的,因此,本技术实施例得到的函数调用链为静态函数调用链。静态函数调用链是指解析静态源代码或静态中间代码组装而成的函数调用链。因此,本技术实施例中在生成静态函数调用链的过程中,无需执行待测软件的更新后的源代码,可免去执行待测软件更新后的源代码的耗时,有助于加快函数调用链的生成速度,提高函数调用链的生成效率,进而有助于提高后续基于函数调用链,确定变更函数的测试接口的效率。
[0147]
在实际测试时,对于待测软件可只对变更函数进行测试,因此,为了实现精准测试,测试接口可为变更函数对应的接口。基于此,在本技术实施例步骤105中,可根据待测软件更新前后的源代码,确定待测软件的变更函数。在本技术实施例中,为了便于描述和区分,将待测软件更新后的源代码和更新前的源代码,分别定义为第一源代码和第二源代码。
[0148]
可选地,如图5所示,可对第一源代码和第二源代码分别以多线程方式进行解析,以得到第一源代码对应的第一抽象语法树(abstract syntax tree,ast)和第二源代码对应的第二抽象语法树(ast)。需要说明的是,在图5中,diff文件1-n为第一源代码和第二源代码对应的源代码文件。第一源代码和第二源代码对应的diff文件均可以为多个。多个是指2个或2个以上。在本技术实施例中,不限定第一源代码和第二源代码分别对应的源代码文件的具体数量。例如,第一源代码对应的源代码文件可为diff文件1至diff文件(n-x);第二源代码对应的源代码文件可为diff文件(n-x 1)至diff文件n。其中,0《x《(n-1),且n和x均为整数。相应地,上述对第一源代码和第二源代码分别以多线程方式进行解析,为可以多线程方式对第一源代码对应的多个源代码文件(diff文件)进行并行解析,得到多个抽象语法树,即第一抽象语法树;以及,可以多线程方式对第二源代码对应的多个源代码文件(diff文件)进行并行解析,得到多个抽象语法树,即第二抽象语法树。
[0149]
进一步,可比较第一抽象语法树和第二抽象语法树,以确定待测软件的变更函数。其中,变更函数包括:新增函数、删除函数及更新函数。
[0150]
在确定出待测软件的变更函数之后,在步骤106中,可根据接口列表中接口对应的函数调用链,从接口列表中确定变更函数对应的接口为待测软件的测试接口。具体地,可利用变更函数在接口对应的函数调用链中进行查询,以确定包含变更函数的目标函数调用链;进一步,确定目标函数调用链对应的接口为变更函数对应的接口,即测试接口。
[0151]
其中,变更函数包括:新增函数、删除函数及更新函数。对于删除函数来说,虽然该删除函数在更新后的待测软件中删除了,但是删除函数可能影响其它函数的运行,且删除函数所在函数调用链对应的接口是存在的,因此,在对待测软件进行测试时,也可根据删除函数对应的测试接口进行测试。在本技术实施例中,针对每个软件的测试接口,可关联相应的测试计划。对于每个测试计划可设置计划标识(id),用于唯一标识一个测试计划,并保存计划标识、软件的接口的调用函数链及软件的变更函数。基于此,在确定待测软件的测试接口时,如图6所示,可利用测试计划的标识(如图6中计划id)在存储的数据中进行查询(即图6所示的根据计划id判断数据是否存在);若查询到测试计划的标识对应的接口的调用函数链和变更函数(即图6所示的数据存在),可利用变更函数在接口对应的函数调用链中进行查询,以确定包含变更函数的目标函数调用链。确切地,可利用变更函数的函数名和类名在接口对应的函数调用链中进行匹配,确定包含变更函数的函数名和类名的函数调用链为目标函数调用链。进一步,确定目标函数调用链对应的接口为变更函数对应的接口;进一步,可存储待测软件的变更函数对应的接口,即待测软件的测试接口。可选地,还可将待测软件的接口推荐状态设置为成功状态,如可将推荐状态设置为1等。在本技术实施例中,在待测软件的测试接口确定过程中,可将待测软件的接口推荐状态设置为接口推荐中,如可将接口推荐状态设置为0。当然,若待测软件的测试接口确定失败,可将接口推荐状态设置为接口推荐失败,如可将接口推荐状态设置为2或3等等。
[0152]
其中,图6中的参数校验主要是指校验待测软件的名称、待测软件的源代码(更新前后的源代码)、待测软件的接口列表及测试计划的标识等信息是否为空。在参数校验均不空的情况下,确定参数校验成功。
[0153]
在本实施例中,由于函数调用链是通过对静态的中间代码文件和配置文件解析得到的,因此,本技术实施例得到的函数调用链为静态函数调用链。静态函数调用链是指解析
静态源代码或静态中间代码组装而成的函数调用链。因此,本技术实施例中在生成静态函数调用链的过程中,无需执行待测软件的更新后的源代码,可免去执行待测软件更新后的源代码的耗时,有助于加快函数调用链的生成速度,提高函数调用链的生成效率,进而有助于提高后续基于函数调用链,确定变更函数的测试接口的效率。
[0154]
在本技术实施例中,在确定出待测软件的测试接口之后,可根据测试接口,确定测试用例。例如,可根据测试接口在设定的测试接口与测试用例的对应关系中进行匹配,以得到测试接口对应的测试用例。进一步,可运行测试用例,以对变更函数进行测试,实现对待测软件的变更函数的自动化测试。
[0155]
在另一些实施例中,还可输出测试接口,以供测试人员基于测试接口选择测试用例。例如,可在显示屏上显示测试用例等。进一步,可响应于测试用例的执行操作,运行测试用例,以对变更函数进行测试,实现由测试人员自主选定测试用例。
[0156]
除了上述实施例提供的测试接口确定方法,本技术实施例还提供函数调用链生成方法,如图7所示,本技术实施例提供的函数调用链生成方法主要包括:
[0157]
701、获取目标代码的中间代码文件和配置文件。
[0158]
702、对多个中间代码文件进行解析,以得到目标代码的函数节点列表。
[0159]
703、对配置文件进行解析,以得到目标代码的接口列表。
[0160]
704、根据接口列表和函数节点列表,生成接口列表中接口的函数调用链。
[0161]
在本技术实施例中,目标代码可为任意编程语言的脚本代码。例如,目标代码为任意需要确定函数调用链的php语言脚本代码。在本实施例中,可通过对目标代码的配置文件和中间代码文件进行解析,得到目标代码的接口列表和函数节点列表;并根据目标代码的接口列表和函数节点列表,生成接口列表中接口的函数调用链。由于函数调用链是通过对静态的中间代码文件和配置文件解析得到的,因此,本技术实施例得到的函数调用链为静态函数调用链,在生成静态函数调用链时,无需执行待测软件的更新后的源代码,可免去执行待测软件更新后的源代码的耗时,有助于加快函数调用链的生成速度,提高函数调用链的生成效率。
[0162]
其中,关于步骤701-704的具体实施方式,请参见上述步骤101-步骤104的相关内容,在此不再赘述。
[0163]
需要说明的是,上述实施例所提供方法的各步骤的执行主体均可以是同一设备,或者,该方法也由不同设备作为执行主体。比如,步骤101和102的执行主体可以为设备a;又比如,步骤101的执行主体可以为设备a,步骤102的执行主体可以为设备b;等等。
[0164]
另外,在上述实施例及附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行,操作的序号如102、103等,仅仅是用于区分开各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。
[0165]
相应地,本技术实施例还提供一种存储有计算机指令的计算机可读存储介质,当计算机指令被一个或多个处理器执行时,致使一个或多个处理器执行上述测试接口确定方法和/或函数调用链生成方法中的步骤。
[0166]
图8为本技术实施例提供的计算设备的结构示意图。如图8所示,该计算设备包括:
包括:存储器80a和处理器80b;其中,存储器80a,用于存储计算机程序。
[0167]
处理器80b耦合至存储器80a,用于执行计算机程序以用于:获取待测软件更新后的第一源代码的配置文件和多个中间代码文件;对多个中间代码文件进行解析,以得到第一源代码的函数节点列表;并对配置文件进行解析,以得到第一源代码的接口列表;根据接口列表和函数节点列表,生成接口列表中接口的函数调用链;根据第一源代码和待测软件更新前的第二源代码,确定待测软件的变更函数;以及,根据接口列表中接口对应的函数调用链,从接口列表中确定变更函数对应的接口为待测软件的测试接口。
[0168]
在一些实施例中,处理器80b在对多个中间代码文件进行解析时,具体用于:针对多个中间代码文件中的每个中间代码文件,对中间代码文件进行解析,以确定中间代码文件包含的类定义的第一函数;根据中间代码文件中被调用函数的语言组织规则,确定第一函数调用的第二函数的函数名及第二函数的类;根据第一函数的函数名、第一函数的类、第二函数的函数名及第二函数的类,生成中间代码文件对应的函数节点;并利用多个中间代码文件对应的函数节点,构建函数节点列表。
[0169]
可选地,处理器80b在确定第一函数调用的第二函数的函数名及第二函数的类时,具体用于:根据中间代码文件中被调用函数的语言组织规则,确定第二函数的函数类型;根据中间代码文件中第二函数的函数类型对应的语言组织规则,确定第二函数的函数名和第二函数的类。
[0170]
在一些实施例中,处理器80b在确定第二函数的函数名及第二函数的类时,具体用于:从中间代码文件中,获取第二函数包含的操作数数量;并根据中间代码文件中第二函数的函数类型下的操作数数量对应的语言组织规则,确定第二函数的函数名和第二函数的类。
[0171]
在一些实施例中,第二函数的函数类型为静态函数;第二函数的操作数数量为双操作数。相应地,处理器80b在确定第二函数的函数名及第二函数的类时,具体用于:确定双操作数的第二个操作数为第二函数的函数名;根据双操作数的第一个操作数的格式,确定第二函数的类。
[0172]
进一步,处理器80b在确定第二函数的类时,具体用于:若双操作数的第一个操作数的格式为指定格式,根据双操作数所在代码行的前一代码行定义的类的类型,确定第二函数的类;若双操作数的第一个操作数的格式不是指定格式,确定第一个操作数为第二函数的类。
[0173]
可选地,处理器80b在根据双操作数所在代码行的前一代码行的格式确定第二函数的类时,具体用于:若双操作数所在代码行的前一代码行定义的类的类型为第一指定类型,确定第二函数的类为中间代码文件对应的当前类;若双操作数所在代码行的前一代码行的格式为第二指定类型,确定第二函数的类为当前类的父类。
[0174]
在另一些实施例中,第二函数的函数类型为静态函数;第二函数的操作数数量为单操作数。处理器80b在确定第二函数的函数名及第二函数的类时,具体用于:确定第二函数的函数名为构造函数;根据单操作数的操作数名的格式,确定第二函数的类。
[0175]
进一步,处理器80b在根据单操作数的操作数名的格式确定第二函数的类时,具体用于:若单操作数的操作数名的格式为指定格式,根据单操作数所在代码行的前一代码行定义的类的类型,确定第二函数的类;若单操作数的操作数名的格式不是指定格式,确定单
操作数的操作数名为第二函数的类。
[0176]
可选地,处理器80b在根据单操作数所在代码行的前一代码行定义的类的类型确定第二函数的类时,具体用于:若单操作数所在代码行的前一代码行定义的类的类型为第一指定类型,确定第二函数的类为中间代码文件对应的当前类;若单操作数所在代码行的前一代码行的格式为第二指定类型,确定第二函数的类为当前类的父类。
[0177]
在又一些实施例中,第二函数的函数类型为普通函数;第二函数的操作数数量为双操作数。相应地,处理器80b在确定第二函数的函数名及第二函数的类时,具体用于:根据双操作数所在代码行的前一代码行的操作类型,确定第二函数的函数名及第二函数的类。
[0178]
进一步,处理器80b在确定第二函数的函数名及第二函数的类时,具体用于:若双操作数所在代码行的前一代码行的操作类型为变量赋值操作,则确定双操作数的第二个操作数名为第二函数的函数名;通过变量赋值操作对应的变量名在中间代码文件中查找对变量名进行声明的变量声明操作行;根据变量声明操作行,定位第一函数的内部变量赋值操作行;通过内部变量赋值操作行对应的内部变量名,在中间代码文件中查询对内部变量名的初始化代码行;并确定初始化代码行的操作数名为第二函数的类名。
[0179]
可选地,处理器80b在根据双操作数所在代码行的前一代码行的操作类型,确定第二函数的函数名及第二函数的类时,具体用于:若双操作数所在代码行的前一代码行的操作类型不是变量赋值操作,确定双操作数的第二个操作数名为第二函数的函数名;在中间代码文件中查找内部变量赋值操作行;通过内部变量赋值操作行对应的内部变量名,在中间代码文件中查询对内部变量名进行初始化的第一初始化操作;并根据查询第一初始化操作的查询结果,确定第二函数的类。
[0180]
可选地,处理器80b在根据查询内部变量名的初始化代码行的查询结果,确定第二函数的类时,具体用于:若查询到第一初始化操作,调用执行初始化操作的工厂函数;确定工厂函数声明的类为第二函数的类。相应地,若未查询到第一初始化操作,利用内部变量名在中间代码文件查找对内部变量名进行初始化的第二初始化操作;确定第二初始化操作的操作数名为第二函数的类名。
[0181]
在再一些实施例中,第二函数的函数类型为普通函数;第二函数的操作数数量为单操作数。相应地,处理器80b在确定第二函数的函数名及第二函数的类时,具体用于:确定单操作数的操作数名为第二函数的函数名;并确定第二函数的类为中间代码文件对应的当前类。
[0182]
在本技术一些实施例中,处理器80b在对配置文件进行解析时,具体用于:获取配置文件中的虚拟主机设置模块;获取虚拟主机设置模块中的虚拟机主机域名;对虚拟主机设置模块进行解析,以获取第一源代码的接口的请求路径;对虚拟机主机域名和请求路径进行拼接,以得到第一源代码的接口列表中的接口。
[0183]
可选地,处理器80b在对虚拟主机设置模块进行解析时,具体用于:获取虚拟主机设置模块中的if语句;在if语句中存在包含$request_uri变量的目标if语句的情况下,根据目标if语句的条件记录的路径参数和$request_uri变量,确定接口的请求路径。
[0184]
在一些实施例中,处理器80b还用于:从配置文件中获取映射模块;映射模块记录有接口的请求路径的路径参数与参数值的对应关系。处理器80b在根据目标if语句的条件记录的路径参数和$request_uri变量,确定接口的请求路径时,具体用于:根据目标if语句
条件记录的路径参数,查询映射模块,以确定目标if语句的条件记录的路径参数对应的参数值;确定目标if语句的条件记录的路径参数对应的参数值,为接口的请求路径中位于目标if语句的条件记录的路径参数的下一路径参数;利用目标if语句的条件记录的路径参数对应的参数值,查询映射模块,以确定上述下一路径参数的参数值;其中,该下一路径参数的参数值为$request_uri变量对应的参数值;在$request_uri变量下存在子文件的情况下,拼接目标if语句的条件记录的路径参数对应的参数值、$request_uri变量对应的参数值及子文件的文件名,得到接口的请求路径。相应地,在$request_uri变量下不存在子文件的情况下,拼接目标if语句的条件记录的路径参数对应的参数值和$request_uri变量对应的参数值,得到接口的请求路径。
[0185]
可选地,处理器80b在对虚拟主机设置模块进行解析时,还用于:在if语句中不存在包含$request_uri变量的目标if语句的情况下,获取虚拟主机设置模块中的根路径;从虚拟主机设置模块中获取根路径下的文件名,作为接口的请求路径。
[0186]
在本技术实施例中,处理器80b还用于:根据第一源代码的接口的请求路径,确定接口列表中接口对应的入口类。处理器80b在根据接口列表和函数节点列表,生成接口的函数调用链时,具体用于:根据函数节点列表,确定接口对应的入口类包含的方法;根据入口类包含的方法,确定接口的入口函数;根据入口函数和函数节点列表,生成接口的函数调用链。
[0187]
可选地,处理器80b在根据入口类包含的方法,确定接口的入口函数时,具体用于:若入口类包含的方法存在入口run方法,确定入口run方法为入口函数。相应地,若入口类包含的方法不存在入口run方法,确定接口对应入口类的父类为接口的目标入口类;确定目标入口类中的run方法为入口函数。
[0188]
可选地,处理器80b根据入口函数和函数节点列表,生成接口的函数调用链时,具体用于:以入口函数为初始遍历函数,从函数节点列表中,获取以当前遍历到的函数为调用函数的第一函数节点;在第一函数节点存在被调用函数的情况下,将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数,递归加入接口的已组装的函数调用链;以当前遍历到的函数的被调用函数为新的调用函数并返回执行获取调用函数的第一函数节点的操作,直至第一函数节点无被调用函数,得到接口的函数调用链。
[0189]
可选地,处理器80b还用于:在将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数递归加入已组装的函数调用链之前,判断第一函数节点中的被调用函数是否存在于接口的已组装的函数调用链中;若判断结果为否,则将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数递归加入接口的已组装的函数调用链。
[0190]
可选地,处理器80b在将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数递归加入接口的已组装的函数调用链时,具体用于:利用第一函数节点中的被调用函数在函数节点列表中查询;若在函数节点列表中查询到以第一函数节点中的被调用函数为调用函数的第二函数节点,将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数,递归加入接口的已组装的函数调用链。
[0191]
可选地,处理器80b还用于:若在函数节点列表中未查询到第二函数节点,利用第一函数节点中的被调用函数,在当前遍历到的函数的父类包含的函数中进行查询;若在当前遍历到的函数的父类包含的函数中查询到第一函数节点中的被调用函数,将第一函数节
点中的被调用函数作为当前遍历到的函数的被调用函数递归加入接口的已组装的函数调用链。相应地,若在当前遍历到的函数的父类包含的函数中未查询到第一函数节点中的被调用函数,将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数,递归加入接口的已组装的函数调用链,并结束循环。
[0192]
在本技术一些实施例中,处理器80b在确定待测软件的变更函数时,具体用于:对第一源代码和第二源代码分别以多线程方式进行解析,以得到第一源代码对应的第一抽象语法树和第二源代码对应的第二抽象语法树;比较第一抽象语法树和第二抽象语法树,以确定待测软件的变更函数。
[0193]
可选地,处理器80b在确定变更函数对应的接口为待测软件的测试接口时,具体用于:利用变更函数在接口对应的函数调用链中进行查询,以确定包含变更函数的目标函数调用链;确定目标函数调用链对应的接口为变更函数对应的接口。
[0194]
进一步,处理器80b还用于:根据测试接口,确定测试用例;运行测试用例,以对变更函数进行测试;或者,输出测试接口,以供测试人员基于测试接口选择测试用例;响应于测试用例的执行操作,运行测试用例,以对变更函数进行测试。
[0195]
可选地,处理器80b在输出测试接口时,具体用于:通过显示组件80c展示测试接口;或者,通过通信组件80d将测试接口发送给客户端等等。
[0196]
在本技术实施例中,处理器80b还可以用于:获取目标代码的中间代码文件和配置文件;对中间代码文件进行解析,以得到目标代码的函数节点列表;对配置文件进行解析,以得到目标代码的接口列表;根据接口列表和函数节点列表,生成接口列表中接口的函数调用链。
[0197]
在一些可选实施方式中,如图8所示,该计算设备还可以包括:电源组件80e、音频组件80f等组件。图8中仅示意性给出部分组件,并不意味着计算设备必须包含图8所示全部组件,也不意味着计算设备只能包括图8所示组件。
[0198]
本实施例提供的计算设备,可通过对待测软件更新后的源代码的配置文件和中间代码文件进行解析,得到待测软件更新后的源代码的接口列表和函数节点列表;并根据待测软件更新后的源代码的接口列表和函数节点列表,生成接口列表中接口的函数调用链;后续,根据接口对应的函数调用链,确定待测软件的变更函数对应的接口为待测软件的测试接口。由于函数调用链是通过对静态的中间代码文件和配置文件解析得到的,因此,本技术实施例得到的函数调用链为静态函数调用链,在生成静态函数调用链的过程中,无需执行待测软件的更新后的源代码,可免去执行待测软件更新后的源代码的耗时,有助于加快函数调用链的生成速度,提高函数调用链的生成效率,进而有助于提高后续基于函数调用链,确定变更函数的测试接口的效率。
[0199]
在本技术实施例中,存储器用于存储计算机程序,并可被配置为存储其它各种数据以支持在其所在设备上的操作。其中,处理器可执行存储器中存储的计算机程序,以实现相应控制逻辑。存储器可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(sram),电可擦除可编程只读存储器(eeprom),可擦除可编程只读存储器(eprom),可编程只读存储器(prom),只读存储器(rom),磁存储器,快闪存储器,磁盘或光盘。
[0200]
在本技术实施例中,处理器可以为任意可执行上述方法逻辑的硬件处理设备。可
选地,处理器可以为中央处理器(central processing unit,cpu)、图形处理器(graphics processing unit,gpu)或微控制单元(microcontroller unit,mcu);也可以为现场可编程门阵列(field-programmable gate array,fpga)、可编程阵列逻辑器件(programmable array logic,pal)、通用阵列逻辑器件(general array logic,gal)、复杂可编程逻辑器件(complex programmable logic device,cpld)等可编程器件;或者为先进精简指令集(risc)处理器(advanced risc machines,arm)或系统芯片(system on chip,soc)等等,但不限于此。
[0201]
在本技术实施例中,通信组件被配置为便于其所在设备和其他设备之间有线或无线方式的通信。通信组件所在设备可以接入基于通信标准的无线网络,如wifi,2g或3g,4g,5g或它们的组合。在一个示例性实施例中,通信组件经由广播信道接收来自外部广播管理系统的广播信号或广播相关信息。在一个示例性实施例中,所述通信组件还可基于近场通信(nfc)技术、射频识别(rfid)技术、红外数据协会(irda)技术、超宽带(uwb)技术、蓝牙(bt)技术或其他技术来实现。
[0202]
在本技术实施例中,显示组件可以包括液晶显示器(lcd)和触摸面板(tp)。如果显示组件包括触摸面板,显示组件可以被实现为触摸屏,以接收来自用户的输入信号。触摸面板包括一个或多个触摸传感器以感测触摸、滑动和触摸面板上的手势。所述触摸传感器可以不仅感测触摸或滑动动作的边界,而且还检测与所述触摸或滑动操作相关的持续时间和压力。
[0203]
在本技术实施例中,电源组件被配置为其所在设备的各种组件提供电力。电源组件可以包括电源管理系统,一个或多个电源,及其他与为电源组件所在设备生成、管理和分配电力相关联的组件。
[0204]
在本技术实施例中,音频组件可被配置为输出和/或输入音频信号。例如,音频组件包括一个麦克风(mic),当音频组件所在设备处于操作模式,如呼叫模式、记录模式和语音识别模式时,麦克风被配置为接收外部音频信号。所接收的音频信号可以被进一步存储在存储器或经由通信组件发送。在一些实施例中,音频组件还包括一个扬声器,用于输出音频信号。例如,对于具有语言交互功能的设备,可通过音频组件实现与用户的语音交互等。
[0205]
图9为本技术实施例提供的测试接口确定装置的结构示意图。如图9所示,该测试接口确定装置包括:
[0206]
获取模块90a,用于获取待测软件更新后的第一源代码的配置文件和多个中间代码文件;
[0207]
解析模块90b,用于对所述多个中间代码文件进行解析,以得到所述第一源代码的函数节点列表;以及,对所述配置文件进行解析,以得到所述第一源代码的接口列表;
[0208]
生成模块90c,用于根据所述接口列表和所述函数节点列表,生成所述接口列表中接口的函数调用链;
[0209]
确定模块90d,用于根据所述第一源代码和所述待测软件更新前的第二源代码,确定所述待测软件的变更函数;并根据所述接口列表中接口对应的函数调用链,从所述接口列表中确定所述变更函数对应的接口为所述待测软件的测试接口。
[0210]
在一些实施例中,解析模块90b在对多个中间代码文件进行解析时,具体用于:针对多个中间代码文件中的每个中间代码文件,对中间代码文件进行解析,以确定中间代码
文件包含的类定义的第一函数;根据中间代码文件中被调用函数的语言组织规则,确定第一函数调用的第二函数的函数名及第二函数的类;根据第一函数的函数名、第一函数的类、第二函数的函数名及第二函数的类,生成中间代码文件对应的函数节点;并利用多个中间代码文件对应的函数节点,构建函数节点列表。
[0211]
可选地,解析模块90b在确定第一函数调用的第二函数的函数名及第二函数的类时,具体用于:根据中间代码文件中被调用函数的语言组织规则,确定第二函数的函数类型;根据中间代码文件中第二函数的函数类型对应的语言组织规则,确定第二函数的函数名和第二函数的类。
[0212]
在一些实施例中,解析模块90b在确定第二函数的函数名及第二函数的类时,具体用于:从中间代码文件中,获取第二函数包含的操作数数量;并根据中间代码文件中第二函数的函数类型下的操作数数量对应的语言组织规则,确定第二函数的函数名和第二函数的类。
[0213]
在一些实施例中,第二函数的函数类型为静态函数;第二函数的操作数数量为双操作数。相应地,解析模块90b在确定第二函数的函数名及第二函数的类时,具体用于:确定双操作数的第二个操作数为第二函数的函数名;根据双操作数的第一个操作数的格式,确定第二函数的类。
[0214]
进一步,解析模块90b在确定第二函数的类时,具体用于:若双操作数的第一个操作数的格式为指定格式,根据双操作数所在代码行的前一代码行定义的类的类型,确定第二函数的类;若双操作数的第一个操作数的格式不是指定格式,确定第一个操作数为第二函数的类。
[0215]
可选地,解析模块90b在根据双操作数所在代码行的前一代码行的格式确定第二函数的类时,具体用于:若双操作数所在代码行的前一代码行定义的类的类型为第一指定类型,确定第二函数的类为中间代码文件对应的当前类;若双操作数所在代码行的前一代码行的格式为第二指定类型,确定第二函数的类为当前类的父类。
[0216]
在另一些实施例中,第二函数的函数类型为静态函数;第二函数的操作数数量为单操作数。解析模块90b在确定第二函数的函数名及第二函数的类时,具体用于:确定第二函数的函数名为构造函数;根据单操作数的操作数名的格式,确定第二函数的类。
[0217]
进一步,解析模块90b在根据单操作数的操作数名的格式确定第二函数的类时,具体用于:若单操作数的操作数名的格式为指定格式,根据单操作数所在代码行的前一代码行定义的类的类型,确定第二函数的类;若单操作数的操作数名的格式不是指定格式,确定单操作数的操作数名为第二函数的类。
[0218]
可选地,解析模块90b在根据单操作数所在代码行的前一代码行定义的类的类型确定第二函数的类时,具体用于:若单操作数所在代码行的前一代码行定义的类的类型为第一指定类型,确定第二函数的类为中间代码文件对应的当前类;若单操作数所在代码行的前一代码行的格式为第二指定类型,确定第二函数的类为当前类的父类。
[0219]
在又一些实施例中,第二函数的函数类型为普通函数;第二函数的操作数数量为双操作数。相应地,解析模块90b在确定第二函数的函数名及第二函数的类时,具体用于:根据双操作数所在代码行的前一代码行的操作类型,确定第二函数的函数名及第二函数的类。
[0220]
进一步,解析模块90b在确定第二函数的函数名及第二函数的类时,具体用于:若双操作数所在代码行的前一代码行的操作类型为变量赋值操作,则确定双操作数的第二个操作数名为第二函数的函数名;通过变量赋值操作对应的变量名在中间代码文件中查找对变量名进行声明的变量声明操作行;根据变量声明操作行,定位第一函数的内部变量赋值操作行;通过内部变量赋值操作行对应的内部变量名,在中间代码文件中查询对内部变量名的初始化代码行;并确定初始化代码行的操作数名为第二函数的类名。
[0221]
可选地,解析模块90b在根据双操作数所在代码行的前一代码行的操作类型,确定第二函数的函数名及第二函数的类时,具体用于:若双操作数所在代码行的前一代码行的操作类型不是变量赋值操作,确定双操作数的第二个操作数名为第二函数的函数名;在中间代码文件中查找内部变量赋值操作行;通过内部变量赋值操作行对应的内部变量名,在中间代码文件中查询对内部变量名进行初始化的第一初始化操作;并根据查询第一初始化操作的查询结果,确定第二函数的类。
[0222]
可选地,解析模块90b在根据查询内部变量名的初始化代码行的查询结果,确定第二函数的类时,具体用于:若查询到第一初始化操作,调用执行初始化操作的工厂函数;确定工厂函数声明的类为第二函数的类。相应地,若未查询到第一初始化操作,利用内部变量名在中间代码文件查找对内部变量名进行初始化的第二初始化操作;确定第二初始化操作的操作数名为第二函数的类名。
[0223]
在再一些实施例中,第二函数的函数类型为普通函数;第二函数的操作数数量为单操作数。相应地,解析模块90b在确定第二函数的函数名及第二函数的类时,具体用于:确定单操作数的操作数名为第二函数的函数名;并确定第二函数的类为中间代码文件对应的当前类。
[0224]
在本技术一些实施例中,解析模块90b在对配置文件进行解析时,具体用于:获取配置文件中的虚拟主机设置模块;获取虚拟主机设置模块中的虚拟机主机域名;对虚拟主机设置模块进行解析,以获取第一源代码的接口的请求路径;对虚拟机主机域名和请求路径进行拼接,以得到第一源代码的接口列表中的接口。
[0225]
可选地,解析模块90b在对虚拟主机设置模块进行解析时,具体用于:获取虚拟主机设置模块中的if语句;在if语句中存在包含$request_uri变量的目标if语句的情况下,根据目标if语句的条件记录的路径参数和$request_uri变量,确定接口的请求路径。
[0226]
在一些实施例中,解析模块90b还用于:从配置文件中获取映射模块;映射模块记录有接口的请求路径的路径参数与参数值的对应关系。解析模块90b在根据目标if语句的条件记录的路径参数和$request_uri变量,确定接口的请求路径时,具体用于:根据目标if语句条件记录的路径参数,查询映射模块,以确定目标if语句的条件记录的路径参数对应的参数值;确定目标if语句的条件记录的路径参数对应的参数值,为接口的请求路径中位于目标if语句的条件记录的路径参数的下一路径参数;利用目标if语句的条件记录的路径参数对应的参数值,查询映射模块,以确定上述下一路径参数的参数值;其中,该下一路径参数的参数值为$request_uri变量对应的参数值;在$request_uri变量下存在子文件的情况下,拼接目标if语句的条件记录的路径参数对应的参数值、$request_uri变量对应的参数值及子文件的文件名,得到接口的请求路径。相应地,在$request_uri变量下不存在子文件的情况下,拼接目标if语句的条件记录的路径参数对应的参数值和$request_uri变量对
应的参数值,得到接口的请求路径。
[0227]
可选地,解析模块90b在对虚拟主机设置模块进行解析时,还用于:在if语句中不存在包含$request_uri变量的目标if语句的情况下,获取虚拟主机设置模块中的根路径;从虚拟主机设置模块中获取根路径下的文件名,作为接口的请求路径。
[0228]
在本技术实施例中,确定模块90d还用于:根据接口的请求路径,确定接口列表中接口对应的入口类。生成模块90c在根据接口列表和函数节点列表,生成接口的函数调用链时,具体用于:根据函数节点列表,确定接口对应的入口类包含的方法;根据入口类包含的方法,确定接口的入口函数;根据入口函数和函数节点列表,生成接口的函数调用链。
[0229]
可选地,生成模块90c在根据入口类包含的方法,确定接口的入口函数时,具体用于:若入口类包含的方法存在入口run方法,确定入口run方法为入口函数。相应地,若入口类包含的方法不存在入口run方法,确定接口对应入口类的父类为接口的目标入口类;确定目标入口类中的run方法为入口函数。
[0230]
可选地,生成模块90c在根据入口函数和函数节点列表,生成接口的函数调用链时,具体用于:以入口函数为初始遍历函数,从函数节点列表中,获取以当前遍历到的函数为调用函数的第一函数节点;在第一函数节点存在被调用函数的情况下,将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数,递归加入已组装的函数调用链;以当前遍历到的函数的被调用函数为新的调用函数并返回执行获取调用函数的第一函数节点的操作,直至第一函数节点无被调用函数,得到接口的函数调用链。
[0231]
可选地,生成模块90c还用于:在将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数递归加入已组装的函数调用链之前,判断第一函数节点中的被调用函数是否存在于已组装的函数调用链中;若判断结果为否,则将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数递归加入接口的已组装的函数调用链。
[0232]
可选地,生成模块90c在将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数递归加入已组装的函数调用链时,具体用于:利用第一函数节点中的被调用函数在函数节点列表中查询;若在函数节点列表中查询到以第一函数节点中的被调用函数为调用函数的第二函数节点,将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数,递归加入接口的已组装的函数调用链。
[0233]
可选地,生成模块90c还用于:若在函数节点列表中未查询到第二函数节点,利用第一函数节点中的被调用函数,在当前遍历到的函数的父类包含的函数中进行查询;若在当前遍历到的函数的父类包含的函数中查询到第一函数节点中的被调用函数,将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数递归加入已组装的函数调用链。相应地,若在当前遍历到的函数的父类包含的函数中未查询到第一函数节点中的被调用函数,将第一函数节点中的被调用函数作为当前遍历到的函数的被调用函数,递归加入接口的已组装的函数调用链,并结束循环。
[0234]
在本技术一些实施例中,确定模块90d在确定待测软件的变更函数时,具体用于:对第一源代码和第二源代码分别以多线程方式进行解析,以得到第一源代码对应的第一抽象语法树和第二源代码对应的第二抽象语法树;比较第一抽象语法树和第二抽象语法树,以确定待测软件的变更函数。
[0235]
可选地,确定模块90d在确定变更函数对应的接口为待测软件的测试接口时,具体
用于:利用变更函数在接口对应的函数调用链中进行查询,以确定包含变更函数的目标函数调用链;确定目标函数调用链对应的接口为变更函数对应的接口。
[0236]
进一步,确定模块90d还用于:根据测试接口,确定测试用例。在一些实施例中,测试接口确定装置还包括:运行模块90e和/或输出模块90f。其中,运行模块90e用于运行测试用例,以对变更函数进行测试。输出模块90f用于输出测试接口,以供测试人员基于测试接口选择测试用例。相应地,运行模块90e响应于测试用例的执行操作,运行测试用例,以对变更函数进行测试。
[0237]
可选地,输出模块90f在输出测试接口时,具体用于:通过显示组件展示测试接口;或者,通过通信组件将测试接口发送给客户端等等。
[0238]
本实施例提供的测试接口确定装置,可通过对待测软件更新后的源代码的配置文件和中间代码文件进行解析,得到待测软件更新后的源代码的接口列表和函数节点列表;并根据待测软件更新后的源代码的接口列表和函数节点列表,生成接口列表中接口的函数调用链;后续,根据接口对应的函数调用链,确定待测软件的变更函数对应的接口为待测软件的测试接口。由于函数调用链是通过对静态的中间代码文件和配置文件解析得到的,因此,本技术实施例得到的函数调用链为静态函数调用链,在生成静态函数调用链的过程中,无需执行待测软件的更新后的源代码,可免去执行待测软件更新后的源代码的耗时,有助于加快函数调用链的生成速度,提高函数调用链的生成效率,进而有助于提高后续基于函数调用链,确定变更函数的测试接口的效率。
[0239]
图10为本技术实施例提供的函数调用链生成装置。如图10所示,函数调用链生成装置包括:
[0240]
获取模块100a,用于获取目标代码的中间代码文件和配置文件;
[0241]
解析模块100b,用于对所述中间代码文件进行解析,以得到所述目标代码的函数节点列表;以及,对所述配置文件进行解析,以得到所述目标代码的接口列表;
[0242]
生成模块100c,用于根据所述接口列表和所述函数节点列表,生成所述接口列表中接口的函数调用链。
[0243]
其中,关于解析模块100b对中间代码文件进行解析的具体实施方式,可参见上述图9中解析模块90b对中间代码文件进行解析的相关内容,在此不再赘述。生成模块100c生成接口列表中接口的函数调用链的具体实施方式,可参见上述生成模块90c生成接口列表中接口的函数调用链的相关内容,在此不再赘述。
[0244]
本实施例提供的函数调用链生成装置,可通过对目标代码的配置文件和中间代码文件进行解析,得到目标代码的接口列表和函数节点列表;并根据目标代码的接口列表和函数节点列表,生成接口列表中接口的函数调用链。由于函数调用链是通过对静态的中间代码文件和配置文件解析得到的,因此,本技术实施例得到的函数调用链为静态函数调用链,在生成静态函数调用链时,无需执行待测软件的更新后的源代码,可免去执行待测软件更新后的源代码的耗时,有助于加快函数调用链的生成速度,提高函数调用链的生成效率。
[0245]
需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的消息、设备、模块等,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。
[0246]
本领域内的技术人员应明白,本技术的实施例可提供为方法、系统、或计算机程序产品。因此,本技术可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实
施例的形式。而且,本技术可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
[0247]
本技术是参照根据本技术实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0248]
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0249]
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0250]
在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
[0251]
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
[0252]
计算机的存储介质为可读存储介质,也可称为可读介质。可读存储介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0253]
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
[0254]
以上所述仅为本技术的实施例而已,并不用于限制本技术。对于本领域技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本技术的权利要求范围之内。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献