2024年针对 WebSocket 协议的 Locust 压测脚本实现(基于 Locust 1(2),2024年最新牛皮轰轰

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

前言:

嗨咯铁汁们,很久不见,我还是你们的老朋友凡叔,这里也感谢各位小伙伴的点赞和关注,你们的三连是我最大的动力哈,我也不会辜负各位的期盼,这里呢给大家出了一个针对 WebSocket 协议的 Locust 压测脚本

Locust 默认支持 HTTP 协议(默认通过 HttpUser 类),我们也可以自行实现任意协议的 Client 对它 User 类进行继承(HttpUser 也是继承自 User)并增加所需要的方法,这样也就实现了任意协议的压测。

针对 WebSocket 协议的 Locust 压测脚本实现无非就是三个步骤

  1. 编写一个 WebSocket Client,也就是定义一个 Class,实现 WS连接初始化、事件订阅、消息接收 所需要的方法
  2. 使用 WebSocket Client 继承 User 类,产生 WebsocketUser
  3. 依据测试用例编写压测脚本,使用 WebsocketUser内预定义的方法 实现并发的连接、事件订阅、消息接收

脚本实现参考

from locust import User, task, events, constant
import time
import websocket
import ssl
import json
import jsonpath

def eventType_success(eventType, recvText, total_time):
    events.request_success.fire(request_type="[RECV]",
                                name=eventType,
                                response_time=total_time,
                                response_length=len(recvText))

class WebSocketClient(object):
    
    _locust_environment = None
    
    def __init__(self, host):
        self.host = host
        # 针对 WSS 关闭 SSL 校验警报
        self.ws = websocket.WebSocket(sslopt={"cert_reqs": ssl.CERT_NONE})
        
    def connect(self, burl):
        start_time = time.time()
        try:
            self.conn = self.ws.connect(url=burl)
        except websocket.WebSocketConnectionClosedException as e:
            total_time = int((time.time() - start_time) * 1000)
            events.request_failure.fire(
                request_type="[Connect]", name='Connection is already closed', response_time=total_time, exception=e)
        except websocket.WebSocketTimeoutException as e:
            total_time = int((time.time() - start_time) * 1000)
            events.request_failure.fire(
                request_type="[Connect]", name='TimeOut', response_time=total_time, exception=e)
        else:
            total_time = int((time.time() - start_time) * 1000)
            events.request_success.fire(
                request_type="[Connect]", name='WebSocket', response_time=total_time, response_length=0)
        return self.conn
        
    def recv(self):
        return self.ws.recv()
        
    def send(self, msg):
        self.ws.send(msg)
        
class WebsocketUser(User):
    abstract = True
    def __init__(self, *args, **kwargs):
        super(WebsocketUser, self).__init__(*args, **kwargs)
        self.client = WebSocketClient(self.host)
        self.client._locust_environment = self.environment
        
class ApiUser(WebsocketUser):
    host = "wss://ws.xxxxx.com/"
    wait_time = constant(0)
    
    @task(1)
    def pft(self):
        # wss 地址
        self.url = 'wss://ws.xxxxx.com/ws?appid=futures&uid=10000000'
        self.data = {}
        self.client.connect(self.url)
        
        # 发送的订阅请求
        sendMsg = '{"appid":"futures","cover":0,"event":[\
            {"type":"exchange_rate","toggle":1,"expireTime":86400},\
            {"type":"accountInfo_USDT","toggle":1,"expireTime":86400},\
            {"type":"ticker_BTC/USDT","toggle":1,"expireTime":86400}]}'
        self.client.send(sendMsg)
        
        while True:
            # 消息接收计时
            start_time = time.time()


![img](https://img-blog.csdnimg.cn/img_convert/f323fad0b58d349b8b4a759d10bd6e97.png)
![img](https://img-blog.csdnimg.cn/img_convert/5ed2e01a37df59df7355f58b8d6a518a.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618608311)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

pics/618608311)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebSocket协议是一种在单个TCP连接上进行全双工通信的协议。在WebSocket协议之前,浏览器与服务器之间的通信通常都是基于HTTP请求和响应的,也就是说,客户端向服务器发送请求,服务器返回响应,然后连接就被断开了。这种方式不够实时、效率也不高。 WebSocket协议通过在HTTP协议升级时使用"Upgrade"头来实现握手。握手成功后,连接就从HTTP协议升级到了WebSocket协议,从而在单个TCP连接上实现了全双工通信。 在Java中,可以使用Java API for WebSocket(JSR 356)来实现WebSocket协议。下面是基于Java实现WebSocket协议的步骤: 1. 创建自己的Endpoint类,继承javax.websocket.Endpoint类,实现onOpen、onMessage、onError和onClose方法。 2. 在onOpen方法中,创建Session对象,将它加入到某个集合中,以便在之后向客户端发送消息时使用。 3. 在onMessage方法中,处理客户端发送的消息,并向所有客户端发送消息。 4. 在onError方法中,处理异常。 5. 在onClose方法中,将Session从集合中移除。 6. 创建ServerEndpointConfig对象,并将Endpoint类和URI绑定在一起。 7. 创建WebSocket服务器,将ServerEndpointConfig对象传递给它。 8. 启动WebSocket服务器,等待客户端连接。 9. 客户端连接成功后,服务器会自动调用Endpoint的onOpen方法,表示连接已建立。 10. 客户端发送消息时,服务器会自动调用Endpoint的onMessage方法,处理消息。 11. 客户端关闭连接时,服务器会自动调用Endpoint的onClose方法,清除Session对象。 12. 服务器发生异常时,会自动调用Endpoint的onError方法,处理异常。 以上是基于Java实现WebSocket协议的大致步骤。需要注意的是,WebSocket协议中的数据是以帧的形式进行传输的,而不是HTTP协议中的请求和响应。因此,在编写WebSocket应用程序时,需要特别注意帧的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值