测试基础 协议的学习技巧

CKL的思考 · 2022年12月01日 · 最后由 Just4life 回复于 2022年12月02日 · 6472 次阅读

不论是做接口测试还是性能测试,本质上都是在和协议打交道。除了最常见的 Http 协议外,当遇到其它的通信协议时,我们要如何快速学习它,以便能够更好地测试它呢?

01

什么是通信协议呢?通信协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。简单而言,就是机器之间的 “语言”。区别于编程语言(JAVA、C 等,那是人机之间的语言)。如图 1-1 所示,在不同的系统层级中,存在着各类不同的通信协议。

图 1-1 不同系统层级中的协议分布

协议是由三个要素组成: 语义:表示要做什么; 语法:表示要怎么做;时序:表示做的顺序。所以,我们在学习协议时,只要弄清楚这三个信息,就可以快速掌握并使用它。我们需要关注:1.通讯协议的基本原理 ;2.了解协议的特点及应用场景;3.学会如何发起一个对应请求并接收数据

02

注意观察下图 1-1,细心的你可能会发现,为什么没有我们常见的 Socket 协议?

Socket 是对 TCP/IP 协议的封装,它本身并不是协议,而是一个调用接口(API)。TCP/IP 是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口,提供给程序员做网络开发所用的接口,这就是 Socket 编程接口。Socekt 协议位于应用层和传输层之间。它有个说法叫 “万能协议”,有些系统在应用层使用的是混合协议时,可以统一转换成 Socket 来处理。

03

小陈同学遇到了一个场景,系统接口是通过 tcp 长链接来实现的,现在需要针对这个接口进行性能压测,那么他将如何开展工作呢?

首先,要了解下 tcp 长链接是什么东西(可以通过检索资料、和开发沟通、和组内其他成员沟通来获取这方面的信息,先知道是什么),正常情况下,tcp 链接在数据传输完成后,就会主动释放,而在某些场景下,我们需要保持这个链接,这样做的好处是减少连接建立过程的耗时,同时,基于长链接,两端可以很方便地 Push 数据,做交互,典型的场景就是聊天窗口。而保持长链接的方式通常有两种:系统层的 KeepAlive 机制,和应用层的心跳检测。

在了解了什么是 tcp 长链接后,就要想办法把这个东西模拟出来,进一步去理解它的原理,那么有哪些工具可以模拟这类的 tcp 长链接呢?我们以测试人员最常用的 Jmeter 工具来说明:在 TCP Sampler 中,有个 Re-use connection,如果选中,连接会一直处于打开状态。了解到这个信息后,小陈就知道如何开展这个测试了(TCP 的报文如何获取,就在不本篇展开,具体可以查找 Wireshark 工具的使用)。


图 1-2Jmete 中的长链接选项

04

通常情况下,小陈的工作可以正常开展,这个话题也就结束了。但小陈毕竟不是普通的小陈,他有自己的思考。还记得我们前面提到的关于通信协议学习的三个内容吗?我们知道了 tcp 长链接的原理,也清楚了如何去模拟一个长链接。但是忽略了长链接的特点和应用场景了。经过查阅相关资料,小陈总结了长连接和短链接各自的优缺点:

1、长连接可以省去较多的 TCP 建立和关闭的操作,减少浪费,节约时间,但是一直连接对于客户端来说比较耗电;

2、对于频繁请求资源的客户来说,较适用长连接;

3、客户端与服务端之间的连接如果一直不关闭的话,会存在一个问题;

4、随着客户端连接越来越多,server 早晚有扛不住的时候,这时候 server 端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致服务端服务受损;

5、一次 TCP 连接和断开需要 7 个来回,如果客户端请求频繁,将在 TCP 的建立和关闭操作上浪费大量时间和带宽;

通过总结这些特点,小陈又梳理出了关于这次测试的其他需要关注的测试点:

  1. 关注服务器建立长链接的数量,避免过多无用的长链接;

  2. 和开发沟通长链接保持的时间和检测机制,避免有用的长链接失效;

  3. 它的释放机制是如何保障的(毕竟不能一直长链接)

05

事情好像告一段落了。小陈奇奇怪怪的知识又增加了一些。但小陈又进一步做了思考:Jmeter 中 Re-use connection 是如何实现的呢?它的心跳检测机制是如何实现的?研发使用长链接的场景是否合理?是否是必要的?嗯,其实还是有很多东西可以去探讨的。

测试人员的成长,就是在这些一步步的思考中沉淀下来了。遇到一个问题,有的人解决了眼前的问题,有的人思考了问题背后的原因(5Why),有的人会进一步地联想和总结。1 年,2 年,N 年之后,差距就逐步体现了。

不要被测试这个角色所限制,你应该有更大的发挥空间。

共收到 4 条回复 时间 点赞

协议测试,我个人觉得,首先得拿着 RFC 标准仔细去看看每个字段/字节/bit 的含义,才能搞清楚。拿最简单的 http1.0 和 http2.0,你得知道他们的差异在哪里,不然你怎么测?

Just4life 回复

基本上我们不会去测试协议本身,只是使用协议。所以不太需要 “拿着 RFC 标准仔细去看看每个字段/字节/bit 的含义”。当然如果你是测试协议,或者自定义一些私有协议,那是需要去理解协议中的细节。

个人理解的是,协议的学习技巧最直接的是看报文结构。
不需要全部理解报文结构内全部字段的意思,但是要知道报文结构内常用的字段。
例如:HTTP 协议的请求和响应报文结构,
大概记住报文结构之后,这样不管是写 Python,JAVA,还是使用工具,HTTP 的开始都是 client.method,之后就是报文结构的其他字段。
可以大概看一下 httpclient 的方法,基础的方法都是模拟的 HTTP 头部字段。

CKL的思考 回复

那我们理解的协议测试可能不太一样哈。

如果只是基于协议 + 业务层面的,看网络报文是个不错的方式

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册