python locust 进行压力测试
最近公司项目周期比较赶, 项目是软硬结合,在缺少硬件的情况下,通过接口模拟设备上下架和购买情况,并进行压力测试,
本次主要使用三个接口 分别是3个场景: 生成商品IP, 对商品进行上架, 消费者购买商品
最大问题:是数据库是用ssh,只能用127.0.0.1去链接数据库,
试过用ssh链接数据库, 用requests 去跑脚本没有问题,换上locust 就有问题
最后使用putty作为代理链接 ,有个缺陷就是 链接时效性不强,经常要重新链接putty
环境:
win10 mysql locust python3.7
1.locust:
Locust是一个用于可扩展的,分布式的,性能测试的,开源的,用Python编写框架/工具,它非常容易使用,也非常好学。
它的主要思想就是模拟一群用户将访问你的网站。每个用户的行为由你编写的python代码定义,同时可以从Web界面中实时观察到用户的行为。
Locust完全是事件驱动的,因此在单台机器上能够支持几千并发用户访问。
与其它许多基于事件的应用相比,Locust并不使用回调,而是使用gevent,而gevent是基于协程的,可以用同步的方式来编写异步执行的代码。
每个用户实际上运行在自己的greenlet中。
2. 安装
pip install locust
安装 pyzmq
If you intend to run Locust distributed across multiple processes/machines, we recommend you to also install pyzmq.
如果打算运行Locust 分布在多个进程/机器,需要安装pyzmq.
通过pip命令安装。
pip install pyzmq
3.Locust主要由下面的几个库构成:
1) gevent
gevent是一种基于协程的Python网络库,它用到Greenlet提供的,封装了libevent事件循环的高层同步API。
2) flask
Python编写的轻量级Web应用框架。
3) requests
Python Http库
4) msgpack-python
MessagePack是一种快速、紧凑的二进制序列化格式,适用于类似JSON的数据格式。msgpack-python主要提供MessagePack数据序列化及反序列化的方法。
5) six
Python2和3兼容库,用来封装Python2和Python3之间的差异性
6) pyzmq
pyzmq是zeromq(一种通信队列)的Python绑定,主要用来实现Locust的分布式模式运行
当我们在安装 Locust 时,它会检测我们当前的 Python 环境是否已经安装了这些库,如果没有安装,它会先把这些库一一装上。并且对这些库版本有要求,有些是必须等于某版本,有些是大于某版本。我们也可以事先把这些库全部按要求装好,再安装Locust时就会快上许多
4. 脚本解读:
1、创建ScriptTasks()类继承TaskSet类: 用于定义测试业务。 2、创建index()、about()、demo()方法分别表示一个行为,访问http://example.com。用@task() 装饰该方法为一个任务。1、2表示一个Locust实例被挑选执行的权重,数值越大,执行频率越高。在当前ScriptTasks()行为下的三个方法得执行比例为2:1:1 3、WebsiteUser()类: 用于定义模拟用户。 4、task_set : 指向一个定义了的用户行为类。 5、host: 指定被测试应用的URL的地址 6、min_wait : 用户执行任务之间等待时间的下界,单位:毫秒。 7、max_wait : 用户执行任务之间等待时间的上界,单位:毫秒。
5.执行脚本:
web/UI 界面:
if __name__ == '__main__':
import os
os.system("locust -f godemo.py --host=http://xx.api.xxxxx.net")
或者在命令行:
locust -f godemo.py --host=http:xxx.xxx.xx.net 或者:
locust -f godemo.py --H=http:xxx.xxx.xx.net
no-web:
dos进入Scripts目录下,执行 locust -f ****.py --csv=onetest --host=http://0.0.0.0:0000 --no-web -c10 -r10 -t2
(PS:-f 指定运行的py文件的名字,--csv 生成报告的名字,--host 测试的http服务的ip和port,--no-web 不用web启动,-c 设置虚拟用户数, -r 设置每秒启动虚拟用户数, -t 设置运行时间)
下面是脚本:
创建一个方法保存在goconn,从数据库读取数据传入请求:
import pymysql
from sshtunnel import SSHTunnelForwarder
import random def conn(): #本地通过putty链接数据库,在链接跳板机
lcDB = pymysql.connect(host="127.0.0.1",port=8807, user="rt",passwd="qwqwqw12",db="go")
cur = lcDB.cursor()
#随机生成一个数字,作为查询的结果的结果数
num = random.randint(0,10) sql = "select no from goods where operator_id =%s order by rand() limit %s"%(11, num)
print(sql)
rfid = [] try: cur.execute(sql)
data = cur.fetchall() for row in data:
good_no = row[0]
rfid.append(good_no)
# print(good_no)
return rfid except:
print("Error") finally:
#关闭连接
lcDB.close()
请求:
import goconnfrom locust import HttpLocust,TaskSet,task
class goDemo(TaskSet):
def getRfid(self):
gID = goconn.conn()
data = {
"goods_no[]": gID,
"num": 1,
}
print("")
r = self.client.post("/test/api/XXX", data=data)
rfid = eval(r.content)["result"]
print(rfid)
return rfid
def stock(self,did, oid, rfid):
data = {
"device_id": did,
"operator_id": oid,
"data[add][]": rfid,
"data[remove][]": "",
}
result = self.client.post("/test/api/XX2", data= data)
print(result.content)
def purchase(self,did,uid,rfid):
data = {
"device_id":did,
"user_id":uid,
"data[]":rfid,
}
req = self.client.post("/test/api/XXX3", data = data)
res =eval(req.content)["result"]
print(req.content)
@task(1)
def test_getrfid(self):
self.getRfid()
@task(3)
def test_stock(self):
rfid = self.getRfid()
self.stock(28,11,rfid)
@task(7)
def test_purchase(self):
rfid = self.getRfid()
self.stock(28,11,rfid)
self.purchase(28,172,rfid)
class WebsiteUser(HttpLocust):
task_set = goDemo
min_wait = 3000
max_wait = 5000
测试结果:
Number of users to simulate:设置模拟的用户总数,
Hatch rate (users spawned/second):每秒启动的虚拟用户数 ,
Start swarming:执行locust脚本
UI界面:运行200个, 每秒启动2个用户:


参考文章:
http://www.pianshen.com/article/6404330705/
关于性能好文章:
https://www.cnblogs.com/botoo/p/7410283.html
设计locust:
参数化 ,关联等:
http://www.cnblogs.com/ailiailan/p/9474973.html
python locust 进行压力测试的更多相关文章
- python mysql数据库压力测试
python mysql数据库压力测试 pymysql 的执行时间对比 1,装饰器,计算插入1000条数据需要的时间 def timer(func): def decor(*args): start_ ...
- 在Rainbond上使用Locust进行压力测试
Locust简介 Locust 是一种易于使用.可编写脚本且可扩展的性能测试工具.并且有一个用户友好的 Web 界面,可以实时显示测试进度.甚至可以在测试运行时更改负载.它也可以在没有 UI 的情况下 ...
- python的web压力测试工具-pylot安装使用
http://blog.csdn.net/chenggong2dm/article/details/10106517 pylot是python编写的一款web压力测试工具.使用比较简单.而且测试结果相 ...
- 面向Web应用的并发压力测试工具——Locust实用攻略
1. 概述 该方案写作目的在于描述一个基于Locust实现的压力测试,文中详细地描述了如何利用locustfile.py文件定义期望达成的测试用例,并利用Locust对目标站点进行并发压力测试. 特别 ...
- 详细介绍windows下使用python pylot进行网站压力测试
windows下使用python进行网站压力测试,有两个必不可少的程序需要安装,一个是python,另一个是pylot.python是一个安装软件,用来运行python程序,而pylot则是pytho ...
- 【转】 详细介绍windows下使用python pylot进行网站压力测试
windows下使用python进行网站压力测试,有两个必不可少的程序需要安装,一个是python,另一个是pylot.python是一个安装软件,用来运行python程序,而pylot则是pytho ...
- 压力测试工具ab,wrk,locust简介
ab 无疑是目前最常见的压力测试工具.其典型用法如下: shell> ab -k -c 100 -t 10 http://domain/path 其中,参数「c」表示的是并发, 参数「t」表示的 ...
- pylot网站压力测试
windows下使用python进行网站压力测试,有两个必不可少的程序需要安装,一个是python,另一个是pylot.python是一个 安装软 件,用来运行python程序,而pylot则是pyt ...
- Locust压力测试使用总结
https://blog.csdn.net/jojoy_tester/article/details/77926470 参考网址 上次做接口压力测试前一直研究使用jmeter,本以为可以拿来使用了, ...
随机推荐
- [StructLayout(LayoutKind.Sequential) ] 是什么意思
首先介绍一下 结构体和类的区别 :类是按引用传递 结构体是按值传递进入正题:结构体是由若干成员组成的.布局有两种1.Sequential,顺序布局,比如struct S1{int a;int b;}那 ...
- 调试dcc 试图将u-boot放入ocm运行碰到的问题
1. 起因: gd->mon_len = (ulong)&__bss_end - (ulong)_start; 在u-boot.map中查找,发现__bss_end并不是u-boot.b ...
- linux中shell编辑小技巧
一.循环1到100 ..};do echo $i done 二.获取100以内的随机值 ] 三.截取字符串 demo= :} #截取3位字符echo ${demo:1} #截取1到最后的字符 希望大家 ...
- java课堂作业,求多参数的和
设计思想 第一步:用户输入他想要计算的数字个数 第二步:声明字符串数组,保存用户的输入,同时每次输入后强制转换类型并求和 第三步:将声明的数组赋值给args 第四步:输出结果 程序流程图 程序源代码 ...
- 微信小程序-饮食日志_开发日志
针对假期作业为父母或者身边的人做一款“小软件”这个课题,由于对 android 开发不熟悉 ,所以决定做一款微信小程序. 项目名称:饮食管理日志 目的:身边的人群对摄入食物热量及消耗不清楚,对健康需求 ...
- jvm——参数解释
https://www.oracle.com/technetwork/java/tuning-139912.html#section4.2.5 https://docs.oracle.com/java ...
- springboot结合jsp页面详解
第一次写博客,其实就是为了约束我自己,写的不一定对,互相借鉴吧!有不对的地方请多多指正,谢谢! 今天我们来看一下springboot结合jsp页面的具体操作: 1.首先我们先看一下目录结构 由上面我们 ...
- 使用 CSS 显示 XML
通过使用 CSS,可为 XML 文档添加显示信息. 使用 CSS 显示您的 XML? 使用 CSS 来格式化 XML 文档是有可能的. 下面的例子就是关于如何使用 CSS 样式表来格式化 XML 文档 ...
- Android字体设置,Roboto字体使用
一.自定义字体 1.android Typeface使用TTF字体文件设置字体 我们可以在程序中放入ttf字体文件,在程序中使用Typeface设置字体.第一步,在assets目录下新建fonts目录 ...
- Spring Cloud Stream教程(三)持续发布 - 订阅支持
应用之间的通信遵循发布订阅模式,其中通过共享主题广播数据.这可以在下图中看到,它显示了一组交互式的Spring Cloud Stream应用程序的典型部署. 图6. Spring Cloud Stre ...