使用Python开源工具locust做性能测试

Posted by Geuni's Blog on January 7, 2022

介绍一个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

locust

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

loust_rs

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

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