一、介绍
locust是一款完全基于事件的负载测试框架,做性能测试使用的‘协程’方式,支持数十万并发用户,提供有webui图形界面、无图形界面、分布式等多种运行方式、可以用于测试几乎任何系统或协议。
二、安装
命令安装:pip install locust
安装完成后,检查locus的安装结果,locust -v ;如果可以查看到Locus的版本号,就是安装成功了,
三、报错处理
python 错误:‘Cannot connect to proxy.‘
由于用过vpn设置没有把注册表的代理删掉导致的。因此直接的解决办法是找到注册表里面用户的代理设置,删掉它:运行:regedit→找到\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
鼠标单击 Internet Settings文件夹,在右侧把ProxyEnable的值改为0。重新输入命令;安装成功。
四、核心模块
locust的六个关键模块:
1、gevent:在Python中实现协程的第三方库。协程又叫微线程Corouine。使用gevent可以获取极高的并发能力;
2、flask:Python的一个web开发框架,旨在构建Web应用程序;
3、requests:支持http/https访问的库;
4、msgpack-python:一种快速、紧凑的二进制序列化格式,使用与类似json的数据;
5、six:提供了一些简单的工具封装Python2和Python3 之间的差异;
6、pyzmq:安装这个第三方库,可以把Locust运行在多个进程或多个机器(分布式)
五、编写脚本
(1)定义一个任务类,类名随便定义;
(2)继承SequentialTaskSet 或 TaskSet类,
(3)当类里面的任务请求有先后顺序时继承SequentialTaskSet类;没有,可以使用继承TaskSet类;
import random
from locust import HttpUser, task, between, SequentialTaskSet, tag
class MyTaskCase(SequentialTaskSet):
# 初始化方法,相当于 setup
def on_start(self):
pass
# @task python中的装饰器,告诉下面的方法是一个任务,
# 这个装饰器和下面的方法被复制多次,改动一下,就能写出多个接口
# 装饰器后面带上(数字)代表在所有任务中,执行比例
# 要用这个装饰器,需要头部引入 从locust中,引入 task
@task(7) #带上数字表示执行比例;执行总次数中,这个任务执行7次
@tag("leave_1")
def regist_(self): # 一个方法, 方法名称可以自己改
url = '/erp/regist' # 接口请求的URL地址;主机地址不用写,后面执行是填上;
# 定义请求头为类变量,这样其他任务也可以调用该变量
self.headers = {"Content-Type": "application/json"}
self.username = "locust_" + str(random.randint(10000, 100000))
self.pwd = '1234567890'
# post请求的 请求体
data = {"name": self.username, "pwd": self.pwd}
# 使用self.client发起请求,请求的方法根据接口实际选,
# catch_response 值为True 允许为失败 ,
# name 设置任务标签名称 -----可选参数
with self.client.post(url,
json=data,
headers=self.headers,
catch_response=True) as rsp:
if rsp.status_code > 400:
print(rsp.text)
rsp.failure('regist_ 接口失败!')
@task # 装饰器,说明下面是一个任务
def login_(self):
url = '/erp/loginIn' # 接口请求的URL地址
data = {"name": self.username, "pwd": self.pwd}
with self.client.post(url,
json=data,
headers=self.headers,
catch_response=True) as rsp:
# 提取响应json 中的信息,定义为 类变量
self.token = rsp.json()['token']
if rsp.status_code < 400 \
and rsp.json()['code'] == "200":
rsp.success()
else:
rsp.failure('login_ 接口失败!')
@task # 装饰器,说明下面是一个任务
def getuser_(self):
url = '/erp/user' # 接口请求的URL地址
# 引用上一个任务的 类变量值 实现参数关联
headers = {"Token": self.token}
# 使用self.client发起请求,请求的方法 选择 get
with self.client.get(url,
headers=headers,
catch_response=True) as rsp:
if rsp.status_code < 400:
rsp.success()
else:
rsp.failure('getuser_ 接口失败!')
# 结束方法, 相当于teardown
def on_stop(self):
pass
# 定义一个运行类 继承HttpUser类, 所以要从locust中引入 HttpUser类
class UserRun(HttpUser):
tasks = [MyTaskCase]
# 设置运行过程中间隔时间 需要从locust中 引入 between
wait_time = between(0.1, 3)
过程中需要导入相应的模块,通过 file-> settings
六、运行
在终端中输入:locust -f 被执行的locust文件.py --host=http://被测服务器域名或ip端口地址,也可以不指定host,如 “locust -f locust_test.py --host=http://localhost:8082”;当命令执行成功,会提示服务端口,如:*:8089。此时,则可通过浏览器访问机器ip:8089,看到任务测试页面;
Number of total users to simulate:要模拟的总用户数
Spawn rate (users spawned/second):生成率(用户生成/秒)
Host (e.g. http://www.example.com):主机(例如 http://www.example.com)
七、常用api
Httpuser :运行类
Taskset:任务类
八、指标体系
响应时间:response time,从开始到完成某项工作的时间;反映系统处理效率的指标;
吞吐量:throughput,单位时间完成的工作度量,反映系统处理能力指标;
事务处理能力:TPS ,包含业务响应时间,成功率和单位时间处理量;
Type 访问类型
Name 任务名(python中定义的方法名)
Requests 请求的总次数
Fails 失败的次数
Median (ms) 中间数耗时
Average (ms) 平均耗时
Min (ms) 最低耗时
Max (ms) 最大耗时
Average size (bytes) 平均耗时
Current RPS 每秒钟处理的访问的次数
也可以通过代码里的 psutil 来查看相关指标。