本发明属于软件测试领域,尤其涉及一种定位调用出错的方法、装置和计算机可读存储介质。
背景技术:
大型软件或大规模系统中,各个模块之间的调用最为频繁。有些支付类系统,单次支付流程,调用涉及到的模块平均达到20个以上。这些大型软件或大规模系统在正式发布之前乃至使用中,一般都要经过测试,找出其中的bug所在后进行修正。对软件或系统进行的测试可在专门的测试环境中进行,而定位模块之间的调用是否出错是测试的一项重要活动。
现有的一种定位调用出错的方法是通过日志系统,按照日志中提供的关键字进行日志搜索来定位问题。
然而,上述现有的方法其实没有解决定位问题,因为,只要一个模块调用出现错误,调用返回时经过的模块,其出参中都会包含该错误对应的错误码,出现多条不同模块的出错日志,需要测试人员在清晰了解调用链路和解包日志信息,逐个排查到底是哪个或哪些模块调用出了问题,效率非常低下。
技术实现要素:
本发明提供一种定位调用出错的方法、装置和计算机可读存储介质,以高效定位调用出错的模块。
本发明一方面提供了一种定位调用出错的方法,所述方法包括:
获取与预设关键字匹配的业务请求号,所述业务请求号唯一标识单次业务请求并对应于所述单次业务请求涉及的所有模块调用;
根据所述业务请求号,获取与所述业务请求号对应的所有调试日志;
根据与所述业务请求号对应的所有调试日志,生成包含错误码提示的模块调用关系图。
本发明一方面提供了一种定位调用出错的装置,所述装置包括:
第一获取模块,用于获取与预设关键字匹配的业务请求号,所述业务请求号唯一标识单次业务请求并对应于所述单次业务请求涉及的所有模块调用;
第二获取模块,用于根据所述业务请求号,获取与所述业务请求号对应的所有调试日志;
生成模块,用于根据与所述业务请求号对应的所有调试日志,生成包含错误码提示的模块调用关系图。
本发明一方面提供了一种计算设备,包括存储器、处理器以及存储在存储器中并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:
获取与预设关键字匹配的业务请求号,所述业务请求号唯一标识单次业务请求并对应于所述单次业务请求涉及的所有模块调用;
根据所述业务请求号,获取与所述业务请求号对应的所有调试日志;
根据与所述业务请求号对应的所有调试日志,生成包含错误码提示的模块调用关系图。
本发明实施例的一方面提供了一种计算机可读存储介质,计算机可读存储介质存储有计算机程序,计算机程序被处理器执行时实现以下方法的步骤:
获取与预设关键字匹配的业务请求号,所述业务请求号唯一标识单次业务请求并对应于所述单次业务请求涉及的所有模块调用;
根据所述业务请求号,获取与所述业务请求号对应的所有调试日志;
根据与所述业务请求号对应的所有调试日志,生成包含错误码提示的模块调用关系图。
从上述本发明实施例提供的技术方案可知,由于能够根据与预设关键字匹配的业务请求号,最终生成包含错误码提示的模块调用关系图,而模块调用关系图能够对出现错误代码的模块节点进行标识,因此,与现有技术仅仅根据日志系统进行日志搜索、需要人工进一步逐步排查来定位问题相比,本发明提供的技术方案直接标识出包含错误代码的模块节点,从而节省了测试人员的人力成本,提高了定位调用出错的效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的定位调用出错的方法的实现流程示意图;
图2-a是本发明实施例提供的模块调用关系图;
图2-b是本发明另一实施例提供的模块调用关系图;
图3是本发明实施例提供的定位调用出错的装置的结构示意图;
图4是本发明实施例提供的定位调用出错的装置的结构示意图;
图5是本发明另一实施例提供的定位调用出错的装置的结构示意图;
图6-a是本发明另一实施例提供的定位调用出错的装置的结构示意图;
图6-b是本发明另一实施例提供的定位调用出错的装置的结构示意图;
图6-c是本发明另一实施例提供的定位调用出错的装置的结构示意图;
图7-a是本发明另一实施例提供的定位调用出错的装置的结构示意图;
图7-b是本发明另一实施例提供的定位调用出错的装置的结构示意图;
图7-c是本发明另一实施例提供的定位调用出错的装置的结构示意图;
图8是本发明实施例提供的计算设备的结构示意图;
图9-a是本发明实施例提供的定位调用出错的方法的硬件实现架构图;
图9-b是本发明另一实施例提供的定位调用出错的方法的硬件实现架构图;
图9-c是本发明另一实施例提供的定位调用出错的方法的硬件实现架构图;
图9-d是本发明另一实施例提供的定位调用出错的方法的硬件实现架构图。
具体实施方式
以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、技术之类的具体细节,以便透彻理解本发明实施例。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本发明。在其它情况中,省略对众所周知的系统、装置、电路以及方法的详细说明,以免不必要的细节妨碍本发明的描述。
为了说明本发明的技术方案,下面通过具体实施例来进行说明。
附图1是本发明实施例提供的定位调用出错的方法的实现流程示意图,其执行主体可以是被定位调用出错的系统(例如,腾讯公司的微信支付系统)所在的终端或服务器,例如,一台个人电脑或具有服务器功能的任何计算设备等。附图1示例的定位调用出错的方法主要包括以下步骤s101至s103,以下详细说明:
s101,获取与预设关键字匹配的业务请求号,其中,业务请求号唯一标识单次业务请求并对应于单次业务请求涉及的所有模块调用。
所谓预设关键字,是测试人员为了定位错误而设置的一些与该待定位错误相关的信息,这些设置的关键字也是调试日志(调试日志是调试程序时生成的日志)中包含的信息。例如,为了定位一次线上下单购物、支付的过程中出现的模块调用错误,测试人员可以以订单号为预设关键字来定位一次线上下单购物、支付的过程中出现的模块调用错误。需要说明的是,预设关键字可以不止一个,例如,上述示例中,预设关键字还可以是uin和商号等。
在本发明实施例中,业务请求号唯一标识单次业务请求并对应于单次业务请求涉及的所有模块调用,业务请求号的内容包括模块调用所涉及模块的标识、16进制ip、采样级别、时间戳、端口号和序号等信息,而每一次的模块调用都会在调试日志中打印该业务请求号,因此,只要调试日志中包含有预设关键字,则就可以根据预设关键字匹配到调试日志,从而获取到与预设关键字匹配的业务请求号。
需要说明的是,调试日志可以存储在日志数据库中,可以根据发起的业务请求,向日志数据库存储调试日志。具体地,根据发起的业务请求,向日志数据库存储调试日志可通过如下步骤s1011至s1013实现:
s1011,根据发起的业务请求,采集调试日志。
如前所述,只要有业务请求,则会涉及到模块调用,而模块调用会相应地生成调试日志,因此可以根据发起的业务请求,采集调试日志。
s1012,缓存经步骤s1011采集的调试日志。
由于调试日志很多,为了减轻日志数据库的存储压力,在本发明实施例中,采集到的调试日志并不是立刻写入日志数据库,而是缓存起来。
s1013,周期性地向日志数据库批量写入缓存的调试日志。
可以根据实际场景来确定向日志数据库批量写入调试日志的周期,例如,若带宽较小或日志数据库所在的机器性能本身不高,可以将周期确定大一些,例如,可以是以3秒为周期,反之,则可以将周期确定小一些,例如以1秒为周期,经过周期为1秒或3秒的缓存时间,向日志数据库批量写入缓存的调试日志。
s102,根据经步骤s101获取的业务请求号,获取与业务请求号对应的所有调试日志。
如前所述,只要涉及到模块调用,必然会产生与该次模块调用的业务请求号,并且会在调试日志中打印出来,因此,只要获取到一个业务请求号,即可获取到与该业务请求号对应的所有调试日志。
需要说明的是,由于预设关键字并不会出现在所有打印了某个业务请求号的调试日志中,因此,仅仅根据预设关键字是无法匹配到所有打印了某个业务请求号的调试日志的。例如,某预设关键字k包含于调试日志l1、l2和l5,假设调试日志l1、l2和l5是在模块m1调用模块m2时生成,同时,这种模块调用又生成了业务请求号seqn1,另一方面,还可能由于模块m3调用模块m5时也生成了业务请求号seqn1并打印了调试日志l3、l4和l6,但调试日志l3、l4和l6中并不包含预设关键字k,因此,根据预设关键字k并不能获取到调试日志l3、l4和l6。由于预设关键字k包含于调试日志l1、l2和l5中,且是在模块m1调用模块m2时生成以及模块调用生成了业务请求号seqn1,因此,根据预设关键字k,可以获取到业务请求号seqn1,而在模块m3调用模块m5时生成了业务请求号seqn1并打印了调试日志l3、l4和l6,因此,根据业务请求号seqn1,就获取到了与业务请求号seqn1对应的所有调试日志,即调试日志l1、l2、l3、l4、l5和l6。
s103,根据与业务请求号对应的所有调试日志,生成包含错误码提示的模块调用关系图。
作为本发明一个实施例,根据与业务请求号对应的所有调试日志,生成包含错误码提示的模块调用关系图可通过如下步骤s1031至s1033实现:
s1031,根据调试日志中模块调用的先后顺序,生成模块调用关系图。
所谓模块调用的先后顺序,可以是模块调用与被调用的关系,例如,模块a调用模块b,则可以从左至右将模块b放置在模块a的右边,若模块a调用模块b和模块c,而模块b和模块c没有调用关系,则可以将模块b和模块c都放置在模块a的右边,而模块b和模块c并列,如附图2-a是本发明实施例生成的模块调用关系图,每个模块构成模块调用关系图的每个模块节点。
s1032,将每个模块节点的入参和出参附加到模块调用关系图中以构成每个模块节点的入参节点和出参节点。
例如,附图2-a示例的模块调用关系图中,每个模块节点的入参节点采用“in”标注,而每个模块节点的出参节点采用“out”标注。
s1033,对所有模块节点的日志的出参数据进行分析,若有错误代码,则对第一个出错的模块节点进行标识。
在本发明实施例中,可在第一个出错的模块节点的出参节点处采用特殊颜色,例如红色或黑色对其标识,从而标识出相应出错的模块节点,例如,附图2-b中,黑色标识的出参节点表明相应的模块节点f出现了错误代码。
针对出现错误代码的模块节点,可以对其错误信息进行展示,即,在收到打开指令后,展示出错的模块节点的错误信息。例如,对于附图2-b的模块节点f,可以点击模块节点f或者其出参节点,则展示模块节点f的错误信息。
以下以腾讯公司的微信支付系统(或手机qq支付系统)为例,进一步地说明本发明的技术方案。微信支付系统主要包括对外调用接口、协议转换模块以及一些中间服务模块等,其中,对外调用接口为一次业务的入口,在微信支付系统中,可通过对外调用接口调用各种服务(service),完成支付业务逻辑处理,协议转换模块完成对外调用接口与中间服务模块之间的协议转换,可提供多种机器设备的路由,中间服务模块提供某些业务逻辑处理,对外以单个服务(service)提供可供微信支付系统调用的服务接口,而一个中间服务模块可存在多个服务接口,且允许服务调用服务。
如附图9-a所示,是本发明实施例提供的定位调用出错的方法的硬件实现架构图,其中,标号为901的是移动终端,其通过网络与标号为902的服务器连接,服务器902上运行定位调用出错的方法的程序,服务器902亦是被定位调用出错的系统(例如,腾讯公司的微信支付系统)所在的服务器,其上安装日志采集程序和日志缓存程序等,标号为903的是日志数据库(database,db),其主要用于存储调试日志。
用户(此处主要指定位调用出错的测试人员或研发人员)通过移动终端901向对外调用接口发起一条业务请求,其中包含预设关键字。由于业务请求号唯一标识单次业务请求并对应于单次业务请求涉及的所有模块调用,业务请求号的内容包括模块调用所涉及模块的标识、16进制ip、采样级别、时间戳、端口号和序号等信息,而每一次的模块调用都会在调试日志中打印该业务请求号,因此,服务器902收到该业务请求后,可以根据预设关键字匹配到调试日志,从而获取到与预设关键字匹配的业务请求号。
需要说明的是,上述提及的调试日志存储于日志数据库903中。服务器902可根据来自移动终端901的业务请求,向日志数据库903存储调试日志,具体方法是服务器902中的日志采集程序根据移动终端901发起的业务请求,采集调试日志,而为了减轻日志数据库903的存储压力,服务器902中的日志缓存程序将日志采集程序采集的调试日志缓存起来,然后,周期性地向日志数据库903批量写入这些缓存的调试日志。
服务器902获取到业务请求号后,可根据获取的业务请求号,从日志数据库903获取与业务请求号对应的所有调试日志。调试日志是服务器902生成模块调用关系图的基础素材,即,服务器902可根据与业务请求号对应的所有调试日志,生成包含错误码提示的模块调用关系图,具体方法如下s1至s3:
s1,服务器902根据调试日志中模块调用的先后顺序,生成模块调用关系图。
如前所述,微信支付系统包含对外调用接口、协议转换模块和多个中间服务模块,协议转换模块和中间服务模块存在调用的先后顺序,中间服务模块之间亦存在调用的先后顺序。例如,协议转换模块r中间服务模块m1,则可以从左至右中间服务模块m1放置在协议转换模块r的右边,若中间服务模块m1调用中间服务模块m2和中间服务模块m3,而中间服务模块m2和中间服务模块m3没有调用关系,则可以将中间服务模块m2和中间服务模块m3都放置在中间服务模块m1的右边,中间服务模块m2和中间服务模块m3并列,进一步地,若中间服务模块m3调用中间服务模块m4,则可将中间服务模块m4放置在中间服务模块m3的右边。需要说明的是,经步骤s1生成的模块调用关系图,每个模块构成模块调用关系图的每个模块节点。
s2,服务器902将每个模块节点的入参和出参附加到模块调用关系图中以构成每个模块节点的入参节点和出参节点。
经步骤s1生成的模块调用关系图中,每个模块节点的入参节点采用“in”标注,而每个模块节点的出参节点采用“out”标注。
s3,服务器902对所有模块节点的日志的出参数据进行分析,若有错误代码,则对第一个出错的模块节点进行标识。
例如,服务器902对所有模块节点的日志的出参数据进行分析后,可在第一个出错的模块节点的出参节点处采用特殊颜色,例如红色或黑色对其标识。针对出现错误代码的模块节点,可以对其错误信息进行展示,即,在收到经用户通过移动终端901发来的打开指令后,服务器902展示出错的模块节点的错误信息。
需要说明的是,附图9-a的架构图中,移动终端901亦可以被基于个人电脑终端的自动化测试平台代替,如附图9-b所示,是本发明另一实施例提供的定位调用出错的方法的硬件实现架构图,标号为904的是运行自动化测试平台的个人电脑终端。
另需说明的是,无论是附图9-a还是附图9-b的架构,日志数据库903可以集成于服务器902,如附图9-c和附图9-c所示本发明另一实施例提供的定位调用出错的方法的硬件实现架构图中,日志数据库905或906集成于服务器902中。
从上述附图1示例的定位调用出错的方法可知,由于能够根据与预设关键字匹配的业务请求号,最终生成包含错误码提示的模块调用关系图,而模块调用关系图能够对出现错误代码的模块节点进行标识,因此,与现有技术仅仅根据日志系统进行日志搜索、需要人工进一步逐步排查来定位问题相比,本发明提供的技术方案直接标识出包含错误代码的模块节点,从而节省了测试人员的人力成本,提高了定位调用出错的效率。
图3是本发明实施例提供的定位调用出错的装置的示意图。为了便于说明书,仅示出了与本发明有关的部分。图3示例的定位调用出错的装置主要包括第一获取模块301、第二获取模块302和生成模块303,详细说明如下:
第一获取模块301,用于获取与预设关键字匹配的业务请求号,其中,业务请求号唯一标识单次业务请求并对应于单次业务请求涉及的所有模块调用;
第二获取模块302,用于根据业务请求号,获取与业务请求号对应的所有调试日志;
生成模块303,用于根据与业务请求号对应的所有调试日志,生成包含错误码提示的模块调用关系图。
需要说明的是,本发明实施例提供的装置,由于与本发明方法实施例基于同一构思,其带来的技术效果与本发明方法实施例相同,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
附图3示例的生成模块303可以包括模调关系生成单元401、附加单元402和标识单元402,如附图4示例的定位调用出错的装置,其中:
模调关系生成单元401,用于根据调试日志中模块调用的先后顺序,生成模块调用关系图;
附加单元402,用于将每个模块节点的入参和出参附加到模块调用关系图中以构成每个模块节点的入参节点和出参节点;
标识单元403,用于对所有模块节点的日志的出参数据进行分析,若有错误代码,则对第一个出错的模块节点进行标识。
附图4示例的装置还可以包括展示模块501,如附图5示例的定位调用出错的装置。展示模块501用于在收到打开指令后,展示第一个出错的模块节点的错误信息。
附图3至附图5任一示例的定位调用出错的装置还可以包括存储模块601,如附图6-a至附图6-c任一示例的定位调用出错的装置。存储模块601用于根据发起的业务请求,向日志数据库存储调试日志。
附图6-a至附图6-c任一示例的存储模块601可以包括采集单元701、缓存单元702和写入单元703,如附图7-a至附图7-c任一示例的定位调用出错的装置,其中:
采集单元701,用于根据发起的业务请求,采集调试日志;
缓存单元702,用于缓存调试日志;
写入单元703,用于周期性地向日志数据库批量写入缓存的调试日志。
图8是本发明一实施例提供的计算设备的结构示意图。如图8所示,该实施例的计算设备8主要包括:处理器80、存储器81以及存储在存储器81中并可在处理器80上运行的计算机程序82,例如定位调用出错的方法的程序。处理器80执行计算机程序82时实现上述定位调用出错的方法实施例中的步骤,例如图1所示的步骤s101至s103。或者,处理器80执行计算机程序82时实现上述各装置实施例中各模块/单元的功能,例如图3所示第一获取模块301、第二获取模块302和生成模块303的功能。
示例性的,定位调用出错的方法的计算机程序82主要包括:获取与预设关键字匹配的业务请求号,其中,业务请求号唯一标识单次业务请求并对应于单次业务请求涉及的所有模块调用;根据业务请求号,获取与业务请求号对应的所有调试日志;根据与业务请求号对应的所有调试日志,生成包含错误码提示的模块调用关系图。计算机程序82可以被分割成一个或多个模块/单元,一个或者多个模块/单元被存储在存储器81中,并由处理器80执行,以完成本发明。一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述计算机程序82在计算设备8中的执行过程。例如,计算机程序82可以被分割成用户筛选模块201、特征提取模块202和输出模块203的功能(虚拟装置中的模块),各模块具体功能如下:第一获取模块301,用于获取与预设关键字匹配的业务请求号,其中,业务请求号唯一标识单次业务请求并对应于单次业务请求涉及的所有模块调用;第二获取模块302,用于根据业务请求号,获取与业务请求号对应的所有调试日志;生成模块303,用于根据与业务请求号对应的所有调试日志,生成包含错误码提示的模块调用关系图。
计算设备8可包括但不仅限于处理器80、存储器81。本领域技术人员可以理解,图8仅仅是计算设备8的示例,并不构成对计算设备8的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如计算设备还可以包括输入输出设备、网络接入设备、总线等。
所称处理器80可以是中央处理单元(centralprocessingunit,cpu),还可以是其他通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现成可编程门阵列(field-programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
存储器81可以是计算设备8的内部存储单元,例如计算设备8的硬盘或内存。存储器81也可以是计算设备8的外部存储设备,例如计算设备8上配备的插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。进一步地,存储器81还可以既包括计算设备8的内部存储单元也包括外部存储设备。存储器81用于存储计算机程序以及计算设备所需的其他程序和数据。存储器81还可以用于暂时地存储已经输出或者将要输出的数据。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本申请的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
在本发明所提供的实施例中,应该理解到,所揭露的装置/计算设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/计算设备实施例仅仅是示意性的,例如,模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
集成的模块/单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,定位调用出错的方法的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤,即,获取与预设关键字匹配的业务请求号,其中,业务请求号唯一标识单次业务请求并对应于单次业务请求涉及的所有模块调用;根据业务请求号,获取与业务请求号对应的所有调试日志;根据与业务请求号对应的所有调试日志,生成包含错误码提示的模块调用关系图。其中,计算机程序包括计算机程序代码,计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。计算机可读介质可以包括:能够携带计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。