一、Locust介绍
1、Locust简介
Locust(蝗虫)是一个开源的性能测试工具,主要思想就是模拟一群用户访问你的系统
2、特点
(1)在代码中定义用户行为
- 不需要安装笨重的软件,只是简单的Python代码
(2)分布式和可扩展
- Locust支持在多台机器上的运行负载测试,因此可用于模拟数百万用户的请求
(3)经过验证和战斗测试
- Locust被用于许多真实的项目中
(4)Locust有一个整洁的HTML+JS的用户界面,实时显示相关测试细节
- 由于用户界面是基于网络的,它是跨平台的和容易扩展
二、Locust安装
安装命令:
pip install locust
安装成功验证:
locust --version # 查看安装的版本
locust -h # 查看使用帮助
注意:python的版本最好在3.0以上
三、Locust使用方法
1、核心步骤
- 定义任务(接口请求):普通函数,必须有一个形参,必须使用@task修饰函数
- 定义任务集(用户行为):一个类,必须继承TaskSet,类里面为定义的任务
- 定义用户类(用户):一个类,必须继承HttpUser,配置host地址,复写tasks,格式为列表或字典,值为定义的任务集名称
- 启动服务,配置执行:locust -f 文件名
例子:
from locust import HttpUser, TaskSet, task
# 定义任务集
class TaskTest(TaskSet):
# 定义任务
@task
def say(params):
print("正在说话")
@task
def sing(params):
print("正在唱歌")
# 定义用户类
class Test(HttpUser):
tasks = [TaskTest]
host = "http://localhost"
执行locust步骤:
(1)打开pycharm终端输入locust -f 文件名称运行
(2)打开浏览器输入localhost:8089运行locust控制界面
(3)输入数据点击start swarming执行代码
- Number of users (peak concurrency):并发数量即用户数量
- Spawn rate (users started/second):每秒加载的用户数
- Host (e.g. http://www.example.com) :主机地址,代码中有的话可以默认执行
2、任务集常用的方法
(1)on_start:前置方法(前置任务),在所有任务之前调用一次
(2)on_stop:后置方法(后置任务),当任务集停止时调用一次
(3)@task(weight):修饰函数,将函数定义成任务。weight代表权重,权重越大执行次数越多,默认值是1
from locust import TaskSet, task
# 定义任务集
class TaskTest(TaskSet):
# 定义任务
@task(10)
def say(params):
print("正在说话")
@task(5)
def sing(params):
print("正在唱歌")
def on_start(self):
self.say()
def on_stop(self):
self.sing()
3、用户类常用的属性
(1)min_wait:用户执行任务之间等待时间的下界,单位:毫秒,默认值:1000
(2)max_wait:用户执行任务之间等待时间的上界,单位:毫秒,默认值:1000
(3)host:被测应用的网址,例如:http://localhost
(4)weight:用户被选中的概率,权重越大,被选中的机会就越大,默认值:10
from locust import HttpUser
# 定义用户类
class Test(HttpUser):
tasks = [TaskTest]
host = "http://localhost"
min_wait = 1000
max_wait = 2000
weight = 10
4、locust分布式应用——web界面实现
(1)主机(控制机)
locust -f 目录\执行文件名 --master
(2)从属主机(执行机)
locust -f 目录\执行文件名 --worker --master-host=主机ip地址 --master-port=主机端口
从属主机必须依赖的重点:
- 必须有python及locust环境
- 必须有主机脚本的副本
- 如果从属主机与主机在同一台机器上,--master-host和--master-port可以不写
5、locust分布式应用——无图模式实现(非web界面)
locust -f 目录\执行文件名 --master --headless -u 200 -r 20 --expect-workers 2 --run-time 20s --csv ./result.csv
--headless:不使用web界面
-u:虚拟用户数
-r:每秒生成的用户数
--expect-workers:执行机数量
--run-time:运行时间(h:小时,m:分钟,s:秒)
--csv:保存执行结果
四、Locust在接口测试中的应用
简单案例实现:
from locust import HttpUser, TaskSet, task
headers = {"content-type": "application/json;charset=UTF-8"}
data = {"username": "hogwarts", "passwords": "test12345", "code": ""}
params = {"page": 1, "limit": 20, "goodsSn": "11111", "name": ""}
# 定义任务集
class TaskTest(TaskSet):
# 定义任务
# 登录方法
@task(1)
def login(r):
response = r.client.post(url="/admin/auth/login", json=data, headers=headers)
headers["x-litemall-admin-token"] = response.json()["data"]["token"]
print(response.json())
# 获取商品列表方法
@task(1)
def list(r):
response = r.client.get(url="/admin/goods/list", params=params, headers=headers)
print(response.json())
def on_start(self):
self.login()
def on_stop(self):
self.list()
# 定义用户类
class Test(HttpUser):
tasks = [TaskTest]
host = "https://litemall.hogwarts.ceshiren.com"
min_wait = 1000
max_wait = 3000
运行结果: