一.前言
Locust
是一款易于使用的分布式负载测试工具,基于事件驱动,使用轻量级执行单元(如协程)来实现高并发。
二.基本使用
以下是Locust性能测试使用的一个基础Demo示例,该示例有安装Locust、编写测试脚本、启动测试以及监控测试结果。
1. 安装Locust
首先,你需要在你的机器上安装Locust。最简单的方式是使用pip命令进行安装:
pip install locust
如果你打算在多个进程或机器上分布式运行Locust,建议也安装pyzmq库:
pip install pyzmq
2. 编写测试脚本
编写一个Locust测试脚本。Locust测试脚本通常包含至少两个类:一个继承自TaskSet的类用于定义用户行为,另一个继承自HttpLocust(或Locust,如果你不使用HTTP)的类用于设置用户属性和任务集。
以下是一个简单的Locust测试脚本示例,它模拟了用户访问网站首页和关于页面的行为:
import osfrom locust import task, between, TaskSet, HttpUserclass WebsiteTasks(TaskSet):token = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6Imp3dCJ9.eyJza2V5IjoiZmQ2MTZiYjJjYTBlMmEwOGM5YTEwNmFlYzViYzY2ZGM0MmYxNmIzNDAyMzg3MzhhNzVhYmIzYjkwZjg0MmI1OSIsIm53X3VpZCI6ImUwZjBjMDZjLTdmMmYtNDRhMi1hZjQzLTU5YmEyYmY1MDU3YiJ9.Ip_iP_ZQwcsuigTTMKxlYVEbdC84oqsNzE-c1lPkcVA"@taskdef query_user_data(self):payload = {"conditions": {"keyword": "","sort": {"name": "create_time","order_by": "desc"},"start_time": "2024-06-01 00:00:00","end_time": "2025-05-26 00:00:00"},"page": 1,"pagesize": 10,"skey": ""}headers = {"Authorization": self.token,# 其他可能的请求头}# 发送POST请求到登录API,并设置name以便在报告中区分self.client.post("http://localhost:8080/user/search",json=payload,headers=headers,name="user")# @task# def query_answer(self):# payload = {# "query": "什么是年度?",# "task_ids": ["ae62cf79-5870-49f0-94ca-6580b94b6e05"],# "top_k": 3,# "score_threshold": 0.5,# "answer_source": ""# }# # headers = {# # "Authorization": self.token,# # # 其他可能的请求头# # }# # 发送POST请求到登录API,并设置name以便在报告中区分# self.client.post("http://localhost:8080/search_answer",# json=payload,# name="query_answer")# 定义用户类
class WebsiteUser(HttpUser):tasks = [WebsiteTasks] # 将用户行为关联到用户类wait_time = between(1, 2) # 设置用户执行任务的等待时间# 注意:
# 1. 每个@task装饰的方法都代表一个用户可能执行的任务。
# 2. self.client是一个HttpSession实例,你可以使用它来发送HTTP请求。
# 3. name参数是可选的,但它对于Locust生成的报告非常有用,因为它允许你区分不同类型的请求。
# 4. weight参数用于调整任务之间的执行比例(默认是1)。# 运行Locust压测
# 1. 保存上述脚本为locustfile.py(或任何你喜欢的名字)。
# 2. 打开命令行或终端,导航到包含该脚本的目录。
# 3. 运行`locust -f locustfile.py`来启动Locust的Web界面。
# 4. 在浏览器中打开Locust的Web界面(默认是http://localhost:8089),设置用户数和孵化率,然后开始压测。
3. 启动Locust
安装并编写好测试脚本后,你可以通过命令行启动Locust。在命令行中,使用以下命令启动Locust的Web界面:
locust -f locustfile.py
这里的-f选项后面跟的是你的测试脚本文件名。启动后,Locust会在本地启动一个Web服务器(默认端口为8089),你可以通过浏览器访问http://127.0.0.1:8089来设置并发用户数、每秒启动的用户数等参数,并启动测试。
- Number of users :压力测试的用户总量,如上面的100
- Spawn rate:每秒增加的用户量,从10开始增加直到用户总量数停止。
- Host:被测接口的域名或IP端口地址(带http://或者https://)
设置好参数后,点击Start按钮,开始测试,各个页面信息介绍如下。
4. 监控测试结果
在Locust的Web界面中,你可以实时看到测试的统计数据,包括每秒完成的请求数(RPS)、平均响应时间、失败率等。你可以根据这些数据来评估你的系统的性能表现。
顺便介绍几个概念:
PV
是指页面被浏览的次数,比如你打开一网页,那么这个网站的PV就算加了一次;TPS
是每秒内的事务数,比如执行了DML操作,那么相应的TPS会增加;QPS
是指每秒内查询次数,比如执行了SELECT操作,相应的QPS会增加。
Charts分为三个部分,分别是:
Total Requests per Second:
展示随着用户的增加,TPS变化数。Response Times(ms):
展示接口从开始压测,到稳定实时的响应时间,随着压力增加,一般会升高。Number of Users:
展示从0开始,每秒增加10人,直到总数100后不再增加。
5. 命令行模式
除了Web界面外,Locust还支持命令行模式,允许你直接在命令行中运行测试并查看结果。例如:
locust -f locustfile.py --no-web -c 10 -r 2 -t 10m
这个命令表示以命令行模式运行测试,设置并发用户数为10,每秒启动2个用户,测试运行时间为10分钟。
三.总结
优势
- 可编程性:Locust使用Python,这意味着你可以编写Python脚本来定义复杂的用户行为,利用Python的强大库资源。
- 轻量级且易于安装:Locust是一个相对轻量级的工具,安装过程简单方便。
- Web界面:提供一个易于使用的web界面用于启动测试、实时查看测试结果和统计信息。
- 可扩展性:支持分布式测试,你可以很容易地通过增加更多的Slave节点来模拟数十万甚至数百万的并发用户。
- 实时统计:通过Web UI,Locust能够实时展示请求统计、响应时间图表等数据,使结果分析更为直观。
- 适用性广:可以用来测试网站、API、数据库等多种服务的性能。
局限性
- 性能问题:虽然Locust本身是高效的,但它运行Python脚本,这可能不如一些编译语言(如C++或Go)编写的测试工具性能高。
- 资源消耗:在模拟非常高的并发用户数时,Locust(特别是运行Locust的机器)可能会消耗大量的CPU和内存资源。
- 学习曲线:对于那些不熟悉Python的用户来说,初学Locust可能会有一定的学习曲线。
- 对高级负载模式的支持有限:虽然Locust非常灵活,但在一些非常特定的负载测试场景(如具有复杂的用户会话管理或定制的网络协议)中,可能需要进行相当多的自定义编码。
- 社区和支持:尽管Locust有一个活跃的社区,但与某些更成熟的压力测试工具相比(如Jmeter),其用户基础和可用资源可能较少。
总的来说,Locust是一个功能强大且灵活的负载测试工具,特别适合那些熟悉Python并希望快速构建和执行实时监控负载测试的开发者和测试人员。然而,每个工具都有其优势和局限性,选择合适的工具应基于具体的测试需求和场景。
以上就是Locust性能测试使用的一个基础Demo示例。Locust的强大之处在于它的易用性和高并发能力,使得性能测试变得更加简单和高效。你可以根据自己的需求编写更复杂的测试脚本,以模拟更多的用户行为和场景。希望对你有所帮助!