一、前言
协议测试是比较常见的测试方法之一,有时也称接口测试。在白盒测试里面也有一个接口测试,是针对代码里面的每个调用方法来进行测试,因此还是将通讯接口的测试称协议测试比较好。
游戏前后端通讯是基于TCP(或UDP)网络传输层协议模型来设计的,绝大多数选择TCP,但也有部分为UDP。他们之间的区别可以去网上找各种资料来学习,尤其是在做性能测试时,对这块的了解是必要的。本篇文章介绍的主要内容包括:
1、客户端与服务端的通讯协议的组成方式。
2、数据类型以及在协议中的表示范围。
3、介绍协议测试的一些方法(个人经验,欢迎斧正)。
二、协议的组成方式
--------------------------------------------------
标记 | 长度 | 协议号 | 协议序列 | 内 容 | 标记
--------------------------------------------------
FE 00 0E 00 1F 00 00 00 01 00 05 68 65 6c 6c 6f EF EF FF 0E 00 00 1F 01 00 00 00 05 00 68 65 6c 6c 6f 00 00 00 0E 1F 00 00 00 00 01 05 00 68 65 6c 6c 6f
正如上面所展示的内容一样,协议的组成形式还是有一些固定的模式,但其实是变化万千的。以上面第一条为例来说明协议的各个部分,它是由开始标记+协议长度+协议号+协议序列+正式内容+结束标记组成的。
1、开始标记
标记不是必须的,但可以用来作为判断是否是一条协议开始的依据。
2、协议长度
协议长度往往是必须的,一些很奇怪的设计除外,协议的长度是判断一条协议是否接收完成的重要依据。这里大家可以了解一下TCP的粘包问题,在做网络开发的时是必考虑的。
3、协议号
协议号是用来告诉前端或后端这条协议需要用什么方式来解析(读取),也代表了是哪个功能模块。往往程序员会约定针对这条协议,需要发送哪些字段,每个字段以什么样的方式构成。另外有些游戏在进行协议设计的时候分了大协议和小协议。大协议代表系统功能模块,小协议代表这个功能下面的某个子功能。例如背包系统大协议可能是0x002F,而分解装备功能则用小协议可能是0x02表示。这样做还有一个目的,就是可以区分协议的优先级,如某个大协议是需要最优先处理的,当收到这条协议后就会立即进行处理,而其他的协议则放在后面。
4、协议序列
协议序列号用来记录这条协议的顺序编号,用来判断是否存在有协议丢失。虽然说TCP是可靠的协议不会丢包,但是协议里面加一个序号是很有必要的。因为我们的协议包在网络传输过程中是很有可能会被捕获到,如果重复构造这个包,就可以产生一些奇怪的事情发生。
5、协议内容
这里就是前后端程序员约定的需要发送的具体内容了。例如购买道具协议,可能会发道具ID和数量,但也可以加一个字段标记是从哪里购买的。做协议测试的时候,我们就必须了解每条协议内容具体包含哪些字段,表示哪些信息,然后针对性的做用例设计,来确保功能的稳定。
6、结束标记
标记不是必须的,但可以用来判断是否是一条协议的结束。
7、协议加密
由于协议在网络传输过程中,很容易被他人所捕获,因此协议内容的安全性是很有必要的。上面展示的三条协议的内容是很容易分析出来,而且很快就可以得到协议内容是“hello”。进行协议加密,就是防止他人破解协议的内容,从而加强安全性。协议的加密有很多种方式,我们做协议测试的时候往往是对明文进行测试,若要了解协议加密,可以看密码学相关的资料。
每个游戏或者每个团队在对通讯协议设计时,大体上会按照上面的这些内容进行选择组合,而业务技术往往只会关注协议内容里面的组成形式,总体协议结构对于同一个游戏基本上是确定的。大家可以选一些游戏进行捕获协议,来看看这些游戏的协议结构是怎样组成的。
三、协议字段类型
协议的组成结构可以因人而异,那么针对协议里面的每个字段的设计可能更是五花八门了。上述的协议结构中:标记、协议长度、协议序列号对于每条协议是已经封装好且固定不变的。协议内容中每个字段的大小和类型是根据实际业务需要进行协商定义的。
这里我们先来说一下程序中的数据类型:
字符类型:char 、byte、 1个字节。可表示-128 ~ 127 或 0 ~ 256 范围内的整数。
[整数]短整型:short 、2个字节。可表示-32768~32767 或 0 ~ 65536范围内的整数。
[整数]整型:int、4个字节 。可表示-2147483648~2147483647 或 0~4294967296范围内的整数。
[整数]长整型:long long、int64、8个字节。可表示范围-2^63~2^63-1 或 0 ~ 2^64 范围内的整数
[小数]单精度浮点数:float 、4个字节。可表示范围:-/+3.4e38(精确到6位小数)