接口并发测试之:WebSocket从原理到代码实战,我没草率~

简介: 接口并发测试之:WebSocket从原理到代码实战,我没草率~

1. WebSocket协议详解


1.1 WebSocket的由来

在《接口测试开发之:一图搞懂HTTP协议与HTTPS协议的传输过程》这篇博文,小鱼分析了一下HTTP和HTTP的协议传输过程,

但是呢,没有详细的介绍WebSocket,

所以,这篇就专门来介绍WebSocket的原理及并发实战。


在介绍WebSocket的由来之前,我们先看一个例子,


客户端:你好,MM,有没有新消息(request)

服务端:没有(response)

客户端:你好,MM,有没有新消息(request)

服务端:没有(response)

客户端:你好,MM,有没有新消息(request)

服务端:没有,没有,怎么还一直问呢(response)

客户端:亲,有没有新消息(request)

服务端:有了有了,这就告诉你(response)

客户端:亲,有没有新消息(request)

服务端:又来了…没有没有(response) -loop


那么上面这个例子,就是Ajax轮询原理。

我们可以看到,Ajax轮询需要服务器有很快的处理速度和资源。而long poll需要很高的并发,也就是说同时接待客户的能力。

为了能解决这种过度消耗资源的问题,WebSocket协议就应运而生了。


WebSocket与Ajax(或XHR)的区别:


WebSocket API 在服务器和客户算可以给定的时间范围内任意时刻,互相推送信息

WebSocket并不限于以Ajax(或XHR)方式信息,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;

XHR受域的限制,而WebSocket允许跨域通信。


1.2 WebSocket的原理


同样,我们还是以举例子来看WebSocket实现原理,

场景如下


客户端:你好,MM,我要建立WebSocket协议,需要的服务:chat,WebSocket;协议版本:17(HTTP Request)

服务端:OK,确认,已升级为WebSocket协议(HTTP Protocols Switched)

客户端:亲,麻烦有信息的时候,推送给我哦

服务端:OK,有消息就告诉你

服务端:消息1,巴拉巴拉一大堆

服务端:消息2,巴拉巴拉一大堆

服务端:消息3,巴拉巴拉一大堆

服务端:…有消息,一直巴拉巴拉


从上面的例子,可以看出,只要经过一次HTTP请求,就可以做到源源不断的信息传递。

这样协议也同时解决了langloop以及Ajax轮询的同步有延迟而非常消耗资源的问题。

我们所有的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后在传送给相应的Handler来处理。


简单的说,就是:我们有一个非常快速的接线员(Nginx),它负责把问题转交给相应的客服(Handler)。


接线员速度起来了,但每次都卡在客服这里(Handler),导致客服每次都要求给5星好评,但是这速度太慢,只能给1星,怎么办呢?

WebSocket就解决了这个难题,建立后,可以直接跟接线员建立持久连接,这必须5星好评。


WebSocket只需要一次HTTP握手,就可以持久通话


2. WebSocket的请求


2.1 WebSocket模块

都说第三方库是万能的,这话没毛病。

由于request模块是基于HTTP协议的,所以如果要发送WebSocket请求,就需要安装第三方的WebSocket模块。

安装方式,必须是pip安装


pip install websocket
pip install websocket-client

2.2 WebSocket请求与响应

WebSocket语法也相当简单,发送一个WebSocket的请求连接,通道连接成功之后,可以发送消息,也可以接收消息,

代码如下:


varable = websocket.create_connection(url)

建立连接,此时的url是以ws开头


varable.send(发送内容)

发送带消息的内容,可以是字符串,也可以是列表字典。


具体需要看服务器接收什么数据


varable.recv()

接收服务器消息。


这个区别于HTTP的response的地方于:接收消息是没有超时机制的。

也就是说,一旦建立连接通道后,就会一直处理等待状态,知道接收到数据才会关闭recv()方法。


所以WebSocket相对HTTP还是简单很多,建立连接,然后发送消息和接收消息。


2.3 WebSocket请求实例

再多的理论,缺少了代码,都让人很难理解,

那就是老规矩,上代码:


# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2021-4-22
"""
#导入WebSocket模块
import websocket
#创建url
url = 'ws://www.xxxx.com/xxx'
#使用create_connection方法向聊天室发起url链接,并赋值给变量ws
ws = websocket.create_connetcion(url)
#连接完成之后通过send()方法发送请求内容
ws.send("{"request":1234,"service":1001,"name":“carl”}")
#将返回的信息赋值给new_masc
new_msgc = ws.recv()
print(new_msgc)
#再次通过send()方法,发送聊天内容
ws.send("{"request":1234,"service":1002,"name":“DJ”,"message":"balabala"}")
new_msgd = ws.recv()
print(new_msgd)

这段代码,看着很简单,主要三点内容:


通过websocket.create_connetcion()方法来发起url链接

然后再通过send()方法发送请求内容

将服务器返回的内容赋值给new_msg


3. WebSocket并发实战


3.1 整理并发需求


为了便于理解,咱们的并发需求及指标,还是参照小鱼的这篇《接口并发性能测试开发之:从测试方案设计、测试策略、指标分析到代码编写,这一篇全搞定。》。


需求内容:

中午和晚上是订餐的高峰期,除了订单的并发量很大以外,对老板的并发量也很大,而老板的订单通知则是通过WebSocket来发送,获取订单通知之前需要建立WebSocket连接,所以需要通过并发来测试客户端对服务器的WebSocket并发连接成功率。


3.2 提取性能指标

性能指标提取

这个场景,仅仅测试WebSocket并发连接成功率即可。

以客户端向服务器发送100个并发的WebSocket请求为例,需要提取并发指标如下:


连接数

成功连接数

成功连接率

性能指标分析


连接数就是自定义的并发,因为请求简单而且执行比较快,所以直接用100个线程并发,不需要循环次数。

连接成功数就是获取WebSocket的响应数,

连接成功率只需要把成功连接数/总连接数。


3.3 代码编写


还是老规矩,直接上代码,在代码中分析


# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2021-4-22
"""
import threading
import websocket
#初始化几个全局变量
#定义并发数100
THREAD_NUM = 100
#自定义全局变量每个线程需要循环的数量,1
ONE_WORKER_NUM = 1
#设定最开始的成功连接数
success_count = 0
#编写WebSocket连接请求
def websockettest():
  global success_count
  #定义url
  url = "ws://www.xxx.com/serv/push?chann = delivery"
    #使用create_connection方法发送url连接
  ws = websocket.create_connetcion(url)
  #连接完成之后通过send()方法发送请求内容
  ws.send("{'type':'heartbeat','username':'13600001111','message':'ok'}")
  #将返回的信息赋值给new_masc
  msg = ws.recv()
  #连接成功就+1,获取成功次数
  success_count = success_count + 1
'''嵌套指定循环次数的order()函数'''
def  working():
  global ONE_WORKER_NUM
  for i in range(0,ONE_WORKER_NUM):
  websockettest()
 '''自定义main()函数,来执行线程'''
def t():
    #自定义一个空的数组,用来存放线程组
  Threads = []
  #设置循环次数
  for i in range(THREAD_NUM):
  #将working()函数存放到线程中
        t = threading.Thread(target=working,name="T"+ str(i))
         #设定守护线程
        t.setDaemon(True)
        threads.append(t)
    #启动循环次数
  for  t in Threads():
  t.start()
    ##设置阻塞线程
  for t in Threads:
        t.join()
    print ("main thread end")
if __name__ == "__main__":
  t()
  # 结果写入文件
  result = open("E:\Progect\resut.txt","a")
  #总连接次数
  result.write("发起连接数:" + str(THREAD_NUM) + "\n" )
  #成功连接次数
  result.write("成功连接数:" + str(success_count) + "\n" )
  #成功链接率
  result.write("成功链接率:" + str(success_count/THREAD_NUM *100) + "%" + "\n" )
  result.close()


4.总结


更多的接口并发测试内容及实战案例,可以参照下面的博文:


《我这样回答多线程并发,面试官非要跟我做朋友!》

《常见的并发问题有哪些都不知道,还怎么说自己是大佬!!》

《接口测试开发之:Python3,接口并发测试框架(多线程)》

《接口测试开发之:Python3,订单并发性能实战》

《接口并发性能测试开发之:从测试方案设计、测试策略、指标分析到代码编写,这一篇全搞定。》

《接口并发测试之:WebSocket原理是什么,并发框架如何设计,并发代码如何编写,看过这篇,不再懵懂。》


目录
相关文章
|
21天前
|
机器学习/深度学习 PyTorch 算法框架/工具
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
这篇文章介绍了如何使用PyTorch框架,结合CIFAR-10数据集,通过定义神经网络、损失函数和优化器,进行模型的训练和测试。
57 2
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
|
21天前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
28 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
23天前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
28天前
|
安全 JavaScript 网络协议
WebSocket通信协议基础原理与安全威胁
WebSocket通信协议基础原理与安全威胁
68 0
|
30天前
|
前端开发 JavaScript Python
Python Web应用中的WebSocket实战:前后端分离时代的实时数据交换
在前后端分离的Web应用开发模式中,如何实现前后端之间的实时数据交换成为了一个重要议题。传统的轮询或长轮询方式在实时性、资源消耗和服务器压力方面存在明显不足,而WebSocket技术的出现则为这一问题提供了优雅的解决方案。本文将通过实战案例,详细介绍如何在Python Web应用中运用WebSocket技术,实现前后端之间的实时数据交换。
58 0
|
21天前
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
498 1
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
21天前
|
PyTorch 算法框架/工具 计算机视觉
目标检测实战(二):YoloV4-Tiny训练、测试、评估完整步骤
本文介绍了使用YOLOv4-Tiny进行目标检测的完整流程,包括模型介绍、代码下载、数据集处理、网络训练、预测和评估。
66 2
目标检测实战(二):YoloV4-Tiny训练、测试、评估完整步骤
|
2天前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
12 2
|
22天前
|
Java 程序员 应用服务中间件
「测试线排查的一些经验-中篇」&& 调试日志实战
「测试线排查的一些经验-中篇」&& 调试日志实战
18 1
「测试线排查的一些经验-中篇」&& 调试日志实战
|
3天前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
18 2