Locust 是一种易于使用、可编写脚本且可扩展的性能测试工具。
您可以在常规 Python 代码中定义用户的行为,而不是被困在 UI 或限制性领域特定语言中。
这使得 Locust 可以无限扩展并且对开发人员非常友好。
如果您希望您的用户循环、执行某些条件 行为或进行某些计算,您只需使用 Python 提供的常规编程结构。Locust 在其自己的 greenlet(轻量级进程/协程)中运行每个用户。这使您能够像普通(阻塞)Python 代码一样编写测试,而不必使用回调或其他一些机制。因为你的场景“只是 python”,所以你可以使用你的常规 IDE,并将你的测试作为常规代码进行版本控制。
Locust 使运行分布在多台机器上的负载测试变得容易。它是基于事件的(使用gevent),这使得单个进程可以处理数千个并发用户。虽然可能有其他工具能够在给定硬件上每秒处理更多请求,但每个 Locust 用户的低开销使其非常适合测试高度并发的工作负载。
Locust 有一个用户友好的 Web 界面,可以实时显示测试进度。您甚至可以在测试运行时更改负载。它也可以在没有 UI 的情况下运行,使其易于用于 CI/CD 测试。
尽管 Locust 主要用于网站/服务,但它也可用于测试几乎任何系统或协议。只需 为您要测试的内容编写客户端,或探索社区创建的一些客户端。
Locust 很小而且非常灵活,我们打算保持这种状态。如果您想将报告数据发送到您喜欢的数据库和图形系统,包装对 REST API 的调用以处理系统的细节或运行完全自定义的加载模式,没有什么能阻止您!
# 安装
> pip install locust -i https://pypi.douban.com/simple
# 验证
> locust -V
import time
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
wait_time = between(1, 5)
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
@task(3)
def view_items(self):
for item_id in range(10):
self.client.get(f"/item?id={item_id}", name="/item")
time.sleep(1)
def on_start(self):
self.client.post("/login", json={"username":"foo", "password":"bar"})
一个Locustfile只是一个普通的Python模块,它可以从其他文件或包中导入代码。
class QuickstartUser(HttpUser):
在这里,我们为我们将要模拟的用户定义了一个类。它继承自HttpUser,给每个用户一个客户端属性,也就是HttpSession的一个实例,可以用来向我们要进行负载测试的目标系统发出HTTP请求。
当测试开始时,locust会给它模拟的每个用户创建一个这个类的实例,每个用户都会在自己的绿色gevent线程中开始运行。一个文件要成为有效的locustfile,必须至少包含一个继承自User的类
wait_time = between(1, 5)
我们的类定义了一个wait_time,它将使模拟用户在每个任务(见下文)执行后等待1到5秒。更多信息见wait_time属性。
用@task装饰的方法是你Locust文件的核心。
对于每一个正在运行的用户,Locust会创建一个greenlet(微线程),它将调用这些方法。
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
@task(3)
def view_items(self):
我们通过用@task装饰两个方法来声明两个任务,其中一个被赋予较高的权重(3)。
当我们的QuickstartUser运行时,它将从声明的任务中挑选一个–在本例中是hello_world或view_items 并执行它。task任务是随机挑选的,但你可以给它们不同的权重*。
上面的配置将使Locust挑选view_items的可能性是hello_world的三倍。
当一个任务执行完毕后,用户将在其等待时间内睡觉(在这种情况下是1到5秒)。在它的等待时间之后,它将挑选一个新的任务,并不断重复。
注意,只有用@task装饰的方法才会被选中,所以你可以用任何你喜欢的方式定义你自己的内部辅助方法。
self.client.get("/hello")
self.client属性使我们可以进行HTTP调用,这些调用将被Locust记录下来。关于如何进行其他类型的请求、验证响应等的信息,请参见使用HTTP客户端。
注意
HttpUser不是一个真正的浏览器,因此不会解析一个HTML响应来加载资源或渲染页面。不过,它将保持对cookie的跟踪
@task(3)
def view_items(self):
for item_id in range(10):
self.client.get(f"/item?id={item_id}", name="/item")
time.sleep(1)
在view_items任务中,我们通过使用一个可变的查询参数加载10个不同的URL。为了不在Locust的统计中得到10个单独的条目–因为统计是根据URL分组的–我们使用名称参数将所有这些请求分组在一个名为"/item "的条目下。
def on_start(self):
self.client.post("/login", json={"username":"foo", "password":"bar"})
此外,我们还声明了一个on_start方法。当每个模拟用户开始时,将为他们调用这个名字的方法。更多信息见on_start和on_stop方法。
你可以使用har2locust来生成基于浏览器记录(HAR-file)的蝗虫文件。
它对不习惯编写自己的locustfile的初学者特别有用,但对更高级的使用情况也是高度可定制的。
注意:
har2locust仍处于测试阶段。它不一定能生成正确的蝗虫文件,而且它的界面在不同的版本之间可能会有变化。
更多教程,更多实战案例,请阅读:https://edu.csdn.net/course/detail/38449