不论是做接口测试还是性能测试,本质上都是在和协议打交道。除了最常见的 Http 协议外,当遇到其它的通信协议时,我们要如何快速学习它,以便能够更好地测试它呢?
什么是通信协议呢?通信协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。简单而言,就是机器之间的 “语言”。区别于编程语言(JAVA、C 等,那是人机之间的语言)。如图 1-1 所示,在不同的系统层级中,存在着各类不同的通信协议。
图 1-1 不同系统层级中的协议分布
协议是由三个要素组成: 语义:表示要做什么; 语法:表示要怎么做;时序:表示做的顺序。所以,我们在学习协议时,只要弄清楚这三个信息,就可以快速掌握并使用它。我们需要关注:1.通讯协议的基本原理 ;2.了解协议的特点及应用场景;3.学会如何发起一个对应请求并接收数据。
注意观察下图 1-1,细心的你可能会发现,为什么没有我们常见的 Socket 协议?
Socket 是对 TCP/IP 协议的封装,它本身并不是协议,而是一个调用接口(API)。TCP/IP 是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口,提供给程序员做网络开发所用的接口,这就是 Socket 编程接口。Socekt 协议位于应用层和传输层之间。它有个说法叫 “万能协议”,有些系统在应用层使用的是混合协议时,可以统一转换成 Socket 来处理。
小陈同学遇到了一个场景,系统接口是通过 tcp 长链接来实现的,现在需要针对这个接口进行性能压测,那么他将如何开展工作呢?
首先,要了解下 tcp 长链接是什么东西(可以通过检索资料、和开发沟通、和组内其他成员沟通来获取这方面的信息,先知道是什么),正常情况下,tcp 链接在数据传输完成后,就会主动释放,而在某些场景下,我们需要保持这个链接,这样做的好处是减少连接建立过程的耗时,同时,基于长链接,两端可以很方便地 Push 数据,做交互,典型的场景就是聊天窗口。而保持长链接的方式通常有两种:系统层的 KeepAlive 机制,和应用层的心跳检测。
在了解了什么是 tcp 长链接后,就要想办法把这个东西模拟出来,进一步去理解它的原理,那么有哪些工具可以模拟这类的 tcp 长链接呢?我们以测试人员最常用的 Jmeter 工具来说明:在 TCP Sampler 中,有个 Re-use connection,如果选中,连接会一直处于打开状态。了解到这个信息后,小陈就知道如何开展这个测试了(TCP 的报文如何获取,就在不本篇展开,具体可以查找 Wireshark 工具的使用)。
图 1-2Jmete 中的长链接选项
通常情况下,小陈的工作可以正常开展,这个话题也就结束了。但小陈毕竟不是普通的小陈,他有自己的思考。还记得我们前面提到的关于通信协议学习的三个内容吗?我们知道了 tcp 长链接的原理,也清楚了如何去模拟一个长链接。但是忽略了长链接的特点和应用场景了。经过查阅相关资料,小陈总结了长连接和短链接各自的优缺点:
1、长连接可以省去较多的 TCP 建立和关闭的操作,减少浪费,节约时间,但是一直连接对于客户端来说比较耗电;
2、对于频繁请求资源的客户来说,较适用长连接;
3、客户端与服务端之间的连接如果一直不关闭的话,会存在一个问题;
4、随着客户端连接越来越多,server 早晚有扛不住的时候,这时候 server 端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致服务端服务受损;
5、一次 TCP 连接和断开需要 7 个来回,如果客户端请求频繁,将在 TCP 的建立和关闭操作上浪费大量时间和带宽;
通过总结这些特点,小陈又梳理出了关于这次测试的其他需要关注的测试点:
关注服务器建立长链接的数量,避免过多无用的长链接;
和开发沟通长链接保持的时间和检测机制,避免有用的长链接失效;
它的释放机制是如何保障的(毕竟不能一直长链接)
事情好像告一段落了。小陈奇奇怪怪的知识又增加了一些。但小陈又进一步做了思考:Jmeter 中 Re-use connection 是如何实现的呢?它的心跳检测机制是如何实现的?研发使用长链接的场景是否合理?是否是必要的?嗯,其实还是有很多东西可以去探讨的。
测试人员的成长,就是在这些一步步的思考中沉淀下来了。遇到一个问题,有的人解决了眼前的问题,有的人思考了问题背后的原因(5Why),有的人会进一步地联想和总结。1 年,2 年,N 年之后,差距就逐步体现了。
不要被测试这个角色所限制,你应该有更大的发挥空间。