Locust框架
主要思想:模拟一群用户访问系统
安装:pip install locustio==0.11.0 -i
Simple Index (这个命令可以解决版本过高、安装失败的问题)
验证:pip show locustio
实现步骤:
-
定义任务(接口请求-测试用例) 在框架中定义方法 注:普通函数,必须要有一个形参
-
定义任务集 (用户行为) 在框架中定义测试套件
-
定义Locust类(用户) 运行测试套件
创建一个文件夹Locust_study 文件夹下创建locustfile.py
locustfile.py内容如下
from locust import TaskSet
from locust import HttpLocust
【1.定义任务】
任务1 说话
def say(params): # params是形参 是RunUsers实例
print("我在说话啊!")
任务2 唱歌
def song(params): # params是形参
print("我在唱歌啊~")
【2.定义任务集】 #它是一个类,T
askSet,复写tasks (tasks的格式为列表或者字典,值为任务函数名) 【测试套件】
class TaskTest(TaskSet): #这时候需要导TaskSet包
# 复写tasks
tasks = [say, song]
【2.定义用户类】 #必须集成HttpLocust,复写 task_set参数,值为任务集类名称
class RunUser(HttpLocust): #这时候需要导HttpLocust包
# 复写task_set
task_set = TaskTest
说明:
-
任务:python中可执行函数必须有一个形参占位(执行时,用户类指向具体任务时会传入一个用户对象,此处必须有参数接收用户类传入的对象)
-
任务集:①继承TaskSet类②重写父类参数taskset值为列表或字典,类型为任务函数名
-
用户类:①继承HttpLocust②重写父类参数task_set值为任务集类名③重写父类参数host的值为:请求链接时,服务器公共域名地址
启动Locust服务
【方法一】进入locustfile.py所在的文件夹下
cd Locust_study
locust --host=
http://localhost
![](https://img-blog.csdnimg.cn/d71c6665ca654fceb57b2c6135669834.png)
输入地址后可以正常访问
![](https://img-blog.csdnimg.cn/ad9314374dee44ec8ce2b7357545ee7e.png)
运行
![](https://img-blog.csdnimg.cn/741c7cfd85f54e87b6c59c897600a3ca.png)
【方法二】locust -f Locust_study/locustfile.py --host=http://localhost
扩展:如果不想每次输入--host=
http://localhost,需要在用户类里面,添加指定域名
class RunUser(HttpLocust):
# 复写task_set
task_set = TaskTest
# 指定域名
host = 'http://localhost'
执行:locust -f Locust_study/locustfile.py
小知识:pycharm中
表示父类的意思
![](https://img-blog.csdnimg.cn/5f4800e741834f3d98d719e9deb4a83c.png)
Ctrl+B 快速进入一个参数/类/函数的定义
host参数的作用
Crtl+B进入HttpLocust中
-
调用requests.Session对象请求方法时的base_url
-
任务函数的形参params为HeepLocust实例对象(self.client)
-
HttpLocust为request.session对象,可以调用get\post\put\delete...方法
Locust实现基本的http请求
例:
登录接口:
Url->http://182.92.81.159:1880/bms/login
请求方式:POST
请求参数:{"username":"admin", "password":"123456"})
查看信息接口:
Url->http://182.92.81.159:1880/bms/session
请求方式:GET
退出登录接口:
Url->http://182.92.81.159:1880/bms/logout
请求方式:POST
from locust import TaskSet
from locust import HttpLocust
# 1.定义任务
# ①登录
def login(params):
# 调用post方法
r = params.client.post(url="/bms/login", data={"username": "admin", "password": "123456"})
# 查看登陆结果
print(r.json())
# ②查看信息
def session(params):
# 调用get方法
r = params.client.get(url="/bms/session")
print(r.text)
# ③退出登录
def logout(params):
r = params.client.post(url="/bms/logout")
print(r.json())
# 2.定义任务集
class TaskTest(TaskSet):
# 复写tasks属性
tasks = [login, session, logout]
# 定义用户类
class UserRun(HttpLocust):
# 复写task_set
task_set = TaskTest
# 定义Host
host = "http://182.92.81.159:1880"
形参.client=requests.Session对象
host的值一般为测试服务器域名,或公共部分
Locust常用方法
一个用户行为类,要继承TaskSet类,表示一个
(
任务集)
-
on_start:前置方法(前置任务),在所有任务之前调用
-
on_stop:后置方法(后置任务),当任务集停止时调用
-
task:用来添加任务,它是一个dict类型,key表示任务的方法名,value表示挑选执行的权重,数值越大执行频率越高
注:每个用户只会执行一次on_start 和 on_stop
自定义的Locust类继承了HTTP Locust类,这个类代表用户,生成一个实例,模拟用户发送http请求
(用户类)
-
task_set:该属性指向TaskSet类,定义用户的行为
-
min_wait:用户执行任务之间等待时间的下界,单位:毫秒,默认值:1000
-
max_wait:用户执行任务之间等待时间的上界,单位:毫秒,默认值:1000
-
host:被测应用的网址
-
weight:用户被选中给概率,权重越大,被选中的的机会越大,默认值:10
from locust import TaskSet
from locust import HttpLocust
# 1.定义任务
# ①登录
def login(params):
# 调用post方法
r = params.client.post(url="/bms/login", data={"username": "admin", "password": "123456"})
# 查看登陆结果
print(r.json())
print("正在调用登录接口")
# ②查看信息
def session(params):
# 调用get方法
r = params.client.get(url="/bms/session")
print(r.text)
print("正在调用查看信息接口")
# ③退出登录
def logout(params):
r = params.client.post(url="/bms/logout")
print(r.json())
print("正在调用退出登录接口")
# 2.定义任务集
class TaskTest(TaskSet):
# 复写tasks属性
tasks = [session]
# 初始化执行方法 #因为下面调用了开始和结束方法,所以 tasks = [login, session, logout]变为 tasks = [session]
def on_start(self):
login(self)
# 结束执行方法
def on_stop(self):
logout(self)
# 定义用户类
class UserRun(HttpLocust):
# 复写task_set
task_set = TaskTest
# 定义Host
host = "http://182.92.81.159:1880"
# 最小延迟时间 毫秒 默认1000
min_wait = 1000
# 最大延迟时间 毫秒 默认1000
max_wait = 3000
# 权重 默认为10
weight = 10
-
task={任务函数:比重,任务函数:比重}
-
例:{index:3,user:1} # 大约运行index函数3次,user函数1次
-
查询信息10次
class TaskTest(TaskSet):
# 复写tasks属性
tasks = {session: 10} # 查看信息10次
# 初始化执行方法 #因为下面调用了开始和结束方法,所以 tasks = [login, session, logout]变为 tasks = [session]
def on_start(self):
login(self)
# 结束执行方法
def on_stop(self):
logout(self)
Web图表介绍
-
statistics(统计)报告
-
Requests:当前请求的数量
-
Fails:当前请求失败的数量
-
Median(ms):中间值,单位毫秒,一半服务器响应时间低于该值,而另一半高于该值
-
Average(ms):所有请求的平均响应时间,毫秒
-
Current RPS:当前每秒请求数
-
-
Total Requests per Second:每秒发送请求数
-
Response Times(ms):平均响应时间
-
Number of Users:虚拟用户数
@Task装饰使用
目标:将任务直接定义在任务集中 (3个步骤-->2个步骤)
核心:@Task
from locust import TaskSet
from locust import HttpLocust
from locust import task
# 1.定义任务集
class TaskTest(TaskSet):
# ①登录
def login(self):
# 调用post方法
r = self.client.post(url="/bms/login", data={"username": "admin", "password": "123456"})
# 查看登陆结果
print(r.json())
print("正在调用登录接口")
# ②查看信息
@task(10) # 10是比重 #查询信息10次
def session(self):
# 调用get方法
r = self.client.get(url="/bms/session")
print(r.text)
print("正在调用查看信息接口")
# ③退出登录
def logout(self):
r = self.client.post(url="/bms/logout")
print(r.json())
print("正在调用退出登录接口")
# 初始化执行方法 #因为下面调用了开始和结束方法,所以 tasks = [login, session, logout]变为 tasks = [session]
def on_start(self):
self.login()
# 结束执行方法
def on_stop(self):
self.login()
# 定义用户类
class UserRun(HttpLocust):
# 复写task_set
task_set = TaskTest
# 定义Host
host = "http://182.92.81.159:1880"
# 最小延迟时间 毫秒 默认1000
min_wait = 1000
# 最大延迟时间 毫秒 默认1000
max_wait = 1000
# 权重 默认为10
weight = 10
@task 修饰任务
@task(比重)修饰任务比重
Locust分布式应用
目标:Locust分布式 (把脚本发送到从属主机) (web界面实现)
角色:
-
主机 (控制器)master
-
从属主机(执行机) --slave --master-host=主机ip地址
从属主机必须依赖重点:
-
必须有python以及locust环境
-
必须有主机脚本的副本
运行:
-
主机:locust -f 目录\模块.py --master
-
从属主机:locust -f 目录\模块.py --slave --master-host=主机ip地址
注:--master主机(控制机);--salve从属主机(执行机)
命令行实现分布式效果
参数:
--no-web:不使用web界面
-c:虚拟用户数
-r:每秒孵化率
--expect-slaves:指定执行机数量(从属主机数)
--run-time:指定运行时间(h:小时;m:分钟;s:秒)
--csv=:保存执行结果
locust -f Locust_study/locustfile.py --master --no-web -c 200 -r 20 --expect-slaves 2 --run-time 20s --csv=./master_result.csv
locust -f Locust_study/locustfile.py --slave --master-host=192.138.1.104 --csv=./master_result.csv