发明内容
本申请实施例提供一种测试数据的生成方法及装置,用以提高测试结果的有效性。
本申请实施例提供的具体技术方案如下:
一种测试数据的生成方法,包括:
接收调用方发送的请求消息,进行数据记录后发往服务方,以及接收服务器返回的响应消息,进行数据记录后发往调用方;
对记录的数据进行反序列化处理,获得代码要素信息;
基于获得的代码要素信息生成相应的测试代码。
这样,可以基于真实的接口应用环境生成相应的测试代码,从而有效提高了测试代码的生成效率,提升了测试结果的有效性和准确性,同时也大大节省了测试代码的开发和维护成本。进一步地,本申请实施例的通用性极高,适用于各种协议接口,且操作简单,不需要开发人员具有多年的开发经验,从而进一降低了其扩展成本。
可选的,接收调用方发送的请求消息,进行数据记录后发往服务方,以及接收服务器返回的响应消息,进行数据记录后发往调用方,包括:
当接收到调用方发送的请求消息时,读取所述请求消息中的指定字段,根据所述指定字段的解析结果判定请求消息的类型,并获取服务方的***域名;
若所述请求消息为获取get请求消息,则开始记录get请求消息中的二进制数据,在记录完毕后,根据服务方的***域名开启本地至服务方的连接,并将get请求消息通过所述连接发送至服务方,以及在接收到服务方的响应消息时,记录响应消息的二进制数据,并返回至调用方;
若所述请求消息为发布post请求消息,则根据服务方的***域名开启本地至服务方的连接,开始记录post请求消息中的二进制数据,并对post请求消息进行循环读取,将已记录完毕的数据部分通过所述连接依次发送给服务方,以及在接收到服务方返回的响应消息时,记录响应消息的二进制数据,并对响应消息进行循环读取,将已记录完毕的数据部分依次发送给调用方。
可选的,对记录的数据进行反序列化处理,获得代码要素信息,包括:
将记录的包含有请求消息和响应消息的二进制数据转换为字符串,并从中解析出调用方对服务方进行调用时所采用的调用接口和调用方法;
对获得的字符串数据进行反序列化处理,获得Java程序可操作的测试对象,并从中解析出调用方对服务方进行调用时使用的入参列表,以及服务方返回的调用结果;
将获得的调用接口、调用方法、入参列表和调用结果确定为代码要素信息。
可选的,基于获得的代码要素信息生成相应的测试代码,包括:
根据获得的调用方使用的调用接口,配置测试代码中使用的调用接口名称和调用接口类型,以及根据调用方使用的调用方法,配置测试代码中使用的调用方法名称、调用方法类型和调用参数;
对基于调用方使用的入参列表和服务方返回的调用结果生成的测试对象分别进行解析,获得相应的入参名称、入参类型、入参赋值以及结果参数名称、结果参数类型、结果参数赋值,并根据获得信息生成对应的测试代码。
可选的,进一步包括:
在对基于调用方使用的入参列表和服务方返回的调用结果生成的测试对象进行参数解析的过程中,若待获取的测试对象为普通对象,则直接进行调用;若待获取的测试对象为复杂对象,则读取所述复杂对象对应的文件保存地址以获取基于所述复杂对象生成的保存文件,并将所述保存文件转换为所述复杂对象后再进行调用。
一种测试数据的生成装置,包括:
通信单元,用于接收调用方发送的请求消息,进行数据记录后发往服务方,以及接收服务器返回的响应消息,进行数据记录后发往调用方;
处理单元,用于对记录的数据进行反序列化处理,获得代码要素信息;
生成单元,用于基于获得的代码要素信息生成相应的测试代码。
这样,可以基于真实的接口应用环境生成相应的测试代码,从而有效提高了测试代码的生成效率,提升了测试结果的有效性和准确性,同时也大大节省了测试代码的开发和维护成本。进一步地,本申请实施例的通用性极高,适用于各种协议接口,且操作简单,不需要开发人员具有多年的开发经验,从而进一降低了其扩展成本。
可选的,接收调用方发送的请求消息,进行数据记录后发往服务方,以及接收服务器返回的响应消息,进行数据记录后发往调用方时,所述通信单元具体用于:
当接收到调用方发送的请求消息时,读取所述请求消息中的指定字段,根据所述指定字段的解析结果判定请求消息的类型,并获取服务方的***域名;
若所述请求消息为获取get请求消息,则开始记录get请求消息中的二进制数据,在记录完毕后,根据服务方的***域名开启本地至服务方的连接,并将get请求消息通过所述连接发送至服务方,以及在接收到服务方的响应消息时,记录响应消息的二进制数据,并返回至调用方;
若所述请求消息为发布post请求消息,则根据服务方的***域名开启本地至服务方的连接,开始记录post请求消息中的二进制数据,并对post请求消息进行循环读取,将已记录完毕的数据部分通过所述连接依次发送给服务方,以及在接收到服务方返回的响应消息时,记录响应消息的二进制数据,并对响应消息进行循环读取,将已记录完毕的数据部分依次发送给调用方。
可选的,对记录的数据进行反序列化处理,获得代码要素信息时,所述记录单元具体用于:
将记录的包含有请求消息和响应消息的二进制数据转换为字符串,并从中解析出调用方对服务方进行调用时所采用的调用接口和调用装置;
对获得的字符串数据进行反序列化处理,获得Java程序可操作的测试对象,并从中解析出调用方对服务方进行调用时使用的入参列表,以及服务方返回的调用结果;
将获得的调用接口、调用方法、入参列表和调用结果确定为代码要素信息。
可选的,基于获得的代码要素信息生成相应的测试代码时,所述生成单元具体用于:
根据获得的调用方使用的调用接口,配置测试代码中使用的调用接口名称和调用接口类型,以及根据调用方使用的调用装置,配置测试代码中使用的调用装置名称、调用装置类型和调用参数;
对基于调用方使用的入参列表和服务方返回的调用结果生成的测试对象分别进行解析,获得相应的入参名称、入参类型、入参赋值以及结果参数名称、结果参数类型、结果参数赋值,并根据获得信息生成对应的测试代码。
可选的,所述生成单元进一步用于:
在对基于调用方使用的入参列表和服务方返回的调用结果生成的测试对象进行参数解析的过程中,若待获取的测试对象为普通对象,则直接进行调用;若待获取的测试对象为复杂对象,则读取所述复杂对象对应的文件保存地址以获取基于所述复杂对象生成的保存文件,并将所述保存文件转换为所述复杂对象后再进行调用。
具体实施方式
为了提高接口测试的测试结果有效性,本申请实施例中,重新设计了测试数据的生成方式,即通过监听传输控制协议(TransmissionControlProtocol,TCP)数据然后反序列化,从而基于真实数据生成所需的测试数据,完全不需要人工构造数据,即节省测试时间,又因为测试数据的真实性,有效提升了测试结果的有效性。
下面结合附图对本申请优选的实施方式进行详细说明。
参阅图1所示,本申请实施例中,在调用方和服务方之间设置有位于TCP层的代理***,简称,TCP代理***,调用方向服务方发送的任何请求都会由TCP代理***接收并转发至服务方,相应的,服务方返回的任何响应也都会由TCP代理***工转发至调用方。
在具体实现时,只要将调用方的目标服务切换到至TCP代理***即可,如,将调用方的服务域名指向TCP代理***等等,在此不再一一赘述。此外,测试人员可以通过任何方式由调用方向服务方发送调用请求,也可以通过任何方式由服务方向调用方返回调用响应,所有的操作过程都会被TCP代理***转发并记录。
参阅图2所示,本申请实施例中,TCP代理***生成测试数据的概述流程如下:
步骤200:接收调用方发送的请求消息,进行数据记录后发往服务方,以及接收服务器返回的响应消息,进行数据记录后发往调用方。
如图1所示,本申请实施例中,TCP代理***在调用方和服务方之间转发两者之间的交互消息,在转发的过程中,可选的,TCP代理***在TCP层记录两者之间的交互消息,包括调用方发往服务方的请求消息,以及服务方发往调用方的响应消息。由于在TCP层进行了数据监听,因此,本申请实施例是一种通用方案,可以适应于采用任何协议栈的***及设备,只要基于TCP层进行相应开发,就可以进行任何类型接口服务协议的监听。
另一方面,本申请目前支持xfire的网络服务(Webservice,wb)以及一些自定义的远程调用协议,根据实际应用需求,也可以对本申请技术方案所支付的协议进行适当扩展,本实施例中,仅以xfire的ws协议处理方式来做功能演示。
具体的,在执行步骤200时,TCP代理***主要用于将调用方发送的请求消息,转发到指定的服务方,以及将服务方返回的响应消息返回给调用方,并且在此调用过程中,记录请求消息和响应消息的二进制数据。
实际应用中,请求消息分为获取(get)请求消息和发布(post)请求消息,前者用于向服务方请求服务描述语言(WebServicesDescriptionLanguag,wsdl)文档(即服务方的入参列表),后者用于调用服务方执行各种操作。针对不同类型的请求消息,TCP代理***将执行不同的处理。其中,wsdl文档将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问(类似远程过程调用)。
具体执行方式如下:
TCP代理***启动后,监听指定端口(如,配置为8080端口),当接收到调用方请求消息时,TCP代理***读取请求消息中的指定字段(例如,前256个字节或者前1024个字节等等),根据这部分数据的解析结果判定请求消息的类型,并获取服务方的***域名,也称主机(host)信息;
若请求消息为get请求消息,则其目的是获取服务方的wsdl文档(即服务方的入参列表),所谓入参列表即是调用服务方时需要使用的参数列表,调用方按照入参列表的提示在post请求中填写好相应的参数即可对服务方进行调用。那么,TCP代理***开始记录get请求消息中的二进制数据,并在记录完毕后,根据服务方的***域名开启本地至服务方的TCP连接,将get请求消息通过已建立的TCP连接发送至服务方;相应的,TCP代理***在接收到服务方的响应消息(携带wsdl文件)时,记录响应消息的二进制数据,并返回至调用方。
之所以这样处理是因为get请求消息中携带的数据量较少,因此,可以在记录完毕后,将所有数据一起发送至服务方。
若为post请求消息,则其目的是调用服务方完成各种操作,那么,TCP代理***根据服务方的***域名开启本地至服务方的TCP连接,将前期读取的指定字段写入此TCPL连接(所有的数据都要传入服务方,此处先将获取收到的数据先发送出去),并开始记录post请求消息中的二进制数据(可选的,可以使用请求数组,即byte[]request进行记录),接着,TCP代理***可以对post请求消息进行循环读取,将已记录完毕的数据部分通过已建立的TCP连接依次发送给服务方;相应的,TCP代理***接收到服务方返回的响应消息(携带调用结果)时,记录响应消息的二进制数据(可选的,可以使用响应数组,即byte[]response进行记录),并对响应消息进行循环读取,将已记录完毕的数据部分依次发送给调用方。
其中,在向服务方返回响应消息时,为了避免读取空数据,可选的,TCP代理***可以循环睡眠(sleep)25毫秒,直到byte[]response中记录的数据含有wsdl结尾标识符为止。
之所以这样处理是因为post请求消息中携带的数据量较多,为了避免造成数据阻塞,TCP处理***分多次将post请求消息发送至服务方。
步骤210:对记录的数据进行反序列化处理,获得代码要素信息。
在执行步骤210时,TCP处理***具体执行以下步骤:
首先,TCP代理***获取已记录的二进制数据(包括:get请求消息及其响应消息,post请求消息及其响应消息),将二进制数据转换为字符串,并从中解析出调用方对服务方进行调用时所采用的调用接口和调用方法。
实际应用中,所有数据均是以二进制形式记录的,TCP代理***在进行反序列化操作之前,需要先将二进制数据转换为字符串(如,soap协议文本),在转换为字符串后,调用方采用的调用接口和调用方法可以直接解析获得,而入参列表涉及到复杂的参数配置,调用结果也包括大量数据,无法在字符串状态下解析获得,必须进行反序列化操作,转换为Java程序可操作的对象。
其次,对获得的字符串数据进行反序列化处理,获得Java程序可操作的测试对象,并从中解析出调用方对服务方进行调用时使用的入参列表,使用的入参列表以及服务方返回的调用获得Java程序可操作的测试对象。
最后,将获得的调用接口、调用方法、入参列表和调用结果确定为代码要素信息。
本申请实施例中,TCP代理***执行反序列化操作是基于对xfire的改造来实现的,xFire是新一代的JavaWeb服务引擎,用于简化Java应用转化为Web服务的步骤和过程,本实施例中,改造了xfire处理器的功能,只保留了其数据解析功能,不提供其他服务,因此,TCP代理***只需调用改造后的xfire即可实现数据的反序列化操作。经过反序列化操作后,TCP代理***可以解析出调用方使用的入参列表和服务方返回的调用结果,这两者均被转换为Java程序可操作的测试对象,其中,由于入参列表和调用结果中均包含有大量复杂的数据,因此,生成的对象包含普通对象和复杂对象。
上述调用接口、调用方法、入参列表和调用结果均是重要的代码要素信息,将这些信息作为维度,可以生成符合实际应用环境的准确的测试代码;当然,若管理人员预先获知调用方采用的调用接口和调用方法,则TCP代理***也可以不从字符串中解析获得此信息,而仅仅对字符串进行反序列化操作获得最为重要的入参列表和调用结果即可。在此不再赘述。
步骤220:基于获得的代码要素信息生成相应的测试代码。
具体的,在执行步骤220时,TCP代码***执行以下操作:
首先,根据获得的调用方使用的调用接口,配置测试代码中使用的调用接口名称和调用接口类型,以及根据调用方使用的调用方法配置测试代码中使用的调用方法名称、调用方法类型和调用参数。
例如,根据调用方使用的调用接口和调用方法,配置测试代码中使用的接口名称、bean(一种Java类)类型,bean名称,调用参数方法等等;其中,对于简单参数变量和参数枚举值需要进行初始赋值。
其次,对基于调用方使用的入参列表和服务方返回的调用结果生成的测试对象分别进行解析,获得相应的入参名称、入参类型、入参赋值以及结果参数名称、结果参数类型、结果参数赋值,并根据获得信息生成对应的测试代码。
例如,以入参列表为例,可以对入参列表进行解析,在测试代码中配置入参类型、入参申明、import类型、初始化赋值等等。
另一方面,在对入参列表和调用结果进行反序列化操作后,由于生成的测试对象可能为普通对象和复杂对象,因此,其保存方式可能不同,如,普通对象直接以Java对象的形式保存,而复杂对象由于数据量庞大,需要以文件形式进行保存更为稳妥安全,因此,TCP代理***需要将复杂对象转换为文件形式〔如,Javascript对象符号(JavascriptObjectNotation,Json)保存文件〕进行保存,并记录文件保存地址。)进行存储,并记录文件保存地址。
这样,在对基于调用方使用的入参列表和服务方返回的调用结果生成的测试对象进行参数解析的过程中,若待获取的测试对象为普通对象,则TCP代理***直接进行调用,即直接读取对应保存的Java对象,而若待获取的测试对象为复杂对象,则TCP代理***读取该复杂对象对应的文件保存地址以获取基于该复杂对象生成的保存文件,并将该保存文件转换为相应的复杂对象再进行调用。
采用上述方法,可以从测试代码的初始部分开始(即从package部分开始)逐步生成一个标准的接口测试代码。
参阅图3所示,本申请实施例中,一种测试数据的生成装置(即TCP代理***),包括通信单元30、处理单元31和生成单元32,其中,
通信单元30,用于接收调用方发送的请求消息,进行数据记录后发往服务方,以及接收服务器返回的响应消息,进行数据记录后发往调用方;
处理单元31,用于对记录的数据进行反序列化处理,获得代码要素信息;
生成单元32,用于基于获得的代码要素信息生成相应的测试代码。
可选的,通信单元具体用于:
当接收到调用方发送的请求消息时,读取请求消息中的指定字段,根据指定字段的解析结果判定请求消息的类型,并获取服务方的***域名;
若请求消息为获取get请求消息,则开始记录get请求消息中的二进制数据,在记录完毕后,根据服务方的***域名开启本地至服务方的连接,并将get请求消息通过连接发送至服务方,以及在接收到服务方的响应消息时,记录响应消息的二进制数据,并返回至调用方;
若请求消息为发布post请求消息,则根据服务方的***域名开启本地至服务方的连接,开始记录post请求消息中的二进制数据,并对post请求消息进行循环读取,将已记录完毕的数据部分通过连接依次发送给服务方,以及在接收到服务方返回的响应消息时,记录响应消息的二进制数据,并对响应消息进行循环读取,将已记录完毕的数据部分依次发送给调用方。
可选的,记录单元具体用于:
将记录的包含有请求消息和响应消息的二进制数据转换为字符串,并从中解析出调用方对服务方进行调用时所采用的调用接口和调用装置;
对获得的字符串数据进行反序列化处理,获得Java程序可操作的测试对象,并从中解析出调用方对服务方进行调用时使用的入参列表,以及服务方返回的调用结果;
将获得的调用接口、调用方法、入参列表和调用结果确定为代码要素信息。
可选的,生成单元具体用于:
根据获得的调用方使用的调用接口,配置测试代码中使用的调用接口名称和调用接口类型,以及根据调用方使用的调用装置,配置测试代码中使用的调用装置名称、调用装置类型和调用参数;
对基于调用方使用的入参列表和服务方返回的调用结果生成的测试对象分别进行解析,获得相应的入参名称、入参类型、入参赋值以及结果参数名称、结果参数类型、结果参数赋值,并根据获得信息生成对应的测试代码。
可选的,生成单元进一步用于:
在对基于调用方使用的入参列表和服务方返回的调用结果生成的测试对象进行参数解析的过程中,若待获取的测试对象为普通对象,则直接进行调用;若待获取的测试对象为复杂对象,则读取复杂对象对应的文件保存地址以获取基于复杂对象生成的保存文件,并将保存文件转换为复杂对象后再进行调用。
综上所述,本申请实施例中,TCP代理***在数据传输过程中对传输数据进行二进制数据记录,再对记录的二进制数据进行反序列化操作,获得代码要素信息,以及基于代码要素信息生成所需的测试代码,这样,可以基于真实的接口应用环境生成相应的测试代码,从而有效提高了测试代码的生成效率,提升了测试结果的有效性和准确性,同时也大大节省了测试代码的开发和维护成本。进一步地,本申请实施例的通用性极高,适用于各种协议接口,且操作简单,不需要开发人员具有多年的开发经验,从而进一降低了其扩展成本。
本领域内的技术人员应明白,本申请的实施例可提供为方法、***、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本申请实施例进行各种改动和变型而不脱离本申请实施例的精神和范围。这样,倘若本申请实施例的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。