首页 > 其他分享 >Locust 压测websocket协议

Locust 压测websocket协议

时间:2024-07-24 16:51:42浏览次数:14  
标签:__ websocket 压测 self Locust url ws time def

Locust 自带的HttpLocust类只支持http,并不支持websocket,但实现websocket压测只需要三步。

1、第一步需要自己写一个websocket client的类,实现连接、发送、接受、关闭连接等方法

import websocket

class WebSocketClient(object):
    def __init__(self, host):
        self.host = host
        self.ws = websocket.WebSocket()

    def connect(self, url):
        self.ws.connect(url=self.host + url)

        return self.ws

    def send(self, msg):
        self.ws.send(msg)

    def recv(self):
        return self.ws.recv()

    def close(self):
        self.ws.close()

2、继承 User 类(当前最新Locust版本是2.29.1,如果是老版本,继承的是 Locust 类)

class WebsocketLocust(User):
    # 定义抽象类
    abstract = True
    def __init__(self, *args, **kwargs):
        super(WebsocketLocust, self).__init__(*args, **kwargs)
        # 输入真实的ws接口ip和端口
        self.client = WebSocketClient('ws://ip:port')

3、继承 WebsocketLocust 类,初始化User,定义测试行为

# 定义用户行为
class UserTask(WebsocketLocust):
    def on_start(self):
        '''初始化数据,每个虚拟用户只执行一次'''
        self.url = "/v1/test"
        self.ws = self.client.connect(self.url)
        self.params ={}

    # 多个接口用@task(1)、@task(2)分配权限,按1:2流量分配     
    @task
    def test(self):
        start_time = time.time()
        try:
            self.ws.send(json.dumps(self.params))
            r = self.ws.recv()
            total_time = time.time() - start_time
            result = json.loads(r)['data']
            assert result[3] != '未查询到相关信息'
            events.request.fire(request_type="websockt", name=self.url, response_time=total_time * 1000,
                                response_length=len(r))

        except AssertionError:
            events.request.fire(request_type="websockt", name=self.url, response_time=total_time * 1000,
                                response_length=0, exception=f"断言错误,response:{result}")

        except Exception as e:
            total_time = time.time() - start_time
            events.request.fire(request_type="websockt", name=self.url, response_time=total_time*1000, exception=e)

    def on_stop(self):
        '''销毁数据,每个虚拟用户只执行一次'''
        self.ws.close()

 

总结起来就是:

from locust import task, between,User,events
import os, json, time,websocket

class WebSocketClient(object):
    def __init__(self, host):
        self.host = host
        self.ws = websocket.WebSocket()

    def connect(self, url):
        self.ws.connect(url=self.host + url)

        return self.ws

    def send(self, msg):
        self.ws.send(msg)

    def recv(self):
        return self.ws.recv()

    def close(self):
        self.ws.close()
  
class WebsocketLocust(User):
    # 定义抽象类
    abstract = True
    def __init__(self, *args, **kwargs):
        super(WebsocketLocust, self).__init__(*args, **kwargs)
        # 输入真实的ws接口ip和端口
        self.client = WebSocketClient('ws://ip:port')
        
# 定义用户行为
class UserTask(WebsocketLocust):
    def on_start(self):
        '''初始化数据,每个虚拟用户只执行一次'''
        self.url = "/v1/test"
        self.ws = self.client.connect(self.url)
        self.params ={}

    # 多个接口用@task(1)、@task(2)分配权限,按1:2流量分配     
    @task
    def test(self):
        start_time = time.time()
        try:
            self.ws.send(json.dumps(self.params))
            r = self.ws.recv()
            total_time = time.time() - start_time
            result = json.loads(r)['data']
            assert result[3] != '未查询到相关信息'
            events.request.fire(request_type="websockt", name=self.url, response_time=total_time * 1000,
                                response_length=len(r))

        except AssertionError:
            events.request.fire(request_type="websockt", name=self.url, response_time=total_time * 1000,
                                response_length=0, exception=f"断言错误,response:{result}")

        except Exception as e:
            total_time = time.time() - start_time
            events.request.fire(request_type="websockt", name=self.url, response_time=total_time*1000, exception=e)

    def on_stop(self):
        '''销毁数据,每个虚拟用户只执行一次'''
        self.ws.close()
       
   
if __name__ == "__main__":
    os.system('locust -f stress_test.py --web-port 8090')

 

标签:__,websocket,压测,self,Locust,url,ws,time,def
From: https://www.cnblogs.com/shenh/p/18321028

相关文章

  • Springboot整合WebSocket作为服务端遇到的坑
    最近遇到一个需求,对接某公有云上的坐席系统,需要接收人工坐席和客户对话的语音流,然后调用ASR(AutomaticSpeechRecognition,自动语音识别)引擎,对语音流实时转写,最后将实时转写的内容推送到kafka,供下游系统消费。大致流程图如下:标绿的系统即是我方需求对接系统。问题:上述前......
  • SpringBoot整合WebSocket实践
    简介先来看下维基百科WebSocket的简介:WebSocket是一种与HTTP不同的协议。两者都位于OSI模型的应用层,并且都依赖于传输层的TCP协议。虽然它们不同,但是RFC6455中规定:itisdesignedtoworkoverHTTPports80and443aswellastosupportHTTPproxiesandintermediaries......
  • Apache压测工具ab(Apache Bench)工具的下载安装和使用示例
    场景Jmeter进行http接口压力测试:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124928498上面讲压测工具Jmeter的使用,下面介绍另外一个ab(ApacheBench)压测工具的使用。apachebenchapachebench是apache自带的压力测试工具。ab不仅可以对apache服务器进行网......
  • 【Locust】实现grpc接口性能测试
    一、locusthttps://www.locust.io/ 二、准备测试服务1、下载测试服务https://github.com/grpc/grpc.git2、使用编辑器或者IDE打开 3、proto文件位置 4、创建测试代码安装相关库pipinstalllocustgrpciogrpcio-toolspython-mgrpc_tools.protoc-I=/path......
  • WebKit 引擎:WebSockets 的幕后英雄
    WebKit引擎:WebSockets的幕后英雄在现代Web应用中,WebSockets提供了一种在用户和服务器之间建立持久、全双工通信的方法。与传统的HTTP请求相比,WebSockets可以减少通信开销,提高性能,并支持实时通信。WebKit作为许多流行浏览器的底层引擎,对WebSockets的支持至关重要。本文将......
  • 在Spring Boot中实现WebSocket实时通信
    在SpringBoot中实现WebSocket实时通信大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代web应用中,实时通信功能越来越受到重视。WebSocket协议是一种在单个TCP连接上进行全双工通信的协议,允许客户端和服务器之间进行实时数据传输。SpringBoot......
  • Spring Boot+WebSocket向前端推送消息
     ​ 博客主页:   南来_北往......
  • swoole4 websocket + pdo连接池
    <?phpdeclare(strict_types=1);namespaceapp\api\controller\yy;useapp\common\controller\Api;useSwoole\Coroutine;useSwoole\Database\PDOConfig;useSwoole\Database\PDOPool;useSwoole\Runtime;usethink\Controller;classWebsocket{......
  • 前端WebSocket的方法封装
    一、封装方法在项目根目录src下的utils中新增webSocketManager.js封装文件,代码内容如下://webSocketManager.js/**WebSocketMessenger封装类*/classWebSocketManager{constructor(url=null,userId=null,receiveMessageCallback=null){this.socket=nul......
  • npm/yarn/pnpm install失败:ERR_PNPM_NO_VERSIONS No versions available for uWebSock
    ERR_PNPM_NO_VERSIONS NoversionsavailableforuWebSockets.js.Thepackagemaybeunpublished.我在新项目中想要切换包管理器从yarn到pnpm的时候,删除node_modules和yarn.lock之后,pnpminstall竟然提示这个包可能没发布。我觉得这个不可能,都需要使用了,怎么可能没发......