Python Locust模块
Python Locust: 与JMeter和Tsung不同,是一种用于负载测试服务器的基于Python的选项。
厌倦了目前用于基准测试和负载测试的设备,最近我发现了一个名为Locust的开源工具,可以在我的一个项目中使用。
通过阅读本教程,您将能够使用此负载测试工具。这将给您一个大概的想法,您的服务器支持每秒请求(RPS)有多少。
Locust是一种简单易用的分布式客户端负载测试工具。它旨在对网站(或其他系统)进行负载测试,并确定系统能够处理多少个并发用户。
为什么将此模块命名为Locust
这个想法是在测试中,许多蝗虫(蚂蚱)将对您的网站(或网页)产生竞争。每个Locust的行为方式(也许是蚂蚱或测试客户端)由您定义,并且聚集系统会在Web界面中不断监测。这将帮助您测试并在真正的用户访问之前识别代码中的瓶颈。
Locust是完全基于事件的,因此在单台机器上支持数以万计的并发用户是可能的。与许多其他基于事件的应用程序不同,它不使用回调函数。
它使用轻量级进程来实现事件。每个负载测试您网站的Locust都在其自己的进程内运行(或者准确来说是greenlet)。这样可以让您在Python中编写非常表达性的场景,而不会将您的代码与回调函数弄混。
亮点或特点
1. 使用常规Python编写客户端测试场景
如果您认为您的客户端应该循环执行、执行一些条件行为或进行一些计算,您可以使用Python提供的常规编程结构。Locust使每个客户端在其绿色线程(轻量级进程/协程)内运行。这使您可以像编写正常(阻塞)的Python代码一样编写测试,而不是使用回调函数或其他机制。由于您的场景是“纯python”,因此您可以使用常规的IDE和将您的测试作为普通代码进行版本控制(而不是使用某些使用XML或二进制格式的其他工具)。
2. 分布式和可扩展 – 支持数以万计的用户
Locust可以方便地在多台机器上运行分布式负载测试。它是基于事件的(使用gevent),这使得单个进程能够处理数以万计的并发用户。虽然可能有其他工具在给定硬件上可以处理更多请求数,但每个Locust客户端的低开销使其非常适用于测试高并发任务。
3. 在线UI(Web用户界面)
Locust具有易于使用的Web界面,实时显示您的测试进展。您可以在测试运行时更改负载。它还可以在没有UI的情况下运行,使得CI/CD测试变得简单。
4. 可以测试任何系统
尽管Locust适用于网站/服务,但也可以用于测试几乎任何系统或协议。您可以为您要测试的内容编写一个客户端,或者研究由社区创建的一些客户端。
5. 可编程
Locust的代码库被故意保持简小,不处理所有的问题。一切都考虑到了,我们试图使其易于适应您可能遇到的任何情况,使用常规的Python代码。要向您喜欢的数据库和图表系统发送报告数据,可以通过包装对REST API的调用来处理您的系统的细节,或者运行自定义负载模式;没有任何阻碍!
命令行界面
该模块为我们提供了通过命令行界面运行负载测试的方法。这使得我们可以轻松地执行自动化的负载测试流程。在运行Locust时添加no-web参数。您必须包括主机、用户数量和负载速率。
Locust -f locustfile.py –no-web –host example.com -c 1000 -r 100
- c – 用户数量
- f – 文件路径
- no-web – 在没有Web界面的情况下运行仿真
- r – 负载速率
Python Locust模块安装过程
使用pip命令安装Locust。
命令:
pip install Locust
当Locust成功安装后,你的shell中应该可以访问到Locust的命令。
要查看更多可用选项:
命令:
locust --help
使用LOCUST模块进行负载测试
LOCUST是一个开源的负载测试工具。负载测试是针对系统在特定预期负载下的弹性/行为进行的软件测试。 grasshopper的目标是对网站进行负载测试,并检查系统可以处理的并发用户数。
在locust测试期间,会有大量的错误发生,目标即网站。每个Locust的行为方式是可配置的,并且聚合系统会实时从Web UI进行监控。
源代码:
from locust import HttpLocust, TaskSet, task
from locust import ResponseError
import json
class UserBehaviors(TaskSets):
def __init__(s, parents):
super(UserBehaviors, s).__init__(parents)
s.token = ""
s.headers = {}
def on_start(s):
# The on_start method is called
# when a simulated user starts executing that TaskSet class
s.token = s.login()
s.headers = {'Authorization': 'Bearer {}'.format(s.token)}
s.login()
def login(s):
# admin login and retrieving its access token
response = s.client.post("/login/",
data = {'username': 'admin', 'password': 'ZYT5nsg3565!'})
return json.loads(response._content)['access']
class WebsiteUser(HttpLocust):
# The task_sets attribute should point
# to a class TaskSet which tells the status of the customer
task_sets = UserBehaviors
min_waits = 500
max_waits = 900
上面代码的解释:
首先导入所有必需的模块。然后定义函数和类。
当模拟用户开始执行TaskSet类时,会调用on_start方法。管理员登录并检索其访问令牌。task_sets属性应指向一个告诉客户状态的TaskSet类。
开始运行Locust:
要运行上述代码,请创建一个名为locustfiles.py的Python文件,并在上述创建的文档的注册中打开终端。然后在终端中输入以下命令。
注意: 默认情况下,Locust会查找locustfiles.py文件。
在成功执行以上命令之后,您应该打开一个浏览器并访问http://127.0.0.1:8089
Locust界面如下所示:
输出:
概述
Locust是一个非常方便的Python堆栈测试工具。测试REST API非常简单。然而,测试非RESTful API可能会稍微复杂一些。我们已经向您展示了一种测试非RESTful API的方法。还有其他工具,例如JMeter用于负载测试。JMeter具有较高的学习曲线,每次测试比“Hello World”应用程序更复杂时都会面临挑战。因此,您应该根据自己的需求选择适合您的工具。