介绍一个Python开源、 分布式的性能测试工具Locust。相比Loadrunner、Jmeter,单台能发起的负载比较高,而且都是通过代码实现,与其他笨重工具相比对于程序员来说比较易用的。
安装
需要Python 3.6+版本,用pip3安装。
1
pip3 install locust
如需要安装最新(开发)版,可执行:
1
pip3 install -U --pre locust
确认是否正常安装
1
2
3
4
locust -V
locust 2.5.1
#查看帮助
locust --help
做一个简单的例子
为了测试,简单写个API,文件名叫api.py
1
2
3
4
5
6
7
8
9
10
11
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get('/')
def hello():
return 'Hello World!'
if __name__ == '__main__':
uvicorn.run(app)
我这边用pipenv执行:
1
pipenv run python api.py
会有如下输出
1
2
3
4
5
6
➜ pipenv run python api.py
INFO: Started server process [6814]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: 127.0.0.1:50722 - "GET / HTTP/1.1" 200 OK
访问http://127.0.0.1:8000,会返回一个Hello World!
,这样简单用于测试的API写完了。
然后下面写最一个简单的locust测试脚本,文件名叫locustfile.py
1
2
3
4
5
6
7
from locust import HttpUser, task
class ApiTestUser(HttpUser):
@task(1)
def hello_world(self):
self.client.get("http://localhost:8000")
写好了到脚本所在目录执行locust
命令,正常会有如下输出:
如果测试脚本的文件名不是locustfile.py,则需要用-f参数指定文件名
例如:locust -f testScript.py
1
2
3
➜ 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 swarming进行压测。
首页依次填入要模拟的总用户数,用户数每秒增长速率,测试对象的域名或IP
用CLI(命令行)进行测试
locust也提供命令模式的测试方法,只需提供--headless
参数,如果想简化测试过程,命令模式还是挺便捷的。
1
locust -f locustfile.py --headless --host http://localhost:8000 -u 1000 -r 100 --run-time 20m
-f
— 测试脚本的文件路径(如果文件名为locustfile.py而且在当前目录,可省略该参数)-headless
—使用命令模式-u
— 用户数-
-r
— 每秒增加速率 --run-time
— 测试持续时间(可以用-t
替代)
测试结束或按Ctrl-C
中断后,能获得如上测试结果。
用分布式模式进行测试
正式压测的时候,单机发生的负载一般是不够用的,这时候我们就需要分布式的发生负载。
可先用--master
参数启动一个master节点,然后用--worker
参数启动多个worker实例并发生负载。
启动master:
1
locust -f my_locustfile.py --master
启动woker:
1
locust -f my_locustfile.py --worker --master-host=192.168.0.14
--master-host
参数,指定你的master节点的IP即可。