目前做性能测试,比较简单常用的工具就是jmeter,但是对于一些复杂需求和场景需要编写java代码,如果只会Python能做性能测试吗,当然可以,今天就介绍一下Python强大的性能测试框架Locust。
Locust简介
一个基于python语言的开源性能测试工具,Locust直译为蝗虫,比喻他能产生蝗虫般成千上万的并发,内部使用requests完成http请求,使用协程完成并发请求,提供WebUI美观方便,支持分布式并发,当然也可以根据需要进行二次开发。
它的最重要优点是运行开销小,可以产生更高的并发请求。
更详细的介绍和使用可以查看官网介绍:https://locust.io/
Github地址:https://github.com/locustio/locust
Locust安装
需要Python版本3.6及以上环境。
pip install locust
查看是否安装成功
locust -V
一个简单的Locust案例
新建一个用户行为类,定义任务集(用户行为),包含一个或多个请求。设置压测的基本参数,比如指向压测的host,等待时间等。
from locust import task, HttpUser, between
# 定义用户行为
class UserBehavior(HttpUser):
host = "https://www.baidu.com" # 配置URL
wait_time = between(1,2) # 用户执行每个task之后等待1-2秒
# task装饰的方法会在Locust虚拟用户运行过程中被调用
# 定义任务Locust发送请求是基于requests实现,请求的使用requests库一致
@task
def test_baidu(self):
resp = self.client.get("/")
return resp.status_code
当然,你也可以添加多个请求
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
wait_time = between(1, 2)
# wait_time = constant(3) # 每次请求停顿时间 (思考时间)
# 每个模拟用户开始执行,只执行一次
def on_start(self):
self.client.post("/login", json={"username":"foo", "password":"bar"})
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
# task()参数用于指定该行为的执行权重。参数越大每次被虚拟用户执行的概率越高。
@task(3)
def view_item(self):
for item_id in range(10):
self.client.get(f"/item?id={item_id}", name="/item")
运行Locust
在命令行运行Locust脚本,在cmd下(win),进入到脚本目录,执行命令:
locust -f 文件名.py
设置测试
命令行运行之后,通过浏览器访问:http://localhost:8089(Locust启动网络监控器,默认为端口号为:8089)
出现如下界面启动成功,输入对应的虚拟用户数、用户启动速度,点击Start swarming,开始运行性能测试。
- Number of users:设置模拟用户总数
- Spawn rate(users started/second):每秒新增虚拟用户数
- Host:目标服务器的ip端口或域名
测试监控字段说明
点击STOP,运行完成,查看测试统计如下,类似于jmeter中聚合报告的内容:
- Type:请求的类型,例如GET/POST。
- Name:请求的路径。这里为百度首页,即:https://www.baidu.com/
- request:当前请求数量。
- fails:当前请求失败的数量。
- Median:50%的用户响应时间,单位毫秒
- 90%ile:90%请求响应时间
- Average:所有请求的平均响应时间,单位毫秒。
- Min:最小响应时间,单位毫秒。
- Max:最大响应时间,单位毫秒。
- Average size:平均网络字节数
- Current RPS:每秒请求书(TPS)。
- Current Failures/s:每秒失败数。
响应时间和TPS曲线图