使用Python开源工具locust做性能测试
· 阅读需 5 分钟
介绍一个Python开源、 分布式的性能测试工具Locust。相比Loadrunner、Jmeter,单台能发起的负载比较高,而且都是通过代码实现,与其他笨重工具相比对于程序员来说比较易用的。
Locust安装
需要Python 3.6+版本。
pip install locust
如果想安装最新版本(预发布版):
pip install -U --pre locust
确认是否正常安装
locust -V
locust 2.32.5 from /usr/local/lib/python3.9/site-packages/locust (Python 3.9.12)
# 查看帮助
locust --help
Locust基本使用方法
创建Mock API
为了测试,我们先创建一个简单的Mock API。文件名为api.py
。
1. 安装Flask
pip install flask
2. 编写Mock API
api.py
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/hello', methods=['GET'])
def hello():
return jsonify({"message": "Hello"})
@app.route('/world', methods=['GET'])
def world():
return jsonify({"message": "World"})
if __name__ == '__main__':
app.run()
3. 运行Mock API:
python api.py
如果正常运行,可以看到如下输出:
➜ python api.py
* Serving Flask app 'api'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
访问http://127.0.0.1:5000/hello,可以看到{"message":"Hello"}
。
这样,一个简单的Mock API就写完了。
编写Locust测试脚本
然后下面写最一个简单的locust测试脚本,文件名叫locustfile.py
locustfile.py
from locust import HttpUser, task
class TestUser(HttpUser):
# wait_time = between(0.3, 1) # 请求间隔时间:0.3~1秒之间
@task
def hello(self):
self.client.get("/hello") # 向"/hello" URL发送GET请求
@task(3)
def world(self):
self.client.get("/world") # 向"/world" URL发送GET请求(按1:3的比例执行)
脚本说明:
HttpUser
: TestUser继承自HttpUser类。该类用于基于HTTP的负载测试。wait_time
: 设置用户之间的等待时间,between(0.3, 1)
表示0.3秒~1秒的随机时间。@task
: 定义测试任务,数字表示任务执行的相对比例。self.client.get()
: 向指定URL发送GET请求
运行Locust
在编写脚本的目录下运行locust
命令。
如果测试脚本的文件名不是locustfile.py,则需要用*-f*参数指定文件名
例如:locust -f testScript.py
➜ locust
[2022-01-05 16:21:55,257] MacBook-Pro.local/INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
[2022-01-05 16:21:55,275] MacBook-Pro.local/INFO/locust.main: Starting Locust 2.5.1
此时,访问http://localhost:8089,输入必要信息后点击START
按钮,开始压测。
Number of users
: 设置同时访问的用户数。Ramp up
: 设置每秒生成的用户数。Host
: 输入测试目标服务器的URL。
CLI(命令行)模式进行测试
locust也提供命令模式的测试方法,只需提供--headless
参数,如果想简化测试过程,命令模式还是挺便捷的。
locust -f locustfile.py --headless --host http://localhost:5000 -u 1000 -r 100 --run-time 20m
-f
— 测试脚本的文件路径(如果文件名为locustfile.py而且在当前目录,可省略该参数)-headless
—使用命令模式-u
— 用户数-r
— 每秒增加速率
--run-time
— 测试持续时间(可以用-t
替代)
测试结束后或按Ctrl-C
中断后,可以得到如上图所示的测试结果。
分布式模式运行Locust
正式压测的时候,单机发生的负载一般是不够用的,这时候我们就需要分布式的发生负载。
可先用--master
参数启动一个master节点,然后用--worker
参数启动多个worker实例并发生负载。
启 动master:
locust -f my_locustfile.py --master
启动woker:
locust -f - --worker --master-host <your master> --processes 4
-f -
:从主节点获取locustfile,而不是从本地文件系统获取。(从Locust 2.23.0开始支持)--master-host
: 指定主节点的IP地址。--processes
: 不支持Windows。