pip3 install locust安装
官方使用文档:Locust Documentation — Locust 2.15.2.dev27 documentation
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时就会快上许多。
Locust单进程运行模式
Locust
所有的虚拟并发用户均运行在单个Python
进程中,具体从使用形式上,又分为no_web
和web
两种形式。该种模式由于单进程的原因,并不能完全发挥压力机所有处理器的能力,因此主要用于调试脚本和小并发压测的情况。
当并发压力要求较高时,就需要用到Locust
的多进程分布式运行模式。从字面意思上看,大家可能第一反应就是多台压力机同时运行,每台压力机分担负载一部分的压力生成。的确,Locust
支持任意多台压力机(一主多从)的分布式运行模式,但这里说到的多进程分布式运行模式还有另外一种情况,就是在同一台压力机上开启多个slave
的情况。这是因为当前阶段大多数计算机的CPU都是多处理器(multiple processor cores
),单进程运行模式下只能用到一个处理器的能力,而通过在一台压力机上运行多个slave
,就能调用多个处理器的能力了。比较好的做法是,如果一台压力机有N
个处理器内核,那么就在这台压力机上启动一个master
,N
个slave
。当然,我们也可以启动N
的倍数个slave
,但是根据我的试验数据,效果跟N
个差不多,因此只需要启动N
个slave
即可。
no_web形式启动locust:
如果采用no_web
形式,则需使用--no-web
参数,并会用到如下几个参数。
-c, --clients
:指定并发用户数;-n, --num-request
:指定总执行测试次数;-r, --hatch-rate
:指定并发加压速率,默认值位1。
示例:
$ locust -f locustfile.py --host = xxxxx.com --no-web -c 1 -n 2
在此基础上,当我们想要调试Locust
脚本时,就可以在脚本中需要调试的地方通过print
打印日志,然后将并发数和总执行次数都指定为1
$ locust -f locustfile.py --host = xxxxx.com --no-web -c 1 -n 1
执行测试
通过这种方式,我们就能很方便地对Locust
脚本进行调试了。
Locust
脚本调试通过后,就算是完成了所有准备工作,可以开始进行压力测试了。
web形式启动locust:
如果采用web
形式,,则通常情况下无需指定其它额外参数,Locust
默认采用8089
端口启动web
;如果要使用其它端口,就可以使用如下参数进行指定。
-P, --port
:指定web端口,默认为8089
.- 终端中--->进入到代码目录: locust -f locustfile.py --host = xxxxx.com
- -f 指定性能测试脚本文件
- -host 被测试应用的URL地址【如果不填写,读取继承(HttpLocust)类中定义的host】
- 如果
Locust
运行在本机,在浏览器中访问http://localhost:8089
即可进入Locust
的Web管理页面;如果Locust
运行在其它机器上,那么在浏览器中访问http://locust_machine_ip:8089
即可。
from locust import HttpUser,TaskSet,task
import json
class Demo(TaskSet):
@task(1)
def baidu(self):
url = '/ywwl/item/sell/page/v2'
body = {"pageSize":10,"pageIndex":1,"queryAllFlag":1}
header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",'X-TOKEN':'wvdxtc1xnde1mdq=','Content-Type':'application/json;charset=UTF-8','Accept': 'application/json, text/plain, */*'}
req = self.client.post(url, data = json.dumps(body), headers=header, verify=False)
if req.status_code == 200:
print("+++++++++success")
else:
print("---------fails")
@task(2)
def baidu2(self):
print("======2======")
class websitUser(HttpUser):
tasks = [Demo] # task_set = Demo #指向定义了用户行为的类Demo
min_wait = 3000 #模拟负载的任务之间执行时的最小等待时间,单位为毫秒
max_wait = 6000
if __name__=="__main__":
import os
os.system("locust -f Locust.py --host=https://test.ywwl.com --headless -u 100 -r 5 -t 30s --html HTML_FILE") #访问地址http://localhost:8089
# --headless 禁用web界面,开始测试
# -u(-c), --clients:指定并发用户数;
# -n, --num-request:指定总执行测试次数;
# -r 指定并发加压速率,默认值位1。指定每秒启动的用户数,加至并发用户数止。
# -t 设置运行时间, 例如: (300s, 20m, 3h, 1h30m)。
# -H 设置host例如http://10.21.32.33
# --tls-cert TLS_CERT 提供TLS证书的路径
# --tls-key TLS_KEY 提供TLS私钥
# -T [TAG [TAG ...]], --tags [TAG [TAG ...]] 仅执行列表内的任务
# -E [TAG [TAG ...]], --exclude-tags [TAG [TAG ...]] 执行列表外的任务
# --csv CSV_PREFIX 存储当前请求统计到CSV文件
# --csv-full-history 存储每个统计条目到CSV文件
# --html HTML_FILE 存储HTML报表文件
断言及变更‘成功/失败’识别状态:
针对https接口,可附带证书请求:
补充