代码测试方法、存储介质、电子设备和装置转让专利

申请号 : CN202211670900.8

文献号 : CN115658551B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 申苏鲁温健

申请人 : 海马云(天津)信息技术有限公司

摘要 :

本申请提供了一种代码测试方法、存储介质、电子设备和装置,可应用于互联网程序的高效测试,方法包括:在程序B的第二执行时,根据程序B中方法F1与程序A中对应代码块的相关关系,确定方法F1对应的代码块标识;根据程序B内方法所对应的探针在测试运行过程中执行情况,生成报告P2;所述报告P2根据代码块标识区分程序B内方法的执行情况;程序B与程序A修改后的源码对应。上述方法可以使测试人员分析测试结果的效率更高。

权利要求 :

1.一种代码测试方法,其特征在于,包括:

在程序B的第二执行时,根据程序B中方法F1与程序A中对应代码块的相关关系,确定方法F1对应的代码块标识;

根据程序B内方法所对应的探针在测试运行过程中执行情况,生成报告P2;

所述报告P2根据代码块标识区分程序B内方法的执行情况;

程序B与程序A修改后的源码对应;

所述根据程序B中方法F1与程序A中对应代码块的相关关系,确定方法F1对应的代码块标识包括步骤:根据第一执行时程序A中与方法F1具有相同路径的方法所对应的代码块标识作为程序B中方法F1的代码块标识;

所述路径指由包名、类名和方法名构成的路径。

2.根据权利要求1所述的方法,其特征在于,所述根据程序B中方法F1与程序A中对应代码块的相关关系,确定方法F1对应的代码块标识包括步骤:若无法根据方法F1的路径确定方法F1的代码块标识码,则查找第二执行时方法F1中的代码字符与第一执行时代码字符的相似度最高的方法F2,确定方法F2的代码块标识作为方法F1的代码块标识码。

3.根据权利要求1所述的方法,其特征在于,所述根据程序B内方法所对应的探针在测试运行过程中执行情况,生成报告P2包括步骤:根据程序结构划分最小可运行单元,在程序B中根据最小可运行单元插入探针代码,在程序B测试时,根据探针代码的执行情况,以及根据代码块标识对应的探针关系生成基于方法统计的执行情况表,所述执行情况表用于生成报告P2。

4.根据权利要求1所述的方法,其特征在于,所述代码块标识是用于区分不同方法的字符串,代码块标识以方法路径的哈希值作为代码块标识,或代码块标识以方法中的代码的哈希值作为代码块标识。

5.根据权利要求1所述的方法,其特征在于,所述代码块标识是用于区分不同方法的字符串,代码块标识以方法路径的MD5作为代码块标识,或以方法的代码的MD5作为代码块标识。

6.根据权利要求1所述的方法,其特征在于,包括步骤:在程序A第一执行时,根据方法的路径确定方法所对应的代码块标识;根据程序A内方法所对应的探针在测试运行过程中的执行情况,生成报告P1;所述报告P1根据代码块标识区分程序A内方法的执行情况;

根据报告P2和报告P1,合并具有相同代码块标识的方法的执行情况,生成报告P3。

7.根据权利要求1所述的方法,其特征在于,还包括:在Java虚拟机JVM中通过javaagent参数为待测试的目标程序指定启动代理程序;

在第一执行时,目标程序是程序A;

在第二执行时,目标程序是程序B;

代理程序通过Class Loader在JVM装载class文件之前将探针代码插入目标程序的class文件;

在测试目标程序时,根据探针代码的执行情况,以及根据代码块标识对应的探针关系生成基于方法统计的执行情况报告;

所述将探针代码插入目标程序的class文件,包括步骤:

根据程序结构划分最小可运行单元,在目标程序中根据最小可运行单元的划分插入探针代码。

8.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序执行权利要求1至7任一项权利要求所述的代码测试方法的步骤。

9.一种电子设备,其特征在于,包括:处理器、存储介质和总线,所述存储介质存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储介质之间通过总线通信,所述处理器执行所述机器可读指令,以执行权利要求1至7任一项权利要求所述的代码测试方法中的步骤。

10.一种代码测试装置,其特征在于,包括:

标识确认模块,用于在程序B的第二执行时,根据程序B中方法F1与程序A中对应代码块的相关关系,确定方法F1对应的代码块标识;其中,根据第一执行时程序A中与方法F1具有相同路径的方法所对应的代码块标识作为程序B中方法F1的代码块标识;

所述路径指由包名、类名和方法名构成的路径;

报告生成模块,用于根据程序B内方法所对应的探针在测试运行过程中执行情况,生成报告P2;

所述报告P2根据代码块标识区分程序B内方法的执行情况;

程序B与程序A修改后的源码对应。

说明书 :

代码测试方法、存储介质、电子设备和装置

技术领域

[0001] 本申请涉及互联网技术领域,具体涉及互联网应用程序开发过程中的代码测试方法、存储介质、电子设备和装置。

背景技术

[0002] 随着互联网云计算技术的发展,对互联网软件开发的效率提出了更高的要求,提高工作效率的前提条件是所有工作成果的质量必须合格,而保证代码开发质量合格的关键就是软件测试。软件测试,描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。软件测试同时存在着使用人工操作或者软件自动运行的方式来检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。现有的软件测试工具已经很多,然而,软件开发并非是一个静态的过程,在开发过程中,软件代码会发生多个版本的修改,开发也是以增量的方式推进。然而,现有的测试工具在测试代码时,只是针对测试目标程序进行测试以及生成测试报告,导致研发人员在看测试报告时,需要重新在修改后的测试目标程序中重新寻找目标代码块,然后根据目标代码块的路径在测试报告中查找对应代码块的执行情况,这导致研发人员如果试图根据第二份测试报告发现或核对代码问题或测试问题,是很费时的。

发明内容

[0003] 上述发明内容相关记载仅是本申请技术方案的概述,为了让本领域普通技术人员能够更清楚地了解本申请的技术方案,进而可以依据说明书的文字及附图记载的内容予以实施,并且为了让本申请的上述目的及其它目的、特征和优点能够更易于理解,以下结合本申请的具体实施方式及附图进行说明。
[0004] 第一方面,本发明提供一种代码测试方法,包括:
[0005] 在程序B的第二执行时,根据程序B中方法F1与程序A中对应代码块的相关关系,确定方法F1对应的代码块标识;
[0006] 根据程序B内方法所对应的探针在测试运行过程中执行情况,生成报告P2;
[0007] 所述报告P2根据代码块标识区分程序B内方法的执行情况;
[0008] 程序B与程序A修改后的源码对应。
[0009] 第二方面,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序用于执行前述第一方面所述的代码测试方法的步骤。
[0010] 第三方面,本发明还提供一种电子设备,包括:处理器、存储介质和总线,所述存储介质存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储介质之间通过总线通信,所述处理器执行所述机器可读指令,以执行前述第一方面所述的代码测试方法的步骤。
[0011] 第四方面,本发明还提供一种代码测试装置,包括:
[0012] 标识确认模块,用于在程序B的第二执行时,根据程序B中方法F1与程序A中对应代码块的相关关系,确定方法F1对应的代码块标识;
[0013] 报告生成模块,用于根据程序B内方法所对应的探针在测试运行过程中执行情况,生成报告P2;
[0014] 所述报告P2根据代码块标识区分程序B内方法的执行情况;
[0015] 程序B与程序A修改后的源码对应。
[0016] 本申请提供了一种测试工具,用于对代码迭代修改后,延续测试任务的可读性。即虽然程序A的代码已经修改了,但本文公开的方案中在第二次测试时,通过识别修改后的代码与修改前的代码的关系,从而对于程序中的同一个方法(版本迭代前后有修改),在第二次测试时仍然尽可能的沿用相同的代码块标识,相比于现有技术每次测试即重新生成一份测试报告,需要依靠路径名查询相应代码块的测试情况,本方案尽可能减少测试工作者或研发人员在看前后两份测试报告时,需要反复比对测试报告时的时间消耗,本申请在第二次测试时尽可能与第一次测试时的报告的内容保持一致,从而在第一次测试代码执行并分析测试报告之后,测试人员或研发人员能够更快的定位第二次测试报告中目标代码块的测试结果。

附图说明

[0017] 附图仅用于示出本申请具体实施方式以及其他相关内容的原理、实现方式、应用、特点以及效果等,并不能认为是对本申请的限制。
[0018] 在说明书附图中:
[0019] 图1本申请的一个实施例的流程图;
[0020] 图2a本申请的一个实施例中的一段代码修改迭中的原始码示意图;
[0021] 图2b本申请的一个实施例中的一段代码修改迭中的修改后的代码示意图;
[0022] 图3a现有技术中串行的程序控制结构;
[0023] 图3b 现有技术中goto程序控制结构;
[0024] 图3c 现有技术中if控制结构;
[0025] 图3d 现有技术中return控制结构;
[0026] 图4a本申请的一个实施例中对应于图3a的探针插入位置示意图
[0027] 图4b 本申请的一个实施例中对应于图3b的探针插入位置示意图;
[0028] 图4c 本申请的一个实施例中对应于图3c的探针插入位置示意图;
[0029] 图4d 本申请的一个实施例中对应于图3d的探针插入位置示意图;
[0030] 图5a 本申请的一个实施例中的探针插入后的一段程序示意图;
[0031] 图5b 本申请的一个实施例中记录探针执行情况的执行表;
[0032] 图6 本申请对应的一种电子设备。

具体实施方式

[0033] 为详细说明本申请可能的应用场景,技术原理,可实施的具体方案,能实现目的与效果等,以下结合所列举的具体实施例并配合附图详予说明。本文所记载的实施例仅用于更加清楚地说明本申请的技术方案,因此只作为示例,而不能以此来限制本申请的保护范围。
[0034] 在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中各个位置出现的“实施例”一词并不一定指代相同的实施例,亦不特别限定其与其它实施例之间的独立性或关联性。原则上,在本申请中,只要不存在技术矛盾或冲突,各实施例中所提到的各项技术特征均可以以任意方式进行组合,以形成相应的可实施的技术方案。
[0035] 除非另有定义,本文所使用的技术术语的含义与本申请所属技术领域的技术人员通常理解的含义相同;本文中对相关术语的使用只是为了描述具体的实施例,而不是旨在限制本申请。
[0036] 在本申请的描述中,用语“和/或”是一种用于描述对象之间逻辑关系的表述,表示可以存在三种关系,例如A和/或B,表示:存在A,存在B,以及同时存在A和B这三种情况。另外,本文中字符“/”一般表示前后关联对象是一种“或”的逻辑关系。
[0037] 在本申请中,诸如“第一”和“第二”之类的用语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何实际的数量、主次或顺序等关系。
[0038] 在没有更多限制的情况下,在本申请中,语句中所使用的“包括”、“包含”、“具有”或者其他类似的开放式表述,意在涵盖非排他性的包含,这些表述并不排除在包括所述要素的过程、方法或者产品中还可以存在另外的要素,从而使得包括一系列要素的过程、方法或者产品中不仅可以包括那些限定的要素,而且还可以包括没有明确列出的其他要素,或者还包括为这种过程、方法或者产品所固有的要素。
[0039] 与《审查指南》中的理解相同,在本申请中,“大于”、“小于”、“超过”等表述理解为不包括本数;“以上”、“以下”、“以内”等表述理解为包括本数。此外,在本申请实施例的描述中“多个”的含义是两个以上(包括两个),与之类似的与“多”相关的表述亦做此类理解,例如“多组”、“多次”等,除非另有明确具体的限定。
[0040] 第一方面,如图1所示,本文中公开一种程序测试方法,包括步骤:
[0041] S1、在程序B的第二执行时,根据方法F1与程序A中对应代码块的相关关系,确定方法F1对应的代码块标识;
[0042] S2、根据程序B内方法所对应的探针在测试运行过程中执行情况,生成报告P2;
[0043] 所述报告P2根据代码块标识区分程序B内方法的执行情况;
[0044] 程序B与程序A修改后的源码对应,图2a和图2b示出了一种代码修改方式,其中图2a相对于图2b是原始修改前的代码,图2b是修改后的代码,发生修改的行用箭头标识。在一些实施例中也可能是方法名发生改变(删除、替换、重命名等)。
[0045] 在一个实施例中,上述方法是在一个完整测试过程中的部分步骤,完整的测试过程包括:
[0046] 在Java虚拟机JVM中通过javaagent参数为待测试的目标程序指定启动代理程序;
[0047] 在第一执行时,测试目标程序是程序A,第一执行代指程序A的某一次执行;代理程序通过Class Loader在JVM装载class文件之前将探针代码插入测试目标程序的class文件,探针代码插入测试目标程序的具体方法是根据程序结构划分最小可运行单元,在测试目标程序中的最小可运行单元中插入探针代码;在测试目标程序A测试时,根据探针代码的执行情况,以及根据代码块标识对应的探针关系生成基于方法统计的执行情况报告。
[0048] 在第二执行时,测试目标程序是程序B,第二执行代指程序B的某一次执行,程序B与程序A修改后的源码对应。代理程序通过Class Loader在JVM装载class文件之前将探针代码插入测试目标程序的class文件,探针代码插入测试目标程序的具体方法是根据程序结构划分最小可运行单元,在测试目标程序中的最小可运行单元中插入探针代码;在测试目标程序B测试时,根据方法F1与程序A中对应代码块的相关关系,确定方法F1对应的代码块标识;根据程序B内方法所对应的探针在测试运行过程中执行情况,生成报告P2;所述报告P2根据代码块标识区分程序B内方法的执行情况。本领域技术人员可知第二执行时晚于第一执行的。
[0049] 程序B中方法F1的代码块是程序A中某一代码块A1的修改后的版本,程序B中方法F1的代码块与程序A中代码块A1是对应关系,在第一执行时,代码块A1的代码块标识确定为程序B中方法F1的代码块标识。
[0050] 最小可运行单元是根据程序结构(或称为控制结构)划分确定的,图3a‑图3d分别示意了几种常见的程序结构,图4a‑图4b分别是根据图3a‑图3d所示的控制结构,解释分别对应于图3a‑图3d的控制结构的最小可运行单元以及探针代码的插入位置,图中的INSN x 表示单个程序指令,next、target 表示的是下一条语句,goto、if、next、return 是程序语言的关键字,P表示探针插入位置。如图3a指令串行的程序结构,最小可运行单元为单个语句,探针插入位置为两个单个语句之间,如图4a所示。对于goto程序结构如图3b所示,作为无条件跳转的程序结构,整体作为一个最小可运行单元,探针插入的位置在goto之前,如图4b所示。对于如图3c所示if结构的程序,就比较复杂,可以将其转化为如图4c所示的等效程序结构,在此not if 条件判断和next构成最小可运行单元,goto和target构成最小可运行单元,探针P插在这两个最小可运行单元之间。可以理解,在上述实施例中最小可运行单元是为了识别插入探针位置而做出的定义,在实际计算插入探针P的过程可以是递归分析程序中的代码块之间的程序结构,再递归分析代码块内的控制结构并根据控制结构插入探针,若探针代码被执行,则表示相应的最小可运行单元被执行。
[0051] 探针代码是一段不改变程序运行的代码,在一些实施例中,探针代码可以是为探针数组赋值的代码语句,若执行了探针代码,则对应的探针数组中的元素将被赋值为true(真值)。如图5a所示的一段已插入探针的代码,其中var1是探针数组,var1[5]=true是探针代码,若执行后探针数组var1的部分值如图5b所示,则探针代表对应jf的条件为真对应的代码片段未被执行,而另一分支(else分支)被执行。
[0052] 对于如图5a所示的eat()方法,其也被称为是函数,在本文中路径指的是函数路径,通常包含package(包名)和类名以及方法名。在同一个程序中通过路径可以唯一确认方法。
[0053] 在第二执行时,根据方法F1与程序A中对应代码块的相关关系,确定方法F1对应的代码块标识;根据程序B内方法所对应的探针在测试运行过程中执行情况,生成报告P2;所述报告P2根据代码块标识区分程序B内方法的执行情况。在一些实施例中eat方法的探针执行情况通过执行表(execution表)记录,execution表如图5b所示(未示出与代码块标识的关系),索引对应于探针数组的下标,执行对应于探针的执行情况。方法F1内所插入的探针可以通过统计已插入探针的class文件获得;通过比较第一执行时代码块A1的和第二执行时程序B中方法F1的代码,可以获得探针的变化表(different表),如图6所示,其表示5、6、7探针处都为执行,仅执行了8处的探针;最终,根据变化表和执行表生成报告P2。
[0054] 通过上述方法中,本文提供了一种测试工具,用于对代码迭代修改后,延续测试任务的可读性。即虽然程序A的代码已经修改了,但本文公开的方案中在第二次测试时,通过识别修改后的代码与修改前的代码的关系,从而对于程序中的同一个方法(版本迭代前后有修改),在第二次测试时仍然尽可能的沿用相同的代码块标识,相比于现有技术每次测试即重新生成一份测试报告,需要依靠路径名查询相应代码块的测试情况(特别是在方法改名前后需要核对该方法的测试结果时,测试人员通常不了解具体的代码的修改位置,无法获知哪些代码修改了,这会导致在评估测试结果时,由于测试人员不认识前后两个是相同的方法,可能只是名称不同—而导致在分析测试结果时,将前后两个版本的方法统计为删除方法和新增方法,或者导致在核对测试结果时,由于找不到目标方法的测试结果,而错误分析测试结果),本方案尽可能减少测试工作者或研发人员在看前后两份测试报告时,需要反复比对测试报告时的时间消耗,本申请在第二次测试时尽可能与第一次测试时的报告的内容保持一致,从而在第一次测试代码执行并分析测试报告之后,测试人员或研发人员能够更快的定位第二次测试报告中目标代码块的测试结果。
[0055] 在一个实施例中,“根据方法F1与第一执行时对应代码块的相关关系,确定方法F1对应的代码块标识”具体包括:
[0056] 根据第一执行时程序A中与方法F1具有相同路径的方法所对应的代码块标识作为程序B中方法F1的代码块标识;
[0057] 若无法根据方法F1的路径确定方法F1的代码块标识码,则查找第二执行时方法F1中的代码字符与第一执行时代码字符的相似度最高的方法F2,确定方法F2的代码块标识作为方法F1的代码块标识码。
[0058] 相当于将程序中的方法作为最小的代码块进行统计,根据代码块的方法的路径区分方法。在一个实施例中路径相同指的是包名、类名、方法名均相同。当方法名修改而导致路径改变时,可以根据方法内的代码字符串作为识别方法的依据,即根据方法内代码的相似度判断是否属于同一方法,可以理解的是以上步骤是有顺序的。
[0059] 在一个实施例中,“根据程序B内方法所对应的探针在测试运行过程中执行情况,生成报告P2”包括步骤:
[0060] 根据程序结构划分最小可运行单元,在程序B中根据最小可运行单元插入探针代码,在程序B测试时,根据探针代码的执行情况,以及根据代码块标识对应的探针关系生成基于方法统计的执行情况报告。
[0061] 在一些实施例中,程序控制结构,如图3a‑图3d,插入探针的方式如图4a‑图4d,在此不再赘述。最小可运行单元需结合控制结构进行解释,上文已对此进行说明,此处不再赘述。
[0062] 可以理解的是探针的插入方式可以是如图4a‑图4d所示的方式,也可以是其他方式,例如仅在方法的入口插入探针,或者方法的函数结尾处插入探针,以及在看到本申请后,本领域技术人员可以想到的其他等效方式,都属于所述的在程序B中的最小可运行单元中插入探针代码的描述范围之内。
[0063] 通过控制结构细化插入探针的方式,使得对于程序运行的测试的粒度可以精确到最小可运行单元,使得测试的精细化和统计结果的细化,测试人员可通过分析最小可运行单元的执行情况对代码作出更准确的测试结果分析。
[0064] 代码块标识是用于区分不同方法的字符串,在一些实施例中,以方法路径的哈希值作为代码块标识,或以方法的代码的哈希值作为代码块标识。
[0065] 代码块标识是用于区分不同方法的字符串,以方法路径的MD5作为代码块标识,或以方法的代码的MD5作为代码块标识。
[0066] 可以理解的是也可以用其他方式生成唯一标识来区分方法,例如使用CRC64算法生成代码块标识。
[0067] 在一些实施例中,基于上述的方法,还包括基于第一执行和第二执行生成的报告P1和P2生成代码测试覆盖率报告P3。在程序A第一执行时,根据方法的路径确定方法所对应的代码块标识;根据程序A内方法所对应的探针在测试运行过程中执行情况,生成报告P1;所述报告P1根据代码块标识区分程序A内方法的执行情况;
[0068] 根据第二执行时生成报告P2和报告P1,合并具有相同代码块标识的方法的执行情况,生成报告P3,从而评估代码覆盖率。在一些实施例中,具体包括以下步骤:生成报告P1的过程中,包括生成方法、方法路径、代码块标识、探针执行情况表等数据,这些数据可以是存在报告P1中也可以是存在其他本地文件中;在生成报告P2的过程中包括生成包括方法、方法路径、代码块标识、探针执行情况表和探针的变化表等数据;根据报告P2中的代码块标识合并报告P1中的探针执行情况表和P2中的指向相同代码块的探针执行情况表(在此过程中,需要根据探针变化表指导合并,使探针的合并是准确的),从而获得基于测试数据的评估测试覆盖率的报告P3。代码覆盖率是一种度量,它描述了对程序源代码的测试程度。通过报告P3可以发现测试用例无法覆盖到的程序。测试人员可以创建覆盖缺失的测试用例的测试数据或测试单元代码,以增加覆盖率并确定代码覆盖率的定量度量。同时基于P1和P2的报告,能更快的定位发生修改的方法的测试情况。
[0069] 在一些实施例中,在Java虚拟机JVM中通过javaagent参数为待测试的目标程序指定启动代理程序;
[0070] 在第一执行时,目标程序是程序A;
[0071] 在第二执行时,目标程序是程序B;
[0072] 在测试启动后,代理程序通过Class Loader在JVM装载目标程序的class文件之前将探针代码插入测试目标程序的class文件,将探针代码插入目标程序的class文件的步骤包括:根据程序结构划分最小可运行单元,在目标程序中根据最小可运行单元插入探针代码;
[0073] 在测试目标程序时,根据探针代码的执行情况,以及根据代码块标识对应的探针关系生成基于方法统计的执行情况报告。
[0074] 上述方法,通过代理程序在运行目标程序前,通过代理程序自动根据程序结构修改目标程序的执行代码(插入探针代码),相比于通过手动方式增加探针代码,上述方式可以减少测试人员的工作量,增加测试效率。同时通过上述方式,切换程序正常执行还是测试程序,只需要删除相应的参数即可,方便测试程序和调试程序的切换。
[0075] 如图6所示,本申请实施例提供的一种电子设备,包括:处理器40、存储介质41和总线42,所述存储介质41存储有所述处理器40可执行的机器可读指令,当电子设备运行时,所述处理器40与所述存储介质41之间通过总线42通信,所述处理器40执行所述机器可读指令,以执行如上述代码测试方法的步骤。
[0076] 对应于上述代码测试方法,本申请实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行上述代码测试方法的步骤。
[0077] 对应于上述代码测试方法,本申请实施例还提供了一种代码测试装置,包括:
[0078] 标识确认模块,用于在程序B的第二执行时,根据程序B中方法F1与程序A中对应代码块的相关关系,确定方法F1对应的代码块标识;
[0079] 报告生成模块,用于根据程序B内方法所对应的探针在测试运行过程中执行情况,生成报告P2;
[0080] 所述报告P2根据代码块标识区分程序B内方法的执行情况;
[0081] 程序B与程序A修改后的源码对应。
[0082] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考方法实施例中的对应过程,本申请中不再赘述。在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0083] 所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0084] 另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
[0085] 所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
[0086] 最后需要说明的是,尽管在本申请的说明书文字及附图中已经对上述各实施例进行了描述,但并不能因此限制本申请的专利保护范围。凡是基于本申请的实质理念,利用本申请说明书文字及附图记载的内容所作的等效结构或等效流程替换或修改产生的技术方案,以及直接或间接地将以上实施例的技术方案实施于其他相关的技术领域等,均包括在本申请的专利保护范围之内。