locust压测websocket协议
Locust是以HTTP为主要目标构建的。
但是,通过编写触发器request_success和 request_failure事件的自定义客户端,可以轻松扩展到任何基于请求/响应的系统的负载测试 。
我们知道locust默认内部只封装httplocust;使用的是requests中的session进行了封装;
那么问题来了,如果我想测试其它协议怎么办,比如websocket , grpc等等。
以websoket为例:
在开始之前,需要了解的几点:
1>self.client: locust协议入口实例,我们只要重写一个实例给client即可。
2>以下两个事件,用来收集报告信息,否则写好后执行你会发现收集不到性能数据
events.request_failure.fire()
events.request_success.fire()
具体步骤:
1>编写WebSocketClient类(主要用来替换掉self.client的http实例)
class WebSocketClient(object):
def __init__(self, host):
self.host = host
self.ws = websocket.WebSocket()
def connect(self, burl):
start_time = time.time()
try:
self.conn = self.ws.connect(url=burl)
except websocket.WebSocketTimeoutException as e:
total_time = int((time.time() - start_time) * 1000)
events.request_failure.fire(request_type="websockt", name='urlweb', response_time=total_time, exception=e)
else:
total_time = int((time.time() - start_time) * 1000)
events.request_success.fire(request_type="websockt", name='urlweb', 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)
注意:该类中定义了,websocket的常用操作,链接、接收、发送;最主要是events.request_failure.fire和events.request_success.fire这两个用来收集性能数据,如果不写
报告收集不到性能数据。
上边代码只是以websocket举例,其它协议也一样,只要注意收集性能数据就可以。当然也可以不写在这里。这个看代码怎么写了。
2>重写一个HttpLocust类,我们这里叫做WebsoketLoscust类
class WebsocketLocust(Locust):
def __init__(self, *args, **kwargs):
super(WebsocketLocust, self).__init__(*args, **kwargs)
self.client = WebSocketClient(self.host)
注意:WebsocketLocust从Locust继承; 这里主要是将self.client重新实例成,我们第一部写好的websocketClient实例。
这样一来我们通过self.client.xxxx就可以使用其方法
3>编写TaskSet类
class SupperDianCan(TaskSet):
@task
def test_baidu(self):
self.url = 'wss://xxxxxx.xxxx.com/cart/chat?sid=11303&table_no=103&user_id=ofZjWs40HxEzvV08l6m4PnqGbxqc_2_1_&version=2'
self.data = {}
self.client.connect(self.url)
while True:
recv = self.client.recv()
print(recv)
if eval(recv)['type'] == 'keepalive':
self.client.send(recv)
else:
self.client.send(self.data)
注意:此类就是任务类,跟http的写法一样,只是这里用的self.client.xxxx已经变成了我们自已重写的websocket类,将原来的requests http替换了。
4>编写站点类
class WebsiteUser(WebsocketLocust):
task_set = SupperDianCan
min_wait=5000
max_wait=9000
注意:站点类从第二步中的locust继承
到这里代码编写完成,直接到cmd命令行执行
locust -f supperdiancan.py --no-web -c 10 -r 3 --run-time 10s
参数:
-f locust_file.py文件(locust任务文件)
-c 指定要生成的Locust用户数
-r 每秒生成的用户数
-n 用于0.8用于-n指定请求数
--run-time 或-t 指定测试的运行时间
注意:以上是以非web执行,当然你也可以用web执行。
以下是结果,从上可以看到,已经收集到了,请求数据。
Percentage of the requests completed within given times
Name # reqs 50% 66% 75% 80% 90% 95% 98% 99% 100%
--------------------------------------------------------------------------------------------------------------------------------------------
websockt urlweb 10 48 50 59 65 540 540 540 540 540
--------------------------------------------------------------------------------------------------------------------------------------------
Total 10 48 50 59 65 540 540 540 540 540
以上并非是在分布式下运行,如要分布式,请参考其它。
官方参考文档,请穿越:https://docs.locust.io/en/stable/testing-other-systems.html
locust压测websocket协议的更多相关文章
- locust压测rpc协议
这里主要是google的grpc接口进行压测的一个栗子. Locust是以HTTP为主要目标构建的. 但是,通过编写钩子触发器request_success和 request_failure事件的自定 ...
- Locust压测结果准确性验证
最近闲着没事做,就重新研究了一下基于python语言的Locust性能测试框架 发现在压测的过程中,虽然设置了100并发,但是通过实际监控,完全看不到100并发压测的效果 通过代码AOP日志监控接口的 ...
- python设置socket的超时时间(可能使用locust压测千级并发的时候要用到,先记录在此)
在使用urllib或者urllib2时,有可能会等半天资源都下载不下来,可以通过设置socket的超时时间,来控制下载内容时的等待时间. 如下python代码 import socket timeou ...
- jmeter压测tcp协议接口:java.net.SocketException: Software caused connection abort: socket write error
tcp接口,试压过程中,部分请求报如下错误: java.net.SocketException: Software caused connection abort: socket write erro ...
- 分布式压测系列之Jmeter4.0第一季
1)Jmeter4.0介绍 jmeter是个纯java编写的开源压测工具,apache旗下的开源软件,一开始是设计为web测试的软件,由于发展迅猛,现在可以压测许多协议比如:http.https.so ...
- jmeter针对websocket协议的压测
之前一直没有接触过websocket协议,所以一直对websocket的压测存在疑惑,在网上参考文章并不断尝试之后,终于有所得:第一次用jmeter的websoket插件,用的ws非加密协议,请求都能 ...
- 阿里云PTS分享-用性能测试工具JMeter实现基于供应链业务上对于WebSocket 协议的压测
性能测试PTS(Performance Testing Service)是面向所有技术相关背景人员的云化性能测试工具,孵化自阿里内部平台.有别于传统工具的繁复,PTS以互联网化的交互,面向分布式和云化 ...
- 使用jmeter进行websocket协议压测
第一步:添加websocket sampler组件 可以使用plugins manager进行添加,首先下载plugins manager组件: 下载路径: https://jmeter-plugi ...
- locust接口压测
前言: locust是完全基于python,是一个简单易用的分布式负载测试工具 Locust特性 使用Python编写模拟用户行为的代码,无需繁琐的配置 分布式可扩展,能够支持上百万用户 自带Web界 ...
随机推荐
- tensorflow会话控制-【老鱼学tensorflow】
在tensorflow中,当定义好结构后,就要通过tf.session()来建立运行时的会话. 本例子应该不难理解,我们用tensorflow来计算一下一个1行2列的矩阵和2行1列矩阵的乘积: imp ...
- InputString 转换成 BufferedImage 和 byte[]
获取网络的一张图片,但是某种需要,要把获取的这段流输入换为BufferedImage流,有的地方还需要转换为byte[]. 获得图片地址,获得了一个图片输入流,例如: Url img = new UR ...
- ArrayList Vector
100000条数据时:测了4次,分别是9ms/13ms:8ms/6ms:8ms/6ms:8ms/6ms[其中/前为ArrayList数据,/后为Vector数据]1000000条数据时:测了4次,分别 ...
- 理解WidowManager
--摘自<Android进阶解密> *WindowManger的关联类* 1.Window是一个抽象类,具体的实现类为PhoneWindow,它对View进行管理.WindowManage ...
- HihoCoder1338 A Game (区间DP)
<题目链接> 题目大意: 两个人轮流从一个序列中取数,他们都面临同样的二选一决策:是拿走最左边的数,还是拿走最右边的数?问先手最多能够得到的分数是多少. 解题分析: 一道比较经典的DP,因 ...
- 大数据小白系列 —— MapReduce流程的深入说明
上一期我们介绍了MR的基本流程与概念,本期稍微深入了解一下这个流程,尤其是比较重要但相对较少被提及的Shuffling过程. Mapping 上期我们说过,每一个mapper进程接收并处理一块数据,这 ...
- [CF542A]Place Your Ad Here
[CF542A]Place Your Ad Here 题目大意: 有\(n(n\le2\times10^5)\)个广告和\(m(m\le2\times10^5)\)个电视台,第\(i\)个广告只能在\ ...
- OI回忆录——一个过气OIer的制杖历程
初中 初一参加学校信息学选修课,一周一节课,学pascal. 初一寒假(大约是)入选(其实是钦定吧)当时加上我只有3人的校队(我当然是最弱的一个. 当时甚至有幸得到叉姐授课(现在才知道这是多么难得的机 ...
- GMA Round 1 波动函数
传送门 波动函数 f(x)是一个定义在R上的偶函数,f(x)=f(2-x),当$x\in[-1,1]$时,f(x)=cos(x),则函数$g(x)=f(x)-|cos(\pi x)|$,求g(x)在[ ...
- ECMA Script 6_symbol(symbol.iterator) 新接口_iterator接口
iterator 接口 只要部署了 iterator 接口 symbol(symbol.iterator), 则可以进行 for...of 遍历