一种通用的服务器压力测试方法及装置的制造方法

xiaoxiao2021-3-1  213

一种通用的服务器压力测试方法及装置的制造方法
【技术领域】
[0001]本申请涉及计算机网络技术领域,尤其涉及一种通用的服务器压力测试方法及装置。
【背景技术】
[0002]在网络游戏开发过程中,服务器压力测试是其中的一个重要环节。网络游戏压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。这里所指的“压力”即是不断地增加游戏里面的玩家。压力测试中的玩家,可以是真实的玩家,也可以是专用测试软件模拟出的“虚拟玩家”,这些虚拟玩家也被称为压测机器人。在同一客户端设备中可以实现大量压测机器人,采用压测机器人进行服务器压力测试,相对于由真实玩家进行压力测试,使服务器压力测试的周期及费用大大缩短,因此得到越来越广泛的应用。
[0003]现有技术中,游戏开发团队通常自行开发与项目配套的压测机器人,机器人需要依赖项目客户端或者服务器的网络包模块,耦合性强。同时不同游戏项目的压测机器人采用的开发语言也不同,有C++,java,C#等。对于一个项目开发的压测机器人无法给其他项目使用,不具备通用性。一家成规模的游戏公司往往有多个网络游戏项目在研,每个项目都需要从头实现一遍压测机器人的底层基础架构,这也是资源的一种浪费。

【发明内容】

[0004]本申请提供了一种通用的服务器压力测试方法及装置,对于不同项目的网络协议、网络包结构均能适用,从而缩短了压力测试的周期及成本。
[0005]本申请实施例提供了一种通用的服务器压力测试装置,该装置自下而上包括:收发模块、封装模块、字节解析模块、动作模块;
[0006]所述收发模块用于适配所要测试的服务器所采用的网络协议,将来自上层的网络数据包发送到服务器;或者接收来自服务器的网络数据包,并将所述网络数据包发送到上层;
[0007]封装模块,用于对来自下层的网络数据包进行解封装,将解封装得到的二进制码流发送到上层;或者对来自上层的二进制码流进行封装得到网络数据包,将所述网络数据包发送到下层;
[0008]字节解析模块,用于将来自下层的二进制码流还原成具体的网络包对象,并设置对象的属性值,同时将具体的网络包对象发送到上层,或者将来自上层的网络包对象转换成为二进制码流并发送到下层;
[0009]动作模块,用于定义虚拟用户发送每个特定网络包对象的动作,每个动作里面定义了该动作要发送的网络包对象,期望服务器返回的网络包对象,以及该动作接受的输入参数;动作模块通过输入参数以及玩家角色的属性值构造好要发送给服务器的网络包对象,并发送到下层;以及从下层接收返回的网络包对象,如果收到期望的网络包对象,认为该动作成功执行,否则认为这个动作执行不成功。
[0010]可选地,在封装模块之上,以及字节解析模块之下还包括加密解密模块,用于对来自上层的二进制码流加密,将加密后的二进制码流发送到下层,或者对来自下层的二进制码流进行解密,将解密后的二进制码流发送到上层。
[0011]可选地,所述字节解析模块所在的层进一步包括解析工具库,用于提供各种解析二进制码流的公共方法,以便字节解析模块调用。
[0012]可选地,所述收发模块包括多个收发单元,每个收发单元用于适配一种网络协议,根据服务器采用的网络协议,其中的一个收发单元处于使能状态并进行网络通信。
[0013]可选地,所述收发模块包括收发Socket单元、收发HTTP单元和收发WebSocket单
J L.ο
[0014]可选地,所述字节解析模块包括两个函数接口,一个函数接口用于通过网络包对象获得该网络包对象的二进制码流,另一个函数接口用于根据二进制码流设置网络包对象的属性值,所述函数接口采用与服务器无关的编程语言实现。
[0015]可选地,该装置进一步包括响应时间记录模块,用于记录从动作模块发送网络包对象到接收到期望服务器返回的网络包对象的时间,作为响应时间。
[0016]可选地,在动作模块之上进一步包括任务模块,用于定义虚拟用户的任务,所述任务由一系列动作组成,并加入了逻辑判断处理。
[0017]可选地,在任务模块之上,该装置进一步包括虚拟用户对象模块,用于设置虚拟用户对象的任务队列,并保存虚拟玩家角色的属性。
[0018]可选地,该装置进一步包括功能测试脚本模块和单元测试框架模块,
[0019]所述功能测试脚本模块用于存储测试所使用的用例脚本,按照用例脚本初始化虚拟用户对象,并和游戏服务器建立连接,登陆服务器并完成相应的测试任务,获取服务器返回的数据属性值,来校验服务器的功能是否正确;
[0020]单元测试框架模块用于组织功能测试。
[0021]可选地,该装置进一步包括调度模块,用于调用虚拟用户对象模块模拟出多个虚拟用户和服务器进行交互。
[0022]可选地,所述调度模块采用协程技术在多个虚拟用户的任务之间进行切换。
[0023]可选地,所述调度模块为每个虚拟用户分配执行时间段;
[0024]虚拟用户在对应的执行时间段内,处理服务器发来的消息队列包,发送心跳消息包给服务器,以及执行任务队列中的一个任务。
[0025]本申请实施例还提供了一种通用的服务器压力测试方法,
[0026]步骤Α、定义虚拟用户发送每个特定网络包对象的动作,每个动作里面定义了该动作要发送的网络包对象,期望服务器返回的网络包对象,以及该动作接受的输入参数;
[0027]步骤Β、通过输入参数以及玩家角色的属性值构造好要发送给服务器的网络包对象,将所述网络包对象转换成为二进制码流,并对所述二进制码流进行封装得到网络数据包,将所述网络数据包通过与服务器适配的网络协议发送到服务器;
[0028]步骤C、接收来自服务器的网络数据包,对所述网络数据包进行解封装,将解封装得到的二进制码流还原成具体的网络包对象,如果收到期望的网络包对象,认为动作成功执行,否则认为这个动作执行不成功。
[0029]可选地,步骤B对所述二进制码流进行封装之前进一步包括:对二进制码流加密;
[0030]步骤C所述将解封装得到的二进制码流还原成具体的网络包对象之前,进一步包括:对二进制码流进行解密。
[0031 ]可选地,该方法进一步包括:记录从发送网络包对象到接收到期望服务器返回的网络包对象的时间作为响应时间。
[0032]可选地,步骤A之前进一步包括:设置虚拟用户对象的任务队列,并保存虚拟玩家角色的属性,所述任务由一系列动作组成,并加入了逻辑判断处理。
[0033]可选地,该方法进一步包括:模拟出多个虚拟用户和服务器进行交互。
[0034]可选地,采用协程技术在多个虚拟用户的任务之间进行切换。
[0035]可选地,为每个虚拟用户分配执行时间段;
[0036]所述采用协程技术在多个虚拟用户的任务之间进行切换包括:
[0037]虚拟用户在对应的执行时间段内,处理服务器发来的消息队列包,发送心跳消息包给服务器,以及执行任务队列中的一个任务。
[0038]从以上技术方案可以看出,通过收发模块适配采用不同网络协议的游戏服务器,采用独立的封装以及重新实现网络包,从而摆脱不同项目对于网络包定义以及代码的依赖,同时辅助解析工具库,提高开发效率;为了支持服务器功能测试和压力测试,将虚拟用户发送的每个网络包设计成具体动作,将多个动作组合成了任务。动作层和任务层,支持了功能测试脚本的编写。同时也方便了压力测试调度程序进行调度。
[0039]在一些实施例中,通过采用协程技术,通过软件模拟线程,避免了机器人模拟大量用户加压时,多线程切换对物理机CPU的性能消耗。当虚拟用户没有收到期望返回的网络包时,虚拟用户会主动交出执行权,避免了为等待网络包返回而引起的执行阻塞问题。针对机器人调用,单个虚拟用户只能在分配给自己的时间片执行动作的问题,通过任务队列方式,将需要依次执行的任务放到一个队列里面,让虚拟用户按照队列进行调用。针对需要支持多人交互的压力测试场景问题,通过多人任务队列方式,将具体用户需要执行的具体任务,依次放到一个队列中,让虚拟用户按照队列进行调用。
【附图说明】
[0040]图1为本发明一个具体实施例中的压力测试装置的架构示意图;
[0041]图2为图1所示压力测试装置100通过调度虚拟用户完成压力测试的示意图;
[0042]图3为图1所示的压力测试装置100进行虚拟用户之间的切换调度的处理流程示意图;
[0043]图4为本申请实施例提供的解决多人逻辑交互的压力测试场景的实施方案示意图。
【具体实施方式】
[0044]为使本申请技术方案的技术原理、特点以及技术效果更加清楚,以下结合具体实施例对本申请技术方案进行详细阐述。
[0045]本申请实施例提供了一种通用的服务器压力测试装置,该装置自下而上包括 :收发模块、封装模块、字节解析模块、动作模块;
[0046]所述收发模块用于适配所述服务器所采用的网络协议,将来自上层的网络数据包发送到服务器;或者接收来自服务器的网络数据包,并将所述网络数据包发送到上层;
[0047]封装模块,用于对来自下层的网络数据包进行解封装,将解封装得到的二进制码流发送到上层;或者对来自上层的二进制码流进行封装得到网络数据包,将所述网络数据包发送到下层;
[0048]字节解析模块,用于将来自下层的二进制码流还原成具体的网络包对象,并设置对象的属性值,同时将具体的网络包对象发送到上层,或者将来自上层的网络包对象转换成为二进制码流并发送到下层;
[0049]动作模块,用于定义虚拟用户发送每个特定网络包对象的动作,每个动作里面定义了该动作要发送的网络包对象,期望服务器返回的网络包对象,以及该动作接受的输入参数;动作模块通过输入参数以及玩家角色的属性值构造好要发送给服务器的网络包对象,并发送到下层;以及从下层接收返回的网络包对象,如果收到期望的网络包对象,认为该动作成功执行,否则认为这个动作执行不成功。
[0050]可选地,在封装模块之上,以及字节解析模块之下还包括加密解密模块,用于对来自上层的二进制码流加密,将加密后的二进制码流发送到下层,或者对来自下层的二进制码流进行解密,将解密后的二进制码流发送到上层。
[0051]可选地,所述字节解析模块所在的层进一步包括解析工具库,用于提供各种解析二进制码流的公共方法,以便字节解析模块调用。
[0052]可选地,所述收发模块包括多个收发单元,每个收发单元用于适配一种网络协议,根据服务器采用的网络协议,其中的一个收发单元处于使能状态并进行网络通信。
[0053]由于手游(手机网络游戏)开发时间紧张,现有技术中有些手游项目的压测机器人仅仅采用发包器模式,即压测机器人仅仅实现了在同一时间段发送大量的网络包给服务器,并不处理服务器的返回包,使得压测机器人无法实现较为复杂的逻辑处理功能,单个压测机器人出现问题后,并不能快速定位到具体压测机器人的用户帐号以及出现错误的网络包。
[0054]为解决上述问题,本申请的另一个实施例中提供的服务器压力测试装置还包括用于定义虚拟用户各个不同行为和任务的任务模块;用于定义虚拟用户一些复杂的行为,例如登陆等,这些行为都是有由多个动作模块的对象组成,同时也包括了虚拟用户的一些逻辑处理。
[0055]可选地,在任务模块之上,该装置进一步包括虚拟用户对象模块,用于设置虚拟用户对象的任务队列,并保存虚拟玩家角色的属性。
[0056]有的项目采用多线程的方式设计压测机器人,一个压测机器人占用一个线程,但是当线程产生到一定数量后,线程间切换会占用客户端设备的大量cpu时间,导致单台客户端设备最多只能启动400到1000数量的压测机器人。
[0057]为解决上述问题,该装置在调度虚拟用户对象时,采用了协程技术,协程技术是用软件方法模拟了拟多线程,是在单个线程下对程序块进行切换轮流执行,避免了线程切换带来的cpu性能消耗。
[0058]同时游戏的一些压测场景,需要多个玩家进行配合,例如多人组队,互相加好友等,以上列举的压测机器人都是先设计单个机器人去做什么,接着模拟大量用户去做同样的事情,并没有考虑到多人之间的交互情况。
[0059]为解决上述问题,该装置设计了多人任务队列的方法,队列记录了具体哪个虚拟用户要执行哪个任务的执行序列,调度程序会根据该序列顺序执行
[0060]同时项目还需要对服务器模块的功能正确性进行测试,来校验服务器的功能是否按照设计来执行。例如测试玩家在创建角色名时候,角色名字如果符合长度与字符的要求,服务器是否能创建成功,如果不符合,是否能返回创建失败和失败原因的信息。
[0061]为解决上述问题,该装置可以进一步包括功能测试脚本模块和单元测试框架模块,
[0062]所述功能测试脚本模块用于存储测试所使用的用例脚本,按照用例脚本初始化虚拟用户对象,并和游戏服务器建立连接,登陆服务器并完成相应的测试任务,获取服务器返回的数据属性值,来校验服务器的功能是否正确;
[0063]单元测试框架模块用于组织功能测试。
[0064]可选地,该装置进一步包括调度模块,用于调用虚拟用户对象模块模拟出多个虚拟用户和服务器进行交互。其中,所述调度模块采用协程技术在多个虚拟用户的任务之间进行切换。
[0065]所述调度模块为每个虚拟用户分配执行时间段;
[0066]虚拟用户在对应的执行时间段内,处理服务器发来的消息队列包,发送心跳消息包给服务器,以及并执行任务队列中的一个任务。
[0067]本申请实施例还提供了一种通用的服务器压力测试方法,包括如下步骤:
[0068]步骤A、定义虚拟用户发送每个特定网络包对象的动作,每个动作里面定义了该动作要发送的网络包对象,期望服务器返回的网络包对象,以及该动作接受的输入参数;
[0069]步骤B、通过输入参数以及玩家角色的属性值构造好要发送给服务器的网络包对象,将所述网络包对象转换成为二进制码流,并对所述二进制码流进行封装得到网络数据包,将所述网络数据包通过与服务器适配的网络协议发送到服务器;
[0070]步骤C、接收来自服务器的网络数据包,对所述网络数据包进行解封装,将解封装得到的二进制码流还原成具体的网络包对象,如果收到期望的网络包对象,认为动作成功执行,否则认为这个动作执行不成功。
[0071 ] 可选地,步骤B对所述二进制码流进行封装之前进一步包括:对二进制码流加密;
[0072]步骤C所述将解封装得到的二进制码流还原成具体的网络包对象之前,进一步包括:对二进制码流进行解密。
[0073]可选地,该方法进一步包括:记录从发送网络包对象到接收到期望服务器返回的网络包对象的时间作为响应时间。
[0074]可选地,步骤A之前进一步包括:设置虚拟用户对象的任务队列,并保存虚拟玩家角色的属性,所述任务由一系列动作组成,并加入了逻辑判断处理。
[0075]可选地,该方法进一步包括:模拟出多个虚拟用户和服务器进行交互。
[0076]可选地,采用协程技术在多个虚拟用户的任务之间进行切换。
[0077]可选地,为每个虚拟用户分配执行时间段;
[0078]所述采用协程技术在多个虚拟用户的任务之间进行切换包括:
[0079]虚拟用户在对应的执行时间段内,处理服务器发来的消息队列包,发送心跳消息包给服务器,以及执行任务队列中的一个任务。
[0080]请参考图1,其为本发明一个具体实施例中的压力测试装置的架构示意图。如图1所示,压力测试装置100与游戏服务器115之间通过收发模块进行网络消息包的收发。由于不同的游戏项目,可能会采用不同的网络协议,该实施例中设计了三种不同类型的收发模块(收发Socket模块112、收发HTTP模块113、收发WebSocket模块114)用于适配不同游戏服务器项目,根据游戏服务器115采用的网络协议,其中的一个收发单元处于使能状态并进行网络通信。其中,
[0081]收发Socket单元112用于适配采用socket长连接模式的游戏服务器,和服务器建立socket连接,判断socket连接上有无消息包。
[0082]收发HTTP单元113用于适配采用HTTP协议进行通信的游戏服务器。发送HTTP协议网络数据包,构造HTTP包头,读取HTTP返回包,判断HTTP返回码。
[0083]收发WebSocket单元114用于适配采用WebSocket协议通信的游戏服务器。该模块包含和服务器建立WebSocket连接,读取包掩码并解析网络包,构造网络包,发送消息包和读取消息包的功能。
[0084]在三个收发模块之上是封装模块111。收发模块收取的服务器网络包会交给封装模块111进行解封装,来自上层的二进制码流在封装模块111封装成网络数据包后交给收发模块发送到游戏服务器。封装模块111用于在封装网络数据包的时候,在网络数据包添加上标识号,长度,校验位等字段,以及当收发模块获取到游戏服务器返回来的网络数据包后,从网络数据包中解析读取这些字段,得到二进制码流。由于不同项目封装网络包的方式不一样,封装模块111需要为具体项目适配相应的封装和解封装的功能单元。
[0085]在封装模块111之上的是加密解密模块110。大部分项目都会对网络数据包进行加密后再发送,加密解密模块110用于将来自字节解析模块108的二进制码流加密后发送到封装模块111,以及将来自封装模块111的二进制码流进行解密后发送到字节解析模块108。由于不同的项目,加密解密方式不一样,加密解密模块110需要为具体项目适配相应的加密解密功能单元。
[0086]在加密解密模块110之上是项目的字节解析模块108,字节解析模块108用于将 来自加密解密模块110的二进制码流还原成具体的数据属性值,以及将数据属性值输出成二进制码流。每个类型的网络数据包是一个网络数据包类,对于每个网络数据包类都需要定义该包有哪些属性值,同时都需要实现两个函数接口: 一个函数接口用于通过包属性值获得该包的二进制码流,另一个函数接口用于根据二进制码流设置包的属性值内容。上述函数接口可用与服务器无关的编程语言来实现。由于函数接口与项目无关,这样避免了依赖项目的代码模块,做到了适配各种项目。
[0087]由于需要字节解析模块108对二进制码流进行解析,为提高工作效率,本实施例中,该压力测试装置100中还包括了解析工具库109,与字节解析模块108处于同一层,用于提供了各种解析二进制码流的公共方法,以便字节解析模块108调用。它包括以下方法:将不同长度的整形,浮点型,字符型,长整形的数据导出成二进制码流,以及通过二进制码流还原出上述值类型的方法,以及定义大端存储或小端存储网络字节的方法。将网络包对象属性值导出成二进制码流,基本上属性值都不超出整形,浮点型,字符型,布尔型等基本值类型,项目间具备很大的共性。通过解析工具库109,可以提高压力测试装置100适配具体项目的效率。
[0088]由于目前很多手游项目的网络数据包实现都基于谷歌的protobuf技术,该技术提供了统一的网络包与字节流互相转化模块,项目只需要提供其网络包定义的proto文件即可。由于该实施例采用python语言开发,开发者可以采用protobuf提供的python工具,将proto文件导出成python语言定义的网络包模块,即可实现所有网络包的读取与写入函数,从而实现字节解析模块108。
[0089]在字节解析模块之上是动作模块106,该模块用于定义虚拟用户的每个发包动作。将压力测试装置100发的每一种网络包视为一个特定动作,每个动作里面定义了该动作要发送的网络包对象,期望服务器返回的网络包对象,以及该动作接受的输入参数。动作模块106通过输入的参数,以及玩家角色的属性值构造好要发送给服务器的网络包对象。
[0090]由于动作模块106中定义了期望游戏服务器返回的网络包对象,在虚拟用户对象调用该动作后,如果收到期望的网络包对象,认为该动作成功执行,否则认为这个动作执行不成功。同时会记录下发包与收到返回包的时间,作为该包的响应时间;如果存在某个发送的网络包,没有返回包,可以在动作模块106不指定具体的返回包,这样机器人调用该动作时,将不记录这个动作是否执行成功,并且不记录响应时间。记录响应时间的功能由响应时间记录模块107实现。
[0091]在动作模块106之上是任务模块105,任务模块105定义了虚拟用户比较复杂的操作,任务模块105的每个任务是由一系列动作组成,并加入了逻辑判断处理。以登陆任务为例,登陆任务可能会包括连接服务器,验证客户端版本信息,发送帐号信息,根据服务器返回值,判断如果是新用户,会创建新角色,创建角色名,进入游戏场景,如果是老用户,会选取旧有角色,进入游戏场景。任务模块105就是将这种比较复杂,并且会被虚拟用户经常调用的行为变成一个个的任务对象,方便上层的虚拟用户对象与功能测试框架的调用。
[0092]任务模块105之上就是虚拟用户对象模块103,用于设置虚拟用户对象的任务队列,任务模块105的所有任务所包含的所有动作,构成了这个虚拟用户对象的“行为”,同时虚拟用户对象模块103保存了虚拟玩家角色的所有属性,例如等级,金钱,体力等,这些属性值构成了这个虚拟用户的“属性”。这样一个虚拟用户对象,具备了“属性”,也具备了“行为”,该虚拟用户对象既能单独运行,用于服务器功能测试;大量的虚拟用户对象被同时调用,用于服务器压力测试。
[0093]功能测试脚本模块102,是用于存储测试所使用的用例脚本,按照用例脚本初始化虚拟用户对象,并和游戏服务器建立连接,登陆服务器并完成相应的测试任务,获取服务器返回的数据属性值,来校验服务器的功能是否正确。例如,有时候玩家给角色起名字时候,服务器会对角色名字有长度限制,以及字符内容有限制,为测试该功能是否正确,可以编写一个测试脚本,让虚拟用户登陆服务器,创建角色并给角色起名字,通过服务器返回的消息包,判断角色名字是否被服务器接收,如果创建成功,则删除该角色,退出服务器,并运行下一个用例。这样可以通过编写不同测试用例,来测试不同的名字情况,避免了手工操作。
[0094]单元测试框架模块101用于组织功能测试。一个完整的测试,需要包括测试环境准备,测试执行,测试校验,测试环境清理等。利用一个成熟的测试框架,将测试脚本组织起来,方便了测试脚本开发与运行。
[0095]调度模块104依赖于的虚拟用户对象来对服务器进行压力测试,它模拟大量的虚拟用户,和游戏服务器进行交互,从而对服务器造成压力。
[0096]下面结合图2,来详细说明压力测试装置100如何通过调度虚拟用户完成压力测试。由于多线程切换会导致占用cpu性能过高,本实施例中采用协程技术。协程技术是用软件的方法来模拟多线程,是在单个线程下对程序块进行切换轮流执行。同时,在出现10阻塞时,切换到其他程序块执行,当10阻塞解决后,再切换到原来的程序块执行。压力测试装置100在模拟大量虚拟用户的时候,是在执行完一个虚拟用户A的任务后,马上切换到另外一个虚拟用户B执行其设定的任务,虚拟用户A需要执行的下个任务会放到调度队列末尾,等待队列前面的都执行完后再被执行。同时,如果虚拟用户在未即时收到服务器的返回包时,也会交出执行权,避免执行阻塞。用单个虚拟用户来看,压力测试装置100的调度模块104会给分配给它执行的时间段,虚拟用户需要将自己执行的一系列的任务或者动作,合理拆开并分配到系统给它的时间段上去执行。
[0097]同时,游戏服务器一般不定期发送大量网络包给虚拟用户,虚拟用户需要及时收取并响应这些网络包,否则服务器会认为该用户掉线,断开与虚拟用户的连接。例如,有的游戏服务器会定时给虚拟用户发送心跳包,如果虚拟用户不返回一个应答包,服务器会断开连接。有的游戏服务器还需要虚拟用户定期给服务器主动发送心跳包,来确认该用户在线。
[0098]为解决上述问题,本实施例用图2示例所示方法:每个虚拟用户会有一个任务队列202,该队列记录了该虚拟用户需要循环执行的任务,包括任务1,任务2,任务3,,调度模块201会根据用户队列上存储的任务列表,依次调用任务,任务队列执行完成后,又会从头继续调用,一直循环下去。在调度完一个虚拟用户的一个任务后,会切换到下一个虚拟用户的任务并以此类推,当所有虚拟用户都调度完一个任务后,再切换回来调度该虚拟用户的下个任务。在分配给每个虚拟用户的执行时间段中,虚拟用户除了要执行某一个任务,还需要在执行任务之前,处理服务器发来的消息队列包,以及发送心跳消息包给服务器。当某一个虚拟用户没有收到期望返回的网络包时,虚拟用户会主动交出执行权,切换到下一个虚拟用户,避免了为等待网络包返回而引起的执行阻塞问题。
[0099]如图2所示,处理消息队列,心跳包发送以及任务1定义了在虚拟用户1的调度时间段内需要执行的工作。
[0100]处理消息队列用来收取上个时间段到当前时间段之间服务器发送过来的消息包,如果服务器发送了心跳包,则还需要返回服务器应答包。
[0101]心跳包发送用于在指定时间间隔给服务器发送心跳包,它会记录上一次发送心跳包的时间,如果当前时间间隔超过了设定间隔,将发送心跳包给服务器。
[0102]通过上述设计,避免了虚拟用户应答服务器不及时,以及解决了在协程调度下,定时发送心跳包的问题。
[0103]下面结合图3,来详细解释压力测试装置100如何进行虚拟用户之间的切换调度。压力测试装置100除了会在完成一个虚拟用户的任务后切换到其它虚拟用户,还会在没有收到期望的服务器返回包的时候切换到其它虚拟用户。有些情况下,游戏服务器会在一定时间以后才返回应答的网络数据包给虚拟用户,在等待的这个期间内,实际上压力测试装置100已经切换到其他虚拟用户去执行任务了。
[0104]实现该机制的原理是:压力测试装置100的网络连接采用非阻塞方式,当虚拟用户执行一个具体任务,发送消息包到游戏服务器后,检查游戏服务器是否有网络包返回,如果有网络包返回,则将所有返回的网络包逐个判断是否是期望的返回包,如果不是,则执行该包对应的处理函数;如果是,则执行该期望包的处理函数,并标注该任务执行成功,执行成功后,会交出执行权,让机器人调度下个虚拟用户的任务。如果检查服务器没有期望的网络包返回,该虚拟用户并不会一直等待下去,而是交出执行权,等待下次调度到该虚拟用户时,再检查是否收到服务器返回的期望包。如果等待的时间超过一定时长,会标注该任务执行失败,该虚拟用户会接着执行下个任务。
[0105]如图3所示为有两个虚拟用户时候的调度流程,主线程首先调度虚拟用户1(步骤301),执行其队列任务1(步骤302),任务执行完成后,会切换回主线程(步骤303),主线程 接着调度虚拟用户2(步骤304),执行其队列任务1(步骤305),任务执行完成后,切换回主线程(步骤306);主线程接着调度虚拟用户1(步骤307),执行任务队列里的任务2,此时虚拟用户1发送了消息包(步骤308),并且没有及时收到服务器的返回包时,会切换回主线程(步骤309),主线程调度虚拟用户2(步骤310)并执行其队列任务2(步骤311),当执行完任务2后,切换回主线程(步骤312),并重新调度虚拟用户1(步骤313),查询是否收到上个任务没有收到的返回包,当确认收到返回包后,虚拟用户1的任务2才算执行完成(步骤314),再切换回主线程并调度虚拟用户2(步骤315-316),执行其队列任务3(步骤317)。
[0106]该调度方式,避免了当虚拟用户/协程没有及时收取到服务器的返回包时候,引起的对机器人执行的阻塞问题。
[0107]本申请另一实施例提供了解决多人逻辑交互的压力测试场景的实施方案。如图4所示,采用多个虚拟用户任务队列,队列中每个成员内容包括:具体的虚拟用户和该用户具体要执行的任务。图例里面模块403,404,405即是队列里面存储的内容,调度模块会依次循环遍历该队列的成员,调度具体的用户来执行具体的任务,来完成多人交互任务。例如,压测好友功能,需要用户A加用户B好友,接着用户A再解除和用户B的好友关系,就可以将该上述场景,设计成一个任务队列:
[0108]任务1,用户A发起好友请求,
[0109]任务2,用户B同意该请求,
[0110]任务3,用户A解除和用户B的好友关系。
[0111]在执行每个具体用户任务之前,该虚拟用户需要处理服务器发过来的消息队列,以及发送心跳包给服务器。
[0112]通过多人任务队列机制,解决了多人逻辑交互的压力测试场景问题。
[0113]应当理解,虽然本说明书是按照各个实施方式描述的,但并非每个实施方式仅包含一个独立的技术方案,说明书的这种叙述方式仅仅是为清楚起见,本领域技术人员应当将说明书作为一个整体,各实施方式中的技术方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。
[0114]以上所述仅为本申请的较佳实施例而已,并不用以限制本申请的保护范围,凡在本申请技术方案的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。
【主权项】
1.一种通用的服务器压力测试装置,其特征在于,该装置自下而上包括:收发模块、封装模块、字节解析模块、动作模块; 所述收发模块用于适配所要测试的服务器所采用的网络协议,将来自上层的网络数据包发送到服务器;或者接收来自服务器的网络数据包,并将所述网络数据包发送到上层; 封装模块,用于对来自下层的网络数据包进行解封装,将解封装得到的二进制码流发送到上层;或者对来自上层的二进制码流进行封装得到网络数据包,将所述网络数据包发送到下层; 字节解析模块,用于将来自下层的二进制码流还原成具体的网络包对象,并设置对象的属性值,同时将具体的网络包对象发送到上层,或者将来自上层的网络包对象转换成为二进制码流并发送到下层; 动作模块,用于定义虚拟用户发送每个特定网络包对象的动作,每个动作里面定义了该动作要发送的网络包对象,期望服务器返回的网络包对象,以及该动作接受的输入参数;动作模块通过输入参数以及玩家角色的属性值构造好要发送给服务器的网络包对象,并发送到下层;以及从下层接收返回的网络包对象,如果收到期望的网络包对象,认为该动作成功执行,否则认为这个动作执行不成功。2.根据权利要求1所述的装置,其特征在于,在封装模块之上,以及字节解析模块之下还包括加密解密模块,用于对来自上层的二进制码流加密,将加密后的二进制码流发送到下层,或者对来自下层的二进制码流进行解密,将解密后的二进制码流发送到上层。3.根据权利要求1所述的装置,其特征在于,所述字节解析模块所在的层进一步包括解析工具库,用于提供各种解析二进制码流的公共方法,以便字节解析模块调用。4.根据权利要求1所述的装置,其特征在于,所述收发模块包括多个收发单元,每个收发单元用于适配一种网络协议,根据服务器采用的网络协议,其中的一个收发单元处于使能状态并进行网络通信。5.根据权利要求4所述的装置,其特征在于,所述收发模块包括收发Socket单元、收发HTTP单元和收发WebSocket单元。6.根据权利要求1所述的装置,其特征在于,所述字节解析模块包括两个函数接口,一个函数接口用于通过网络包对象获得该网络包对象的二进制码流,另一个函数接口用于根据二进制码流设置网络包对象的属性值,所述函数接口采用与服务器无关的编程语言实现。7.根据权利要求1所述的装置,其特征在于,该装置进一步包括响应时间记录模块,用于记录从动作模块发送网络包对象到接收到期望服务器返回的网络包对象的时间,作为响应时间。8.根据权利要求1所述的装置,其特征在于,在动作模块之上进一步包括任务模块,用于定义虚拟用户的任务,所述任务由一系列动作组成,并加入了逻辑判断处理。9.根据权利要求8所述的装置,其特征在于,在任务模块之上,该装置进一步包括虚拟用户对象模块,用于设置虚拟用户对象的任务队列,并保存虚拟玩家角色的属性。10.根据权利要求9所述的装置,其特征在于,该装置进一步包括功能测试脚本模块和单元测试框架模块, 所述功能测试脚本模块用于存储测试所使用的用例脚本,按照用例脚本初始化虚拟用户对象,并和游戏服务器建立连接,登陆服务器并完成相应的测试任务,获取服务器返回的数据属性值,来校验服务器的功能是否正确; 单元测试框架模块用于组织功能测试。11.根据权利要求9所述的装置,其特征在于,该装置进一步包括调度模块,用于调用虚拟用户对象模块模拟出多个虚拟用户和服务器进行交互。12.根据权利要求11所述的装置,其特征在于,所述调度模块采用协程技术在多个虚拟用户的任务之间进行切换。13.根据权利要求11所述的装置,其特征在于,所述调度模块为每个虚拟用户分配执行时间段; 虚拟用户在对应的执行时间段内,处理服务器发来的消息队列包,发送心跳消息包给服务器,以及执行任务队列中的一个任务。14.一种通用的服务器压力测试方法,其特征在于, 步骤A、定义虚拟用户发送每个特定网络包对象的动作,每个动作里面定义了该动作要发送的网络包对象,期望服务器返回的网络包对象,以及该动作接受的输入参数; 步骤B、通过输入参数以及玩家角色的属性值构造好要发送给服务器的网络包对象,将所述网络包对象转换成为二进制码流,并对所述二进制码流进行封装得到网络数据包,将所述网络数据包通过与服务器适配的网络协议发送到服务器; 步骤C、接收来自服务器的网络数据包,对所述网络数据包进行解封装,将解封装得到的二进制码流还原成具体的网络包对象,如果收到期望的网络包对象,认为动作成功执行,否则认为这个动作执行不成功。15.根据权利要求14所述的方法,其特征在于,步骤B对所述二进制码流进行封装之前进一步包括:对二进制码流加密; 步骤C所述将解封装得到的二进制码流还原成具体的网络包对象之前,进一步包括:对二进制码流进行解密。16.根据权利要求14所述的方法,其特征在于,该方法进一步包括:记录从发送网络包对象到接收到期望服务器返回的网络包对象的时间作为响应时间。17.根据权利要求14所述的方法,其特征在于,步骤A之前进一步包括:设置虚拟用户对象的任务队列,并保存虚拟玩家角色的属性,所述任务由一系列动作组成,并加入了逻辑判断处理。18.根据权利要求17所述的方法,其特征在于,该方法进一步包括:模拟出多个虚拟用户和服务器进行交互。19.根据权利要求18所述的方法,其特征在于,采用协程技术在多个虚拟用户的任务之间进行切换。20.根据权利要求18所述的方法,其特征在于,为每个虚拟用户分配执行时间段; 所述采用协程技术在多个虚拟用户的任务之间进行切换包括: 虚拟用户在对应的执行时间段内,处理服务器发来的消息队列包,发送心跳消息包给服务器,以及执行任务队列中的一个任务。
【专利摘要】本申请公开了一种通用的服务器压力测试装置,该装置自下而上包括:收发模块、封装模块、字节解析模块、动作模块;收发模块适配所要测试的服务器所采用的网络协议,收发网络数据包;封装模块对来网络数据包进行解封装得到二进制码流,对来自上层的二进制码流进行封装得到网络数据包;字节解析模块将来自下层的二进制码流还原成具体的网络包对象,或者将来自上层的网络包对象转换成为二进制码流;动作模块定义虚拟用户发送每个特定网络包对象的动作,每个动作里面定义了该动作要发送的网络包对象并发送,如果收到期望的网络包对象,认为该动作成功执行,否则认为这个动作执行不成功。本申请还公开了一种通用的服务器压力测试方法。
【IPC分类】G06F11/34
【公开号】CN105487965
【申请号】CN201510998472
【发明人】罗运鹏
【申请人】北京畅游天下网络技术有限公司
【公开日】2016年4月13日
【申请日】2015年12月28日

最新回复(0)