第一章:入门篇
简介
- Locust是一款基于Python的性能测试框架
- 同时支持命令行及Web UI测试
- 支持导入其他Python库,不受GUI限制,可扩展性不受限制
- 官方文档地址
- 案例代码仓库
特点
- 对比常用的性能测试工具Jmeter,Locust的特点如下
| 指标项 | Jmeter | Locust |
|---|
| 代码语言 | Java | Python |
| 可视化程度/易用性 | 高 | 中 |
| 性能 | 基于多线程 | 基于协程,高并发下更节省内存 |
| 支持分布测试 | 是 | 是 |
| 日志查看 | 丰富 | 丰富 |
| 学习成本 | 中 | 较高 |
| 二次开发灵活度 | 中 | 高 |
使用
安装
- Locust当前是作为Python库使用的,因此建议使用pip安装
- Python版本要求:3.8或者更新
pip3 install locust
locust -V
pip3 install --pre locust
入门
- Locust实质就是Python方法库的集合,因此使用Locust就是使用已编写的第三方库下的类和方法
- Locust最主要的类是User类和TaskSet类
- User类: 创建用于模拟请求的用户
- TaskSet类:测试场景的集合,访问接口的相关代码和处理,如host、url、response等
案例1:基本测试场景
- 假设有一个服务
- 监听5000端口
- 提供不同的路由访问,如/public
- 访问成功时返回的messgae为success
- 编写locust脚本访问服务
- 执行locust脚本
部署服务端
- 使用一个已构建的flask测试容器镜像快速部署服务端
- 不同操作系统下安装docker,可参考【Docker-get docker】
- 根据操作系统选择对应的docker-compose文件,下载后改名为docker-compose.yml
- 此处以Linux操作系统为例, 将docker-compose.yml移动到/data/compose/flasktest
- 执行命令启动容器
# 进入目录
cd /data/compose/flasktest
# 启动容器
docker compose up -d

编写代码
# 导入Locust类
from locust import FastHttpUser, task
class MockUser(FastHttpUser):
# 设置默认的请求hots,仅在web界面此host生效
host = "http://127.0.0.1:5000"
# 使用@task装饰器表明此方法是一个需要执行的用例
# Locust装饰器详细介绍请查看基础章节
@task
def test_public_route(self):
self.client.get(url="/public")
- 此案例中MockUser继承自FastHttpUser,用于模拟用户
- host:设置默认请求的url host
- @task:被装饰的方法或者函数会被识别为一个测试用例场景
- test_public_route:测试场景的代码
- self.client:实例化User时创建的HttpSession实例。客户端支持cookie,因此在HTTP请求之间保持会话。
- url:请求的url,一般组成如下
- 请求协议:http或者https
- 请求地址:域名或者ip
- 请求端口:根据实际设置,不设置时http默认80,https默认443
- 请求路由:如/public
- 此处MockUser下已设置了默认的host,因此url的实际访问的完整地址为:http://127.0.0.1:5000/public
执行Locust
webui方式
- 创建一个locust文件,如case_01_simple.py
- 复制上面[[#代码]]步骤的内容,粘贴到case_01_simple.py
- 使用locust命令启动
locust -f case_01_simple.py

- 此时通过当前服务器的IP+8089端口即可访问服务端

- 点击中间的【START SWARM】按钮开始执行测试
当然也可以切换到暗色模式

- 在界面上,我们可以看到请求的方法、路径、失败率、响应时间、RPS等性能相关的常规参数
- 当然其他的页面提供了更详细的测试相关信息
命令行方式
- 创建一个locust文件,如case_01_simple.py
- 复制上面[[#代码]]步骤的内容,粘贴到case_01_simple.py
- 使用locust命令启动,并添加—headless参数,此时默认使用命令行启动,无web页面
locust -f case_01_simple.py --headless -t=1m -u=1 -r=1

启动参数详解
- 无论是web界面,还是命令行的方式,都存在以下几个核心参数,让我们看看这些参数的含义
| 参数 | 简写 | 解释 | 备注 |
|---|
| —host | -H | 默认的基础url | |
| —users | -u | 并发用户数峰值 | 整数类型 |
| —spawn-rate | -r | 每秒生成用户数 | 支持浮点数 |
| —run-time | -t | 运行时间 | 不设置时默认一直运行 |
| | | |
host
- 默认的请求url
- 我们在使用self.client时,可以只填写路由路径,实际的url
使用方法
- web
- 命令行
- 类中的host变量,在无界面启动时失效,需要手动指定—host或者-H传入
- 代码中设置了host,命令行执行不使用—host,如下图
补充图
扩展
- 实际请求时url的host部分可以与默认host不一致,因为可以在代码中写死请求的url,此时相当于host作废
users和spawn-rate
- users:预期的并发用户峰值数,因为spawn-rate的原因不完全等于并发用户数
- spawn-rate:每秒产生的用户数,适用于超大并发时,控制瞬时流量过高,
- 如1000的users设置—spawn-rate为100,则第1秒产生100用户到第10秒到达1000用户,11s后用户数都固定为1000
- 新版本locust,web界面对应spawn-rate参数的名称为Ramp up
使用方法
案例
- locust的web界面 或 html类型日志-【CHARTS】子界面的【Number of Users】可查看用户具体的增长过程
- 以下为users为100,spawn-rate为10的增长图例
- 从【CHARTS】界面可以看到,第10s时,启动的用户数达到了100

run-time
- locust运行时间
- 支持的单位包括h、m、s,可组合使用,不设置单位时默认为s
使用
- web
- 当前Advanced options下默认支持的参数即为运行时间
- 命令行
扩展
- locust到达设置的运行时间后,会走到quit阶段,但是其主进程实际不会被杀死,除非ctrl+c硬中断退出
- 如果是命令行执行,则可添加
--autostart ----autoquit <秒数>在quit阶段执行后指定的秒数完全退出locust进程
查看
请求统计
web执行时查看
- 即请求发起后的返回结果信息,web执行时在【STATISTICS】界面展示如下

- 对应路由高价值的参数,如下
- 请求次数:Requests
- 失败次数:Fails
- 返回时间:即TPS,从Media到Max都是,一般95%、99%分位的时间,更能反应业务实际情况
- 扩展:
- 在使用web运行locust期间,终端是不会打印统计信息的,如需则添加参数:—print-stats
locust -f case_01_simple.py --print-stats
命令行执行时查看
- 在命令行执行时,每间隔一段时间自动打印请求统计信息,如下

CSV类型
- CSV是locust最推荐的测试记录保存方式,可以使用不同的参数将请求统计日志存放到指定的目录, 并指定文件前缀名称,如下
| 参数名 | 参数说明 | 备注 |
|---|
| —csv <文件名> | 将请求统计信息以CSV格式存储到文件中 | 设置此选项将生成三个文件:<文件名>_stats.csv、<文件名>_stats_history.csv和<文件名>_failures.csv。前缀部分的任何文件夹都将自动创建 |
| —csv-full-history | 将每个统计条目以CSV格式存储到_stats_history.csv文件中 | 必须指定’—csv’参数才能启用此功能 |
- 案例
- 使用—csd,日志使用绝对路径并指定不存在的目录log,指定前缀my
- 使用—csv-full-history,生成my_stats_history.csv文件
locust -f case_01_simple.py --headless -u 10 -r 10 --csv /data/locust/cases/log/my --csv-full-history
- 查看新创建的目录、日志文件
- 日志文件/data/locust/cases/log中log目录被自动创建
- csv文件都以指定的my开头

HTML类型
JSON类型
日志
日志类型
日志配置
日志分析