代码覆盖测试的实现方法和装置
技术领域
本申请涉及软件测试领域,尤其涉及一种代码覆盖测试的实现方法和装置。
背景技术
代码覆盖测试是指用测试的方法来运行代码编译生成的可执行文件,并且统计在测试中实际执行到了哪些代码的测试方法。代码覆盖率是代码覆盖测试的一种测试结果,是对软件测试工作进程的重要量化指标,它代表了被测试过的代码占所有代码的比例。对于开发人员来说,能够通过代码覆盖测试得知哪些代码在真实的程序使用过程中几乎不会被用到,很可能是无用代码,可以考虑将其优化。
现有技术中,一些软件编译器提供了进行代码覆盖测试的工具。这些工具可以自动将代码划分为不同的区块,在编译成可执行文件运行时对所执行的区块进行计数,并将计数结果输入到结果文件中。
这样的工具对于自写自测的小型软件开发来说较为合适,但对于大型开发项目,往往由多个测试人员来对多个开发人员编写的代码进行测试,每个测试人员在多次测试时生成很多份结果文件,需要手动综合这些结果文件的信息,才能知道总的测试结果;而开发人员要想知道代码的覆盖情况,还要自行查找区块对应的代码是哪些,不仅效率低下,而且十分不便。
发明内容
有鉴于此,本申请提供一种代码覆盖测试的实现方法,应用在服务器上,包括:
接收开发主机上传的代码标识信息,所述代码标识信息包括区块与代码的对应关系;
接收测试主机上传的区块测试结果;所述区块测试结果包括属于每个区块的测试数据;
根据所属区块合并至少两份区块测试结果中的测试数据,以合并后的数据作为与区块具有对应关系的代码的测试结果;
向展示主机发送代码的测试结果。
本申请提供的一种代码覆盖测试的实现方法,应用在开发主机上,包括:
将被测代码划分为区块,生成区块与代码的对应关系;
将代码标识信息上传到服务器;所述代码标识信息包括区块与代码的对应关系,供服务器根据区块合并至少两份区块测试结果中的测试数据,得到具有对应关系的代码的测试结果。
本申请提供的一种代码覆盖测试的实现方法,应用在测试主机上,包括:
运行待测软件,生成区块测试结果;所述区块测试结果中包括属于各个区块的测试数据;
将区块测试结果上传到服务器,由服务器用来根据所属区块合并至少两份区块测试结果中的测试数据,并将合并后的数据作为与区块对应的代码的测试结果。
本申请提供的一种代码覆盖测试的实现方法,应用在展示主机上,包括:
向服务器发送测试结果请求;
从服务器接收代码的测试结果并显示;所述代码的测试结果由服务器根据与代码对应的区块,合并至少两份区块测试结果中的测试数据后生成。
本申请还提供了一种代码覆盖测试的实现装置,应用在服务器上,包括:
代码标识信息接收单元,用于接收开发主机上传的代码标识信息,所述代码标识信息包括区块与代码的对应关系;
区块测试结果接收单元,用于接收测试主机上传的区块测试结果;所述区块测试结果包括属于每个区块的测试数据;
测试数据合并单元,用于根据所属区块合并至少两份区块测试结果中的测试数据,以合并后的数据作为与区块具有对应关系的代码的测试结果;
代码测试结果发送单元,用于向展示主机发送代码的测试结果。
本申请提供的一种代码覆盖测试的实现装置,应用在开发主机上,包括:
对应关系生成单元,用于将被测代码划分为区块,生成区块与代码的对应关系;
代码标识信息上传单元,用于将代码标识信息上传到服务器;所述代码标识信息包括区块与代码的对应关系,供服务器根据区块合并至少两份区块测试结果中的测试数据,得到具有对应关系的代码的测试结果。
本申请提供的一种代码覆盖测试的实现装置,应用在测试主机上,包括:
区块测试结果生成单元,用于运行待测软件,生成区块测试结果;所述区块测试结果中包括属于各个区块的测试数据;
区块测试结果上传单元,用于将区块测试结果上传到服务器,由服务器用来根据所属区块合并至少两份区块测试结果中的测试数据,并将合并后的数据作为与区块对应的代码的测试结果。
本申请提供的一种代码覆盖测试的实现装置,应用在展示主机上,包括:
测试结果请求发送单元,用于向服务器发送测试结果请求;
代码测试结果接收单元,用于从服务器接收代码的测试结果并显示;所述代码的测试结果由服务器根据与代码对应的区块,合并至少两份区块测试结果中的测试数据后生成。
由以上技术方案可见,本申请的实施例中,开发主机将区块与代码的对应关系上传给服务器,服务器按照区块对多个区块测试结果中的测试数据进行合并,并将合并后的数据作为对应的代码的测试结果进行展示,从而能够直接提供代码覆盖情况多次测试的综合结果,减轻了开发人员获得这一结果所需的工作量,提高了效率。
附图说明
图1是本申请实施例应用场景的一种网络结构图;
图2是本申请实施例中一种应用在服务器上,代码覆盖测试的实现方法的流程图;
图3是本申请实施例中一种应用在开发主机上,代码覆盖测试的实现方法的流程图;
图4是本申请实施例中一种应用在测试主机上,代码覆盖测试的实现方法的流程图;
图5是本申请实施例中一种应用在展示主机上,代码覆盖测试的实现方法的流程图;
图6是本申请应用示例中服务器、开发主机、测试主机、展示主机间的交互示意图;
图7是主机或服务器的一种硬件结构图;
图8是本申请实施例中一种应用在服务器上,代码覆盖测试的实现装置的逻辑结构图;
图9是本申请实施例中一种应用在开发主机上,代码覆盖测试的实现装置的逻辑结构图;
图10是本申请实施例中一种应用在测试主机上,代码覆盖测试的实现装置的逻辑结构图;
图11是本申请实施例中一种应用在展示主机上,代码覆盖测试的实现装置的逻辑结构图。
具体实施方式
本申请的实施例提出一种新的代码覆盖测试的实现方法,在服务器上保存区块与代码的对应关系,在按照区块综合多个区块测试结果后,将综合后的数据作为与区块对应的代码的测试结果,从而能够直接将对代码的多次测试的综合结果提供给开发人员,以解决现有技术中存在的问题。
本申请实施例所应用的一种网络环境如图1所示,开发主机、测试主机、展示主机分别通过通信网络(如互联网和/或移动通信网络)与服务器进行交互;其中,根据待测软件应用的硬件环境,主机(包括开发主机、测试主机或展示主机)可以是智能手机、平板电脑、PC(Personal Computer,个人电脑)、笔记本、物理或逻辑的服务器、虚拟机等;服务器可以是一个物理或逻辑的服务器,也可以是由两个或两个以上分担不同职责的物理或逻辑服务器、相互协同来实现本申请实施例中服务器的各项功能。本申请实施例对主机、服务器的种类,以及主机与服务器之间通信网络的类型、协议等均不做限定。
需要说明的是,本申请实施例中,开发主机、测试主机、展示主机可以是相同的一个或者一组设备,当该设备用来完成开发主机的功能时,即是开发主机;用来完成测试主机或展示主机的功能时,即是测试主机或展示主机。例如,当开发人员登录主机后上传其编写的代码的代码标识信息时,该主机为开发主机;当开发人员登录该主机后查看其代码的测试结果时,该主机为展示主机。
本申请的实施例中,代码覆盖测试的实现方法应用在服务器上的流程如图2所示,应用在开发主机上的流程如图3所示,应用在测试主机上的流程如图4所示,应用在展示主机上的流程如图5所示。
在开发主机上,步骤310,将被测代码划分为区块,生成区块与代码的对应关系。
现有技术的代码覆盖率评估工具和一些商业软件中,提供了将被测代码划分为区块的命令或编译器,并且能够输出包括划分后的区块与代码对应关系的文件,例如主要用于C、C++语言的基于gcc(GNU C Compiler,GNU C语言编译器)调试信息的gcov工具、lcov工具,再如主要用于Java的PureCoverage工具、Clover测试工具等。本申请实施例中可以采用上述各种工具或编译器,也可以采用具有类似功能的其他方式,不做限定。
根据所采用的划分方式或工具,区块可以是基本块、函数、段、行、目录等中的一个到多个;区块与代码的对应关系可以是区块的标识与代码行数的对应关系,也可以是区块的标识与代码本身的对应关系。
在开发主机上,步骤320,将代码标识信息上传到服务器;代码标识信息中包括区块与代码的对应关系,供服务器根据区块合并至少两份区块测试结果中的测试数据,得到具有对应关系的代码的测试结果。
在服务器上,步骤210,接收开发主机上传的代码标识信息。
开发主机将包括区块和代码的对应关系的代码标识信息上传到服务器,此外,开发主机还可以将代码、编译完成的待测试二进制可执行文件上传到服务器。在测试完成后,服务器得到的区块测试结果中包含针对区块的测试数据(即属于区块的测试数据),根据所属区块,服务器能够将至少两份区块测试结果中测试数据合并后转换为与区块具有对应关系的代码的测试结果。
在上传代码标识信息给服务器时,开发主机可以将对应于代码标识信息的一项到多项代码描述信息一并上传给服务器。代码描述信息可以是代码开发者、代码所属的软件组件、根据代码生成的可执行文件的名称、或根据代码生成的可执行文件的版本号中的一项到多项。
其中,代码所属的软件组件表示当被测试的代码属于一个包括若干组成部分的应用程序时,所属的组成部分是哪一个;根据代码生成的可执行文件,可以是根据若干个开发人员上传的代码编译而成的可执行文件,换言之,一个可执行文件可能对应于多个开发主机上传的代码标识信息,每个代码标识信息中描述了区块与用来生成该可执行文件的一部分代码的对应关系。
服务器可以保存区块和代码的对应关系,将代码描述信息作为上传代码标识信息中每一个区块的属性值一并保存。例如,代码标识信息为:区块a对应代码行号01、02,区块b对应代码行号03到05;代码描述信息为:开发者BG,可执行文件名test,可执行文件版本号1.0;则服务器保存的代码标识信息如表1所示:
区块 |
代码行号 |
开发者 |
可执行文件名 |
可执行文件版本号 |
a |
01、02 |
BG |
test |
1.0 |
b |
03、04、05 |
BG |
test |
1.0 |
表1
服务器可以利用区块的属性值,来统计期望查看的某个范围内的代码测试结果,即通过属性值来筛选测试数据(测试数据是基于区块生成的),并用筛选后的测试数据得到该范围的测试结果,如某个开发者的代码测试结果、或某个版本的某个可执行文件的代码测试结果等等。
在测试主机上,步骤410,运行待测软件,生成区块测试结果,区块测试结果中包括属于各个区块的测试数据。
测试人员在测试主机上运行待测软件,当使用过程中程序执行了某个区块时,根据执行情况更新该区块的测试数据。测试数据可以包括是否执行、执行次数、执行耗时、其他执行参数中的一个到多个。在待测软件退出时,将属于待测软件的各个区块的测试数据写入到区块测试结果中。
通过运行待测软件生成区块测试结果的具体方式请参见现有技术,不再赘述。
在测试主机上,步骤420,将区块测试结果上传到服务器;由服务器用来根据所属区块合并至少两份区块测试结果中的测试数据,并将合并后的数据作为与区块对应的代码的测试结果。
在服务器上,步骤220,接收测试主机上传的区块测试结果。
通常而言,测试主机上每运行一次待测软件,即生成一份区块测试结果。测试主机可以一次上传一份区块测试结果,也可以将多次测试生成的多份区块测试结果一并上传到服务器。而服务器上接收的区块测试结果可能来源于一台到多台测试主机。
在一种实现方式中,测试主机可以在上传区块测试结果时,将对应于区块测试结果的一项到多项测试描述信息一并上传到服务器。测试描述信息可以是代码测试者、测试主机的标识、测试主机的操作系统名称、测试主机的操作系统版本号中的一项到多项。服务器保存区块测试结果,并且将对应的测试描述信息作为该区块测试结果中区块的属性值。类似于将来自开发主机的代码描述信息作为区块的属性值,服务器利用来自测试主机的属性值对区块的测试数据进行筛选,并利用筛选后的数据得到代码的测试结果,如某个代码测试者的测试结果、某个版本的某个操作系统上待测软件的测试结果等等。
在展示主机上,步骤510,向服务器发送测试结果请求。
在服务器上,步骤230,根据所属区块合并至少两份区块测试结果中的测试数据,以合并后的数据作为与区块具有对应关系的代码的测试结果。
对来自测试主机的区块测试结果,服务器按照所属区块将这些区块测试结果中的测试数据进行合并,把合并后的数据作为对应于该区块的代码的测试结果。一个例子中,服务器可以把所有区块测试结果中属于同一个区块的测试数据合并,以合并后该区块的总数据来作为对应于该区块的代码的测试结果。
在区块带有属性值的实现方式中,测试主机可以在测试结果请求中携带至少一项区块属性的指定值。区块的属性值可以是由开发主机上传的一项到多项代码描述信息,可以是由测试主机上传的一项到多项测试描述信息,也可以是上述两者的总和。测试结果请求中的区块属性指定值可以是一个具体的值,也可以是一个值域区间(如一个条件),由服务器将属性值包含在指定值范围内的区块的测试数据筛选出来,并利用筛选后的数据得到对应于区块的代码的测试结果。这样,不同的人员可以从不同的角度来便捷高效的查看代码的测试结果。
在陆续从测试主机收到多份区块测试结果后,服务器可以采用以下两种方式来根据区块合并测试数据:
第一种方式中,服务器保存每份区块测试结果中的区块、区块的属性(可以包括对应的代码描述信息和/或测试描述信息)、及其测试数据;在收到来自展示主机、包括一项到多项区块属性指定值的测试结果请求后,服务器合并多份区块测试结果中属于同一个区块、并且区块的属性值包含在区块属性指定值范围内的测试数据,将合并后的数据作为与区块具有对应关系的代码的测试结果。换言之,服务器筛选出属性值满足测试结果请求中指定范围的同一个区块的测试数据,将这些测试数据合并,从而按照测试结果请求生成对应的代码的测试结果。这种方式在每次收到测试结果请求后,根据测试结果请求遍历一次区块测试结果,效率较低。
第二种方式中,服务器生成汇总结果,汇总结果中包括把之前从测试主机接收的区块测试结果中属于同一个区块、并且具有相同属性值的测试数据累加后的总数据。在收到测试主机上传的新的区块测试结果后,服务器即把新区块测试结果中各个区块的测试数据累加到汇总结果中。在收到展示主机包括至少一项区块属性指定值的测试结果请求后,服务器根据汇总结果中属于同一个区块、并且区块的属性值包含在测试结果请求中区块属性指定值范围内的总数据,生成与区块具有对应关系的代码的测试结果。具体而言,如果汇总结果中满足上述条件(属于同一个区块、并且区块的属性值包含在测试结果请求中区块属性指定值范围内)的记录只有一条,则以该记录中的总数据作为对应的代码的测试结果;如果汇总结果中满足上述条件的记录超过一条,则合并这些记录中的总数据,将合并后的数据作为对应的代码的测试结果。这种方式预先根据区块及其属性值对区块测试结果进行合并,在收到测试结果请求后可以更加快捷的提供测试结果。
在服务器上,步骤240,向展示主机发送代码的测试结果。
在展示主机上,步骤520,从服务器接收代码的测试结果并显示;代码的测试结果由服务器根据与代码对应的区块,合并至少两份区块测试结果中的测试数据后生成。
响应于测试结果请求,服务器将代码的测试结果发送给展示主机。展示主机收到代码的测试结果,将其显示给提交测试结果请求的人员。
可见,本申请的实施例中,开发主机向服务器上传区块与代码的对应关系,服务器按照区块合并多个区块测试结果中的测试数据,生成对应于区块的代码的测试结果,展示给开发人员,这样开发人员不再需要手动综合若干份区块测试结果中的数据,而能够直接获得综合多次测试的代码覆盖情况,减轻了开发人员的工作量,提高了获取测试结果的效率。
在本申请的一个应用示例中,采用gcov工具来生成区块与代码的对应关系,以及供测试使用的待测软件的可执行文件,该可执行文件在运行时对区块的执行情况进行统计,形成区块测试结果。本应用示例中服务器、开发主机、测试主机与展示主机的交互如图6所示。
开发主机上,在使用gcc编译和链接代码时,指定两个编译选项:'-fprofile-arcs-ftest-coverage'。'-fprofile-arcs'选项让编译器生成gcno文件,gcno文件为代码标识信息文件,其中包括区块和代码的对应关系。'-ftest-coverage'选项让编译器在可执行文件中附加指令使可执行文件运行后生成gcda文件,gcda文件为区块测试结果,其中包括各个区块的测试数据。
开发主机将gcno文件上传给服务器,同时将可执行文件的Framework(框架)名称和版本号上传给服务器。服务器保存gcno文件中区块与代码的对应关系,并将Framework名称和版本号作为该gcno文件中各个区块的属性值一并保存。此外,开发主机还可以将源代码也上传给服务器。开发主机可以将上述文件打包为一个压缩文件后上传,由服务器解压后保存。
测试主机运行某个Framework的某个版本的可执行文件,在运行结束后生成gcda文件,gcda文件中包括该可执行文件的gcno文件中各个区块的测试数据。测试主机可以将同一个可执行文件运行多次,生成多个gcda文件。测试主机将生成的gcda文件上传给服务器,同时将测试主机的设备ID(标识)、测试主机的设备名称和测试主机操作系统的版本号上传给服务器。服务器保存每个gcda文件中各个区块的测试数据,并将设备ID、测试主机的设备名称和测试主机操作系统的版本号作为该gcda中各个区块的属性值一并保存。
开发人员指令展示主机向服务器发起测试结果请求,在请求中携带要查看的指定Framework名称和指定Framework版本号。服务器合并具有指定Framework名称和指定Framework版本号属性值的同一个区块的测试数据,将合并后的数据作为对应于该区块的代码的测试结果。服务器将具有指定Framework名称和指定Framework版本号属性值的各个区块对应的代码的测试结果返回给测试主机,由测试主机显示给开发人员。
与上述流程实现对应,本申请的实施例还提供了四种代码覆盖测试的实现装置,分别应用在服务器、开发主机、测试主机和展示主机上。这四种装置均可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为逻辑意义上的装置,是通过主机或服务器的CPU(CentralProcess Unit,中央处理器)将对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,除了图7所示的CPU、内存以及非易失性存储器之外,代码覆盖测试的实现装置所在的测试主机、展示主机通常还可以包括用于进行无线信号收发的芯片等其他硬件,代码覆盖测试的实现装置所在的服务器、开发主机通常还可以包括用于实现网络通信功能的板卡等其他硬件。
图8所示为本申请实施例提供的一种代码覆盖测试的实现装置,应用在服务器上,包括代码标识信息接收单元、区块测试结果接收单元、测试数据合并单元和代码测试结果发送单元,其中:代码标识信息接收单元,用于接收开发主机上传的代码标识信息,所述代码标识信息包括区块与代码的对应关系;区块测试结果接收单元,用于接收测试主机上传的区块测试结果;所述区块测试结果包括属于每个区块的测试数据;测试数据合并单元,用于根据所属区块合并至少两份区块测试结果中的测试数据,以合并后的数据作为与区块具有对应关系的代码的测试结果;代码测试结果发送单元,用于向展示主机发送代码的测试结果。
一个例子中,所述代码标识信息接收单元具体用于:接收开发主机上传的代码标识信息和一项到多项代码描述信息,以代码描述信息作为所述代码标识信息中区块的属性值。
上个例子中,所述装置还可以包括结果请求接收单元,用于接收展示主机的测试结果请求,所述测试结果请求中包括至少一项区块属性的指定值;所述测试数据合并单元具体用于:合并至少两份区块测试结果中属于同一个区块、并且区块的属性值包含在所述指定值范围内的测试数据,以合并后的数据作为与区块具有对应关系的代码的测试结果。
上个例子中,所述测试数据合并单元可以包括测试数据汇总模块和测试结果生成模块,其中:测试数据汇总模块用于在收到测试主机上传的区块测试结果后,将其中各个区块的测试数据累加到汇总结果中;所述汇总结果包括将之前从测试主机接收的区块测试结果中属于同一个区块、并且具有相同属性值的测试数据累加后的总数据;测试结果生成模块用于在收到展示主机包括至少一项区块属性指定值的测试结果请求后,根据汇总结果中属于同一个区块、并且区块的属性值包含在所述测试结果请求中区块属性指定值范围内的总数据,生成与区块具有对应关系的代码的测试结果。
可选的,所述代码描述信息包括:代码开发者、代码所属的软件组件、根据代码生成的可执行文件的名称、和/或根据代码生成的可执行文件的版本号。
可选的,所述区块测试结果接收单元具体用于:接收测试主机上传的区块测试结果和对应于区块测试结果的一项到多项测试描述信息,以测试描述信息作为区块测试结果中区块的属性值。
可选的,所述测试描述信息包括:代码测试者、测试主机的标识、测试主机的操作系统名称、和/或测试主机的操作系统版本号。
图9所示为本申请实施例提供的一种代码覆盖测试的实现装置,应用在开发主机上,包括对应关系生成单元和代码标识信息上传单元,其中:对应关系生成单元用于将被测代码划分为区块,生成区块与代码的对应关系;代码标识信息上传单元用于将代码标识信息上传到服务器;所述代码标识信息包括区块与代码的对应关系,供服务器根据区块合并至少两份区块测试结果中的测试数据,得到具有对应关系的代码的测试结果。
可选的,所述代码标识信息上传单元具体用于:将代码标识信息和一项到多项代码描述信息上传到服务器;所述代码描述信息用来作为代码标识信息中区块的属性值,供服务器对区块的测试数据进行筛选,并利用筛选后的数据得到代码的测试结果。
图10所示为本申请实施例提供的一种代码覆盖测试的实现装置,应用在测试主机上,包括区块测试结果生成单元和区块测试结果上传单元,其中:区块测试结果生成单元用于运行待测软件,生成区块测试结果;所述区块测试结果中包括属于各个区块的测试数据;区块测试结果上传单元用于将区块测试结果上传到服务器,由服务器用来根据所属区块合并至少两份区块测试结果中的测试数据,并将合并后的数据作为与区块对应的代码的测试结果。
可选的,所述区块测试结果上传单元具体用于:将区块测试结果和对应于区块测试结果的一项到多项测试描述信息上传到服务器;所述测试描述信息用来作为区块测试结果中区块的属性值,供服务器对区块的测试数据进行筛选,并利用筛选后的数据得到代码的测试结果。
图11所示为本申请实施例提供的一种代码覆盖测试的实现装置,应用在展示主机上,包括测试结果请求发送单元和代码测试结果接收单元,其中:测试结果请求发送单元用于向服务器发送测试结果请求;代码测试结果接收单元用于从服务器接收代码的测试结果并显示;所述代码的测试结果由服务器根据与代码对应的区块,合并至少两份区块测试结果中的测试数据后生成。
可选的,所述测试结果请求中包括:至少一项区块属性的指定值;所述指定值由服务器用来根据区块的属性值对测试数据进行筛选,并利用筛选后的数据得到代码的测试结果;所述区块属性值包括:由开发主机上传的一项到多项代码描述信息,和/或由测试主机上传的一项到多项测试描述信息。
以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。