一、Locust快速 入门

1 . 介绍

Locust 是一种易于使用、可编写脚本且可扩展的性能测试工具。

您可以在常规 Python 代码中定义用户的行为,而不是被困在 UI 或限制性领域特定语言中。

这使得 Locust 可以无限扩展并且对开发人员非常友好。

  • 用普通的旧 Python 编写测试场景

如果您希望您的用户循环、执行某些条件 行为或进行某些计算,您只需使用 Python 提供的常规编程结构。Locust 在其自己的 greenlet(轻量级进程/协程)中运行每个用户。这使您能够像普通(阻塞)Python 代码一样编写测试,而不必使用回调或其他一些机制。因为你的场景“只是 python”,所以你可以使用你的常规 IDE,并将你的测试作为常规代码进行版本控制。

  • 分布式和可扩展——支持数十万并发用户

Locust 使运行分布在多台机器上的负载测试变得容易。它是基于事件的(使用gevent),这使得单个进程可以处理数千个并发用户。虽然可能有其他工具能够在给定硬件上每秒处理更多请求,但每个 Locust 用户的低开销使其非常适合测试高度并发的工作负载。

  • 基于网络的用户界面

Locust 有一个用户友好的 Web 界面,可以实时显示测试进度。您甚至可以在测试运行时更改负载。它也可以在没有 UI 的情况下运行,使其易于用于 CI/CD 测试。

  • 可以测试任何系统

尽管 Locust 主要用于网站/服务,但它也可用于测试几乎任何系统或协议。只需 为您要测试的内容编写客户端,或探索社区创建的一些客户端。

  • 可入侵

Locust 很小而且非常灵活,我们打算保持这种状态。如果您想将报告数据发送到您喜欢的数据库和图形系统,包装对 REST API 的调用以处理系统的细节或运行完全自定义的加载模式,没有什么能阻止您!

2 .安装

# 安装
> pip install locust -i https://pypi.douban.com/simple

# 验证
> locust -V

3 .编写locustfile

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"})

3.1 必须继承User

​ 一个Locustfile只是一个普通的Python模块,它可以从其他文件或包中导入代码。

class QuickstartUser(HttpUser):

​ 在这里,我们为我们将要模拟的用户定义了一个类。它继承自HttpUser,给每个用户一个客户端属性,也就是HttpSession的一个实例,可以用来向我们要进行负载测试的目标系统发出HTTP请求。

当测试开始时,locust会给它模拟的每个用户创建一个这个类的实例,每个用户都会在自己的绿色gevent线程中开始运行。一个文件要成为有效的locustfile,必须至少包含一个继承自User的类


3.2 任务等待时间

wait_time = between(1, 5)

我们的类定义了一个wait_time,它将使模拟用户在每个任务(见下文)执行后等待1到5秒。更多信息见wait_time属性。


3.3 任务

用@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")

3.3.1 HTTP调用

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)

3.3.2 请求分组

在view_items任务中,我们通过使用一个可变的查询参数加载10个不同的URL。为了不在Locust的统计中得到10个单独的条目–因为统计是根据URL分组的–我们使用名称参数将所有这些请求分组在一个名为"/item "的条目下。

3.3.3 任务初始化和清理

def on_start(self):
    self.client.post("/login", json={"username":"foo", "password":"bar"})

此外,我们还声明了一个on_start方法。当每个模拟用户开始时,将为他们调用这个名字的方法。更多信息见on_start和on_stop方法。


3.4 自动生成 locustfile

你可以使用har2locust来生成基于浏览器记录(HAR-file)的蝗虫文件。

它对不习惯编写自己的locustfile的初学者特别有用,但对更高级的使用情况也是高度可定制的。

注意:

har2locust仍处于测试阶段。它不一定能生成正确的蝗虫文件,而且它的界面在不同的版本之间可能会有变化。

更多教程,更多实战案例,请阅读:https://edu.csdn.net/course/detail/38449

一、Locust快速 入门_第1张图片
更多教程,更多实战案例,请阅读:https://edu.csdn.net/course/detail/38449

你可能感兴趣的:(python,开发语言)