具体实施方式
下面结合附图及具体实施例对本发明再作进一步详细的说明。
图1为本发明所述CGI测试方法的主要流程图。参见图1,该方法主要包括:
步骤101、收集客户端发出的请求包和服务器针对该请求响应的应答包,对所述请求包和应答包进行解析,得到对应的请求数据和应答数据。
由于客户端和服务器之间的数据包(包括请求包和应答包)是二进制的超文本传送协议(HTTP)数据包,因此需要对收集的请求包和应答包进行解析得到测试人员可以识别理解的数据。本步骤中,所述对请求包和应答包进行解析的一种具体方式为:
对所述二进制的请求包和应答包进行解析得到对应的字段名称及其具体数据;当然,也可以进一步解析得到字段的类型,以提供给测试人员更为详细的信息。在CGI的处理逻辑中,每一种数据包都对应一种数据结构类型,每一种数据结构类型中包括对应的数据结构,具体包括至少一个字段、每个字段对应的数据类型。在具体数据包中需要包括数据类型对应的字段、每个字段对应的数据类型及每个字段的具体数值。例如对于登录请求包对应包括的字段包括:用户名、密码等数据。
步骤102、生成包括步骤101所解析得到的请求数据和应答数据的用例文件。
本步骤生成的该用例文件是一种基本的用例文件,每一种请求包都至少对应一种基本的用例文件,测试人员可以在后续过程中在该用例文件的基础上修改得到任意的测试用例。本步骤中生成包括请求数据和应答数据的用例文件的一种具体方式为:
根据步骤101解析得到的所述字段名称及其具体数据生成用例文件,该用例文件中包括两部分内容:一部分为请求包部分,即请求数据,包括请求包的数据结构类型名称和各字段的名称及其具体数据,其中每一字段名称及其具体数据可以看作是一项请求数据;另一部分为对应的应答包部分,即应答数据,包括应答包的数据结构类型名称和各字段的名称及其具体数据,同理,其中每一字段名称及其具体数据可以看作是一项应答数据。
步骤103、根据测试人员的指令修改所述用例文件,其中包括将请求数据修改为构造的请求数据,以及将对应的应答数据修改为预期应答数据。
本步骤中,所述测试人员可以根据CGI逻辑分支发出修改指令,从而构造出测试人员希望构造出的任意的测试用例,用来模拟各种对应的请求情况,从而提高发现和解决CGI逻辑错误的能力,提高测试的准确度。
本步骤中,修改所述用例文件具体为:测试人员根据CGI逻辑分支,将用例文件中的请求数据中的至少一项字段名称对应的值修改为构造值,所谓构造值就是测试人员根据对CGI的测试需求人工编造的值,并将该请求数据对应的应答数据中对应的字段名称的对应值改为预期应答值,所谓预期应答值就是测试人员根据所述构造值按照正常的CGI处理逻辑确定出的应答值,该应答值代表了所述构造值对应的正常的CGI处理结果。修改完毕后,修改后的请求数据和预期应答数据则构成了一个新的用于测试的用例。此外,还可以进一步为该修改后的用例分配标识(ID)、以及输入该用例的描述信息,例如该用例是用于测试CGI逻辑中的哪个分支内容等,更方便测试人员在看到对比结果后更加准确地定位CGI的出错位置。
步骤104、将所述修改后的请求数据封装成测试请求包发送给服务器。
步骤105、接收服务器返回的针对所述测试请求包的应答包,对所述应答包进行解析得到实际应答数据,与所述预期应答数据进行对比。
本步骤中的一种具体的处理方法包括:将所收到的所述二进制的应答包进行解析得到实际应答数据,其中包括字段名称及其实际值;读取步骤103所述预期应答数据中的各字段名称及其预期值;将所述实际应答数据和预期应答数据中的各具有相同字段名称的实际值和预期值进行对比,判断是否满足预设的对比规则,将不满足所述对比规则的字段名称及其实际值和预期值交给步骤106输出。
步骤106、输出所述对比结果。
为了更好更加直观地将所述不满足对比规则的对比结果呈现给测试人员,本发明可以将所述对比结果的内容包含在邮件中,将该邮件发送给测试人员的目标邮箱。如果测试人员在修改用例文件时进一步记录了修改后用例的标识和用例描述信息,则在输出该用例对应的对比结果时,进一步输出该用例的标识和用例描述信息。
对应的,本发明还公开了一种CGI的测试装置,用于执行本发明所述的方法步骤。图2为本发明所述的CGI测试装置的一种组成示意图。参见图2,该测试装置为一种测试程序,主要包括:
收集解包模块201,用于收集客户端发出的请求包和服务器针对该请求响应的应答包,对所述请求包和应答包进行解析,得到对应的请求数据和应答数据。
用例生成模块202,用于生成包括所述请求数据和应答数据的用例文件。
用例修改模块203,用于根据测试人员指令修改所述用例文件,其中包括将请求数据修改为构造的请求数据,以及将对应的应答数据修改为预期应答数据。
该用例修改模块203可以提供用例修改界面,其中可以显示所述基本的用例文件的请求数据和应答数据,用户可以对其中的数据进行修改。
封包模块204,用于将所述修改后的请求数据封装成测试请求包发送给服务器。
解包对比模块205,用于接收服务器返回的应答包,对所述应答包进行解析得到实际应答数据,与所述预期应答数据进行对比,将对比结果发送给输出模块206输出。
输出模块206,用于输出展示所述对比结果。
通过本发明的方案,请求的数据是从真实的正常的客户数据中提取的,通过修改请求包里面的一两个特定字段,就可以使得测试人员能够更加容易地确保该构造出来的请求应当进入CGI处理逻辑的哪一条逻辑分支里面,从而更方便测试人员发现问题和定位问题,减少测试工作量。
在本发明的一种实施例中,本发明步骤101中,在解析得到所述字段名称及其具体数据之后,进一步保存所述解析得到的字段名称及其具体数据到数据库中;步骤102中,在生成所述用例文件时,从数据库中读取对应的字段名称及其具体的数据用于生成所述用例文件。
将所述字段名称及其具体数据保存到数据库的原因是:请求包及其对应的应答包不能同时收集到,应答包往往要迟后请求包一段时间,因此在解析请求包后不能立刻生成用例文件,需要等到解析完对应的应答包之后才能生成用例文件,如果不保存到数据库虽然也可以实现本发明的发明目的,但是生成用例文件的时间和占用的资源比较多,因此,在解析出的请求数据后,将请求数据保存到数据库,例如此处以可扩展标记语言(XML,Extensible MarkupLanguage)格式保存请求数据到数据库中;当收集到所述请求包对应的应答包并解析出应答数据之后,再将应答数据以XML格式保存到数据库中。这样的好处是生成用例文件的进程不必等待数据解析,在需要生成用例文件时读取数据库即可,可以提高效率和降低资源占用。在需要生成用例文件时,直接从数据库中读取请求包的XML数据串以及对应的应答包的XML数据串,对取出的XML数据串进行解析获取各个字段所对应的取值,生成一个用例文件,在该用例文件中,把相应的请求包的请求数据和对应应答包的应答数据集成在一起,这样请求包和应答包各个字段的内容就一目了然了。
同理,在步骤103中,在修改完所述用例文件后,进一步将该用例文件的请求数据和应答数据保存到数据库中,即将修改后的用例文件的全部请求数据(包括修改的字段值及其字段名称,以及没有修改的字段值及其字段名称)和全部应答数据(包括修改的字段预期应答值及其字段名称,以及没有修改的字段值及其字段名称)保存到数据库中,此处也以XML的格式保存。
在步骤104封装测试请求包时,从数据库中读取对应的请求数据用于封装成测试请求包;在步骤105中得到实际应答数据后,从数据库中读取对应的预期应答值进行对比。
所述XML是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML是标准通用标记语言(SGML)的子集,非常适合Web传输。由于XML有标准的格式并且已有许多开源的解析程序可供使用,所以本发明的优选实施例中采用XML格式来保存所述数据,当然本发明对具体的数据保存格式并不限定于XML格式,在其他实施例中也可以采用其它格式保存所述数据。
对应的,在所述CGI测试装置的一种具体实施例中,如图3所示,还进一步包括存取控制模块207,用于进一步将解析到的所述请求数据和应答数据存储到数据库208中,并在生成用例文件时从数据库208读取对应的请求数据和应答数据;还用于将修改后的请求数据和应答数据存储到数据库208中,并在构造测试请求包时,从数据库208中读取对应的请求数据,在对比时从数据库208中读取对应的预期应答数据。
在CGI中,每一种数据包有一一对应的数据结构类型,每一种数据结构类型中包括对应的数据结构,具体包括至少一个字段、每个字段对应的数据类型及每个字段的具体数值。这些数据结构类型的信息被记录在CGI的数据结构定义文件中。由于数据结构类型不同,因此不同数据包(包括请求包和应答包)的解析和封装操作会有所不同,因此需要由不同的程序代码执行所述解析和封装操作。本发明中的方法中,所述对请求包或应答包进行解析的操作由该请求包数据结构类型或应答包数据结构类型对应的解包代码执行;所述将请求数据封装成测试请求包的操作由该请求数据结构类型对应的封包代码执行。在本发明的所述测试装置中,所述收集解包模块和解包对比模块中具体包括解包代码,或可以调用解包代码,所述对请求包或应答包进行解析的操作由该请求包数据结构类型或应答包数据结构类型对应的解包代码执行;所述封包模块中具体包括封包代码,或可以调用封包代码,所述将请求数据封装成测试请求包的操作由该请求数据结构类型对应的封包代码执行。所述封包代码和解包代码可以直接调用CGI开发过程中已有的代码,详细的封包和解包过程在后文中介绍。
如果CGI的数据结构相对固定,在一种实施例中,可以将所述解包代码和封包代码直接写入所述测试装置的程序中。如果某一数据包对应的数据结构有变化,则其对应的封包和解包操作也要随之变化,这时需要对所述解包代码和封包代码进行修改,在一种实施例中,可以人工修改所述解包代码和封包代码以实现本发明的目的。
但是,为了进一步降低人员的工作量,在本发明的一种优选实施例中,可以进一步包括封包/解包代码的自动生成过程,即:通过扫描开发人员的数据结构定义文件,然后进行分析处理,从而自动生成各个数据结构类型对应的封包/解包代码,将这些程序代码更新到测试装置的测试程序中,从而可以使测试程序自动适应CGI的新的数据结构,保证测试过程的正常运行。这个过程可以在第一次测试时以及每次CGI进行变更同步之后自动执行,从而得到适应性的测试程序,以适应CGI的修改。
对应的,所述CGI测试装置中,如图4所示,进一步包括解包/封包代码生成模块209,用于根据CGI的数据结构定义文件生成与各数据结构类型对应的解包代码和封包代码,将所述解包代码提供给所述收集解包模块201和解包对比模块205,将所述封包代码提供给所述封包模块204。
所述具体的封包/解包代码的自动生成过程如下步骤41至步骤43:
步骤41:对所述CGI的数据结构定义文件进行解析,得到各数据结构类型名称以及各数据结构类型包含的字段名称和类型,并生成各字段的初始化数据。
所述生成各字段的初始化数据的目的在于:在构造测试请求包时,对于测试人员不修改的、且取值不确定的字段附上所述初始值,由于该初始值是一种正常数据,因此可以避免不确定的字段对测试结果造成干扰。
步骤42:为所述每一数据结构类型对应生成二进制转换函数和封装函数,该二进制转换函数和封装函数组成了该数据结构类型对应的封包代码。所述二进制转换函数可以直接调用CGI开发时的现有函数,但该函数必须与数据结构类型对应,专用于将该数据结构类型内的字段名称、类型及其数据转换为二进制流。在构造测试请求包时,根据请求数据中的数据结构类型名称调用该数据结构类型对应的二进制转换函数,由该二进制转换函数将该数据结构类型内的字段名称、类型及其数据转换为二进制流的包体。所述封装函数用于对所述二进制流包体进行封装得到对应的请求包,其中封装信息(主要是包头)包括该请求包对应的数据结构类型名称,所述封装操作主要是为包体打上包头,进行加密、加压等操作,制作成二进制流的请求包。所述封装函数也可以直接调用CGI开发时的现有函数。所述进行转换的原因是客户端与服务器之间采用超文本传送协议(HTTP)传输,而HTTP所需要的是二进制流文件。
步骤43:为所述每一数据结构类型对应生成字段转换函数和解封装函数,由该字段转换函数和解封装函数组成了该数据结构类型对应的解包代码;其中所述解封装函数可以直接调用CGI开发时的现有函数,用于解封装请求包或应答包,所述解封装操作主要包括解压、解密、解包头等操作,得到包头中的数据结构类型名称和二进制流的包体,再调用该数据结构类型名称对应的字段转换函数。该字段转换函数也可以直接调用CGI开发时的现有函数,但是该函数必须与该数据结构类型对应,专用于将所述二进制流的包体转换成对应数据结构类型的字段名称、类型及其数据。
当然上述步骤42和43之间没有严格的先后顺序,也可以先步骤43后步骤42,或同时执行。
下面举例说明上述的处理过程:
例如:在开发人员的数据结构定义文件中,数据结构SpecialStruct的结构定义如下:
经过解析,可以得到字段tA的数据类型是SomeStruct,字段iB的数据类型是unsigned int,字段pcC的数据类型是char*,进而可以得到数据结构类型SpecialStruct的数据初始化函数:
通过上述初始化函数可以生成各字段的初始化数据,之后调用该数据结构类型SpecialStruct对应的二进制转换函数以及对应的封装函数,组成封包代码。当进行封包操作时,利用二进制转换函数把该数据结构类型的字段及其取值转换成二进制流,并通过所述封装函数封装成一个二进制流文件,在跟服务器端完成短链接之后就可以顺利地进行数据包的收发操作了。
由上所述,本发明数据包的数据结构及其解包封包的代码是通过对开发人员的数据结构定义文件进行分析处理直接自动生成的,并且这些代码会定时更新,因此,即使CGI开发过程中的数据结构经常修改,也不需要人工修改对应的测试程序,这样就大大减少了人力在这方面上的维护,进一步减少了测试工作量。
下面以自动检测微信CGI为例,再次介绍本发明所述方法的一具体实施例。所述微信是一种支持跨通信运营商、跨操作系统平台通过网络快速发送免费(需消耗少量网络流量)语音短信、视频、图片和文字,支持多人群聊的手机聊天软件。当然,本发明并不仅仅限于自动检测微信CGI的功能正常性和异常处理的容错能力,还可以用于进行压力测试、内存泄漏测试和性能测试等测试用途。
自动检测微信CGI的过程主要包括如下步骤:
步骤501、请求包/应答包的封包/解包代码自动生成过程。即CGI测试装置根据微信CGI的数据结构定义文件,自动生成各数据结构类型对应的(即各数据包对应的)封包代码和解包代码。主要过程如上述步骤41至步骤43。
步骤502、请求包/应答包的收集解析。
如图5a所示为请求包/应答包收集解析过程的一种流程图。参见图5a,该过程包括:
步骤521、客户端接收测试人员发出的一个请求操作,向服务器发出一个请求包。
步骤522、服务器端在接收到所述请求包后会对请求包进行解包和解压解密处理,然后根据服务器本身制定的CGI逻辑生成并返回一个应答包。
步骤523、CGI测试装置收集上述请求包和对应的应答包,所述请求包和应答包均为二进制流,CGI测试装置需要将这种二进制流转换(通常采用业界常用的Dump操作进行转换)为对应的二进制请求包文件和二进制应答包文件并保存。
步骤524、CGI测试装置调用所述解包代码对所述二进制的请求包文件和相应的应答包文件进行解析,即:先用解封装函数解压、解密、解包头得到包头中的数据结构类型名称和二进制流的包体,再调用该数据结构类型名称对应的字段转换函数将所述二进制流的包体转换成对应数据结构类型的字段名称及其取值。解析之后得到请求数据和对应的应答数据,所述请求数据包括请求包的数据结构类型名称和数据结构中所包含的字段名称及其具体值;所述应答数据包括应答包的数据结构类型名称和数据结构中所包含的字段名称及其具体值。
步骤525、CGI测试装置把所述请求数据和相应的应答数据合成XML的格式并保存到数据库中。这里注意,所述请求包的请求数据和对应的应答包的应答数据要关联存储,在生成用例文件时需要关联读取。在向数据库中保存所述数据时,如果某些字段的值为音视频等二进制数据,则需要采用Base64编码转换之后再保存,当从数据库读取这些数据时,同样用Base64编码转换回二进制数据。
步骤526、在生成用例文件时,CGI测试装置首先从数据库中取出请求数据和相应的应答数据的XML数据串,对取出的XML数据串进行解析得到请求包的数据结构类型名称及各个字段及其对应的取值,以及解析得到对应应答包的数据结构类型名称及各个字段及其对应取值,生成一个用例文件,把解析得到的请求包的所述数据和相应应答包的所述数据分别写入这个用例文件,从而在该用例文件中集成了请求包部分和应答包部分两部分内容,即请求包的请求数据和相应应答包的应答数据,这样请求包和应答包各个字段的内容就一目了然了。
对于不同类型的请求包及其对应的应答包,可以分别生成不同的用例文件。当测试人员进行测试时,可以修改不同的用例文件从而构造出不同类型的测试请求包。
步骤503、测试请求包的构造发送。
如图5b所示为测试请求包的构造发送过程的一种流程图。参见图5b,该过程包括:
步骤531、测试人员根据CGI的逻辑分支在用例修改界面上修改某一请求包的用例文件,在用例文件的请求包的请求数据中,把请求包原来的一些字段的值修改为测试人员希望的构造值,在对应的应答包的应答数据中,把原来的应答值修改成测试人员预期会得到的预期应答值,修改之后的用例就变成了新的测试用例,也可以称之为目标用例文件。除此之外,测试人员还可以输入该新的测试用例的描述信息,例如该用例是用于测试CGI逻辑中的哪个分支内容等,以更方便测试人员在看到对比结果后更加准确地定位CGI的出错位置。CGI测试装置还可以自动为该新用例分别标识。
步骤532、CGI测试装置把修改后的目标用例文件中的请求包部分和应答包部分保存到数据库中,保存的时候以XML格式来保存,以达到可以快速通用地解析这些数据包的效果,而且也便于保存。
步骤533、当需要构造测试请求包时,CGI测试装置从数据库中取出所述目标用例的请求包数据(XML格式),解析出其中数据结构类型名称以及各个字段名称及其取值,其中包括修改后的字段和没有修改的字段,用于构造一个测试请求包。
步骤534、CGI测试装置调用步骤533所解析出的数据结构类型名称对应的封包代码,用该封包代码中的二进制转换函数将所述解析出请求包的字段名称及其取值转换成二进制流的包体,再用封装函数进行打包头、加密、加压等操作,制作成HTTP二进制流的请求包,该请求包就是构造出的测试请求包,最后将该测试请求包发送给服务器端进行处理。
步骤504、应答包收取比对。
如图5c所示为应答包收取比对过程的流程图。参见图5c,该过程包括:
步骤541、接收服务器返回的针对所述测试请求包的实际应答包,调用解包代码对所述应答包进行解析处理,即:先用解封装函数解压、解密、解包头得到包头中的数据结构类型名称和二进制流的包体,再调用该数据结构类型名称对应的字段转换函数将所述二进制流的包体转换成对应数据结构类型的字段名称及其取值。解析之后得到实际应答数据,即应答包的数据结构类型名称和数据结构中所包含的字段名称及其具体值,这些具体值为实际值。
步骤542、根据所述数据结构类型名称(与所述应答包对应)从数据库中查询对应用例中的预期应答数据的XML数据串,将该XML数据串解析成预期应答数据,即包括对应的字段名称及其具体值,其中的具体值就包括测试人员在修改用例时保存的预期值。
由于得到的应答包是二进制流文件,而预期结果又是以XML的形式保存在数据库中的,测试人员很难直接比对这两个结果来判断出得到的结果是否符合预期。因此需要执行上述步骤541和542对得到的二进制结果和预期结果分别进行解析,把各个字段的取值还原出来,这样比对就直观许多了。
步骤543、调用所述对比模块将所述步骤542得到的和步骤541得到的各个具有相同字段名称的预期值和实际值进行对比,判断是否满足预设的对比规则。所述预设的对比规则可以根据不同的字段名称进行有针对性的设定,主要的对比规则有如下几条:
(1)字段的预期值和实际值是否相等,如果是则满足对比规则,否则不满足对比规则。
(2)字段的预期值是否大于实际值,如果是则满足对比规则,否则不满足对比规则。
(3)字段的预期值是否小于实际值,如果是则满足对比规则,否则不满足对比规则。
(4)当字段值为索引时,判断字段的预期值索引到的二进制流和实际值索引到的二进制流是否相同,如果是则满足对比规则,否则不满足对比规则。
(5)字段的预期值和实际值可以是任意值,都认为满足对比规则。
当然,本发明不限定于上述几种对比规则,测试人员可以根据CGI的逻辑测试需要,自行规定更为有针对性的对比规则,此处不再赘述。
步骤544、将不满足所述对比规则的字段名称及其实际值和预期值输出给输出模块进行输出。例如把不满足比对预期的结果以字段和相应取值的方式显示出来,并会向测试人员明确显示该字段的预期值和实际得到的值分别是什么,而其他比对正常的字段和用例则不会有任何的显示。
步骤505、输出模块将对比结果的输出显示。
所述对比结果可以是以邮件和网页前端页面展示的方式反馈给测试人员。输出模块用于把CGI测试装置需要输出的有问题的比对结果以更好的、更加直观的方式呈现给测试人员。当出现比对的实际结果跟预期结果不一致的时候,输出模块会向测试人员和开发人员发送一份包含有结果比对的一些概要信息的邮件,其中包含有问题的用例ID、用例描述信息、预期结果和实际结果内容等概要信息;另外该邮件中还可以进一步包含有一个链接,测试人员通过该链接可以进入查看此次测试比对的详细信息说明,其中除了比对的概要信息外,还会包括出问题的是应答包里的哪一个字段、数据类型是什么、重试了多少次等详细的比对信息。如此一来,测试人员和开发人员就可以通过用例的描述信息和结果比对不一致的问题点出在哪一个地方等信息来确定出现潜在问题的逻辑分支。当CGI出现问题的时候,可以通过出现异常的请求的用例ID出发,很迅速地定位到问题点,从而减少受到影响和需要查找的范围,使得测试人员能够更快捷地发现和定位问题,也为开发人员能够快速地定位和解决问题提供了便利条件。
经过本发明,在对微信CGI进行测试时,整个操作过程中的大部分都是自动完成的,测试人员可以在点击运行测试装置后直接看到比对结果,而不用去了解结果的来源和结果比对的过程,大大提高了效率,减少了测试工作量。
本发明的上述流程不断重复自动执行,可以很有效地监控整个微信CGI系统的功能使用情况和异常处理情况,包括成功数和失败数,从而知道系统当前的运行情况,使得整个微信CGI更加稳定可靠,达到更全面的监控,当每次有微信CGI进行变更同步的时候,都会自动执行该测试装置,如果出现有实际得到的结果跟预期结果比对不一致的情况就会反馈给测试人员,查看微信CGI是否出现了问题,迅速定位出现问题的位置,提高了发现和解决CGI逻辑错误或故障的能力。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。