跳到主要内容

使用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。

locust-run

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替代)

locust_rs

测试结束后或按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。

官方文档:http://docs.locust.io/en/stable/