Hi!大家好呀!我是你们努力喵哥!
大家应该对 Jmeter 都不陌生吧。Jmeter 是现在最常用的性能测试工具。对于测试人员来说,Jmeter 技术是必不可少的。
但是,今天喵哥推荐的可不是 Jmeter。因为对于喵哥,Jmeter 有一些喵哥不太顺手的地方。
首先,Jmeter 提供了一个非常完善的 UI 界面。使用者需要在 UI 界面上选择组件来组建起测试脚本。对于很多人来说,可能比较直观。但是,这种方式使整个测试脚本失去了灵活性,只能构建一些简单的测试逻辑。
再则,Jmeter 模拟的负载是线程绑定的,意味着模拟的每个用户,都需要一个单独的线程。单台机器可模拟的负载数有限。对于我们使用个人 PC 测试的话,是非常不利的。
因此今天,喵哥要给大家推荐另一款性能测试神器 Locust。Locust 的寓意是蝗虫。Locust 希望工具生成并发请求就和一大群蝗虫一般,向我们的被测系统发起攻击,以此测试系统在高并发压力下是否能正常运转。
再来严肃的介绍下。Locust 是一款易于使用的分布式负载测试工具。其完全基于事件机制,即一个 Locust 节点也可以在一个进程中支持数千并发用户。不使用回调,通过 gevent 使用轻量级过程(即在自己的进程内运行)。
特性
用 Python 编写用户测试方案
不需要笨拙的UI或庞大的XML,只需编写代码即可。基于协程而不是回调,您的代码逻辑和行为类似于正常的 Python代码。
分布式和可扩展-支持数十万用户
Locust 支持在多台计算机上分布的运行负载测试。由于基于事件,因此即使一个蝗虫节点也可以在单个过程中处理数千个用户。其背后的部分原因是,即使您模拟了这么多用户,也并非所有人都在积极使用您的系统。每秒请求数不等于在线用户数。
基于 Web 的 UI
Locust 具有简洁的 HTML + JS,可实时显示所有相关的测试详细信息。而且由于 UI 是基于 Web 的,因此它是跨平台的并且易于扩展。
可以测试任何系统
即使 Locust 是面向Web的,它也可以用于测试几乎所有系统。只需编写一个您想要测试的客户端并将其与用户一起使用!超级容易!
可入侵的
蝗虫非常小,非常容易入侵,我们打算保持这种状态。事件 I / O 和协程的所有繁重工作都委托给gevent。替代测试工具的脆弱性是诞生 Locust 的原因。
安装
支持的python版本:2.7、3.4、3.5、3.6。
首先升级pip,不然可能会报错
pip install --upgrade pip
然后安装Locust
pip install Locust
安装完成
如果打算运行Locust 分布在多个进程/机器,需要安装 pyzmq。
通过pip命令安装。
pip install pyzmq
使用
在Locust中,您可以使用Python代码定义用户行为。然后,您可以使用该locust命令和(可选)其Web界面在收集请求统计信息时生成并模拟其中的许多用户。
locustfile.py示例
import random
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
wait_time = between(5, 9)
@task
def index_page(self):
self.client.get("/hello")
self.client.get("/world")
@task(3)
def view_item(self):
item_id = random.randint(1, 10000)
self.client.get(f"/item?id={item_id}", name="/item")
def on_start(self):
self.client.post("/login", {"username":"foo", "password":"bar"})
让我们分解一下。
import random
from locust import HttpUser, task, between
蝗虫文件只是普通的Python模块,它可以从其他文件或包中导入代码。
class QuickstartUser(HttpUser)
在这里,我们为要模拟的用户定义一个类。它继承自 HttpUser该client属性,从而为每个用户提供一个属性,该属性是的一个实例HttpSession,可用于向要加载测试的目标系统发出HTTP请求。当测试开始时,蝗虫将为它模拟的每个用户创建一个此类的实例,并且这些用户中的每个将开始在自己的绿色gevent线程中运行。
wait_time = between(5, 9)
我们的类定义了一个wait_time函数,该函数将使模拟用户在每个任务执行后等待5到9秒。有关更多信息,请参见wait_time属性。
@task
def index_page(self):
self.client.get("/hello")
self.client.get("/world")
@task(3)
def view_item(self):
...
我们还通过用修饰两个方法来声明了两个任务@task,其中一个具有较高的权重(3)。当这种类型的用户运行时,它将选择一个index_page或一个(view_item有三倍的选择机会)view_item调用该方法,然后统一选择一个介于5到9之间的持续时间,并在该持续时间内休眠。等待时间过后,它将选择一个新任务并继续重复执行。
@task(3)
def view_item(self):
item_id = random.randint(1, 10000)
self.client.get(f"/item?id={item_id}", name="/item")
在此view_item任务中,我们通过使用查询参数来加载动态URL,该查询参数是一个从1到10000之间随机选择的数字。为了不在Locust的统计信息中获得10k个单独的条目-由于统计信息是按URL分组的,因此我们使用名称参数将所有这些请求分组到一个名为的条目下"/item"。
请注意,只有用修饰的方法@task会被调用,因此您可以根据自己的喜好定义自己的内部帮助器方法。
def on_start(self):
此外,我们还声明了on_start方法。每个模拟用户在启动时都会调用具有该名称的方法。有关更多信息,请参见on_start和on_stop方法。
蝗虫开始
将上面的代码放在当前目录中名为locustfile.py的文件中,然后运行:
$ locust
如果您的蝗虫文件位于其他位置,则可以使用-f。
$ locust -f locust_files/my_locust_file.py
要查看所有可用选项,请输入或检查配置locust --help。
蝗虫的网络界面
使用上述命令行之一启动Locust后,应该打开浏览器并将其指向http://127.0.0.1:8089。然后,您应该会收到类似以下内容的问候:
填写内容并开始!(请注意,如果您不更改蝗虫文件以匹配目标系统,则大多数情况下会收到错误响应)
更多的选择
要运行分布在多个Python进程或计算机上的Locust,可以使用--master命令行参数启动单个Locust主进程,然后使用--worker命令行参数启动任意数量的Locust worker进程。有关更多信息,请参见运行蝗虫。
要直接开始测试而不使用Web界面,请使用--headless。
也可以通过环境变量或在 配置文件中设置参数。
最后
Locust 也有其自身的局限性。目前其本身对测试过程的监控和测试结果展示,不如 jmeter 全面和详细,需要进行二次开发才能满足需求越来越复杂的性能测试需要。
Locust 和 Jmeter 怎么选择那?如果你懂代码,强力建议你使用 Locust。反之,最好还是使用 Jmeter。
Locust 的作者是 Locust.io 团队,共有149位贡献者。Locust 已经开源并维护了10年,在 Github 上收获了 13.3k Star。Locust 也算是比较知名的开源项目了,其用户包含微软、亚马逊、Google等知名互联网企业。
项目地址:https://github.com/locustio/locust
在线官网:https://locust.io/