使用 Locust 进行 API 负载测试

使用 Locust 进行 API 负载测试

使用 Locust 进行 API 负载测试:介绍

您以前可能遇到过这种情况:您编写代码来做某事,例如端点。 您使用 Postman 或 Insomnia 测试您的端点,一切正常。 您将端点传递给客户端开发人员,然后他们使用 API 并部署应用程序。 但是,当用户使用该应用程序时,API 会失败。

这可能是一个非常烦人的情况,更不用说对企业来说代价高昂了。 这就是软件开发人员对软件系统进行各种测试以确保它们按预期运行的原因。 API 也不例外。 在部署之前,你至少应该做性能测试和安全测试。

性能测试可以分为功能测试和负载测试。 功能测试是您通常使用 Postman 或 Insomnia 的目的。 它们确保您的 API 按您的预期运行。 另一方面,负载测试更关注您的 API 如何在实际使用和峰值负载下执行,这就是本文的主题。 让我们更详细地看一下负载测试。

什么是 API 负载测试?

API 负载测试是开发人员用来模拟端点上的正常和峰值负载的一种测试。 这种测试让开发人员可以在部署 API 之前评估其在现实世界中的性能。 它帮助他们确定系统的最大运行容量、瓶颈(如果有)和性能下降。 API 负载测试通常通过创建虚拟用户然后使用它们同时测试 API 的功能来完成。 

API 负载测试测量响应时间、并发用户、吞吐率、资源利用率水平、平均故障间隔时间 (MTBF)、平均故障时间 (MTTF) 等指标。 所有这些指标都可用于确定 API 的运行情况。

负载测试的类型

负载测试有多种类型,每种都有其用例。 让我们来看看其中的一些。

负载测试: 这是负载测试的基本形式。 它用于评估系统(在本例中为 API)在正常负载和预期峰值负载下的性能。

压力测试: 这用于评估系统在非常重的负载下的性能。 此测试的目的是查看系统是否在故障后恢复,以及恢复需要多长时间。 负载通常缓慢增加,直到超过系统的能力。

尖峰测试: 这有点类似于压力测试,只是突然施加重负载,而不是慢慢增加。 这种测试代表当您的平均用户或访问者数量突然激增,或者当您的系统受到 DDOS 攻击时会发生什么。

浸泡测试: 这个测试不同于上面的其他测试。 它使您的系统处于正常负载的 80%(或大约)以下,并使其运行很长时间,比如 12 到 14 小时。 这种测试决定了系统在一段时间内的可靠性。

使用 Locust 对 API 进行负载测试

开发人员可以访问各种选项来对其 API 进行负载测试。 一些常见的负载测试工具是 Gatling、JMeter 和 Locust。 我们将在本文中重点介绍 Locust。

Locust 是一种基于 Python 的开源负载测试工具,谷歌、微软和 Riot Games 等顶级公司使用它来测试他们的 API。 在本文中,我们将演示如何对 API 进行负载测试。 

对于本教程,我将使用 Flask 创建一个简单的 API。 您可以跟着我一起学习,也可以只使用 Node 或您熟悉的任何框架创建您的 API。

岗位要求

Python的3

设置和安装

首先,您需要在您的 PC 上设置一个虚拟环境,这样您就不会弄乱您的全局 Python 环境。 为此,请运行以下命令。 请注意,这些命令适用于 Windows 终端。

$ mkdir 项目

$ cd /d 路径\到\项目

$ python -m venv venv

$ venv\脚本\激活

 

首先,我们创建了一个 项目 目录。 然后我们将当前目录更改为 项目. 然后,我们在该目录中为 Python 创建并激活了一个虚拟环境。 

现在,我们将继续安装 长颈瓶(我们将使用它来创建要进行负载测试的端点)和 刺槐 本身。 

 

要安装 Flask,请运行。 确保你在 项目 您创建虚拟环境的位置。

$ pip 安装烧瓶

 

要安装蝗虫,请运行

$ pip 安装蝗虫

 

完成后,键入以下命令。 确保你在你的 项目 执行此操作时的目录。

$ 复制 nul __init__.py

$ mkdir 应用程序

$ 复制 nul app\app.py

$ 复制 nul app\__init__.py

 

此命令创建一些文件,我们将使用这些文件使用 Flask 创建端点。 顺便说一句,您也可以使用文件资源管理器创建这些文件。 但这有什么乐趣呢? 完成后,将以下代码复制到 应用程序

从烧瓶导入烧瓶,jsonify,请求

app = Flask(__ name__)

汽车模型 = [

  { 'brand': 'Tesla', 'model': 'Model S' }

]

 

平面模型 = [

  { '品牌': '波音', '型号': '747' }

]

 

@app.route('/汽车')

def get_cars():

  返回 jsonify(car_models)

@app.route('/飞机')

def get_planes():

  返回 jsonify(plane_models)

如果 __name__ == '__main__':

    应用程序运行(调试=真)  

 

上面的代码包含一个方法 得到_汽车 用于获取汽车品牌及其型号的列表,以及 获取飞机 用于获取飞机品牌及其型号的列表。 为了对这个端点进行负载测试,我们需要运行 app.py。 为此,请运行以下命令。

$ python 路径\to\app.py

一旦你运行它,你应该看到这样的东西:

API 负载测试 1

如果您从终端复制 URL 并输入 汽车 or 飞机 在 / 之后,您应该能够在那里看到数据。 但是,我们的目标是使用 locust 测试端点,而不是使用浏览器。 所以让我们这样做吧。 在您的根目录中运行以下命令 项目 目录。

 

$ 复制 nul locust_test.py

 

这会在您的根目录中创建一个“locust_test.py”文件 项目 目录。 完成后,打开文件并粘贴以下代码。 我们将很快解释。

 

进口时间

从蝗虫导入 HttpUser,任务,之间

 

用户行为类(HttpUser):

    等待时间 = 之间 (5, 10)

 

    @任务

    def get_cars(自我):

        self.client.get('/汽车')

    

    @任务

    def get_planes(自我):

        self.client.get('/飞机')

 

这是使用 Locust 对 API 进行负载测试的基本示例。 首先,我们创建一个类 用户行为,可以给它任何适当的名称,但必须扩展 Http用户。 HTTP用户 是负责实例化多个虚拟用户以执行我们在 用户行为 类。 

通过使用以下方法装饰方法来指定任务 @任务 装饰器。 我们还有一个函数叫做 之间() 这允许我们指定在执行下一个任务之前要等待的秒数范围。 您可以看到我们在代码中为此分配了 5 到 10 秒的范围。 

要运行代码,请确保您仍在虚拟环境中。 如果您创建的那个正在被服务 API 的服务器使用,请打开一个新终端,将您的目录更改为您的 项目 目录,并激活您创建的虚拟环境。 您可以在上面找到用于激活虚拟环境的命令。 现在,在您的终端中输入以下命令。

 

$ 蝗虫 -f locust_test.py

 

你应该看到这样的东西:

API 负载测试 2

默认情况下,locust 的 Web 界面位于 http://localhost/8089。 如果您访问该网站,您应该会看到如下界面:

API 负载测试 3

从界面上,我们可以指定用户数量、产生率(每秒创建的用户)和主机。 您可以通过检查服务器运行的终端来获取主机的地址。 在我们的例子中,它位于端口 5000。当您单击 开始蜂拥而至, 您将看到下面的界面。

API 负载测试 4

这会向您显示各种有用的指标,例如失败请求的数量、请求的平均时间、请求的最短时间、每秒请求数等。 一旦您对所看到的内容感到满意,就可以单击停止按钮。 


除了 统计报表 选项卡,有一个 图表 显示更多的选项卡 信息 以图表的形式,如下图所示。

有一个 每秒总请求数图, 响应时间图,用户数图, 都是针对时间绘制的。 使用这些图表,您可以确定有多少用户可以接受固定的响应时间,或者您可以观察您的图表以获得恒定的响应时间,尽管用户数量在增加,以及其他类似的见解。 如果你想分享这些 统计 与其他人一起,您可以从 下载数据 标签。

总结...

对您的 API 进行负载测试是您开发过程中的一项重要活动,因此请确保将其纳入您的设计周期。 顺便说一句,您还可以通过改变用户数量和生成率的值来执行其他负载测试类型。 

如果您想进行尖峰测试,请为用户数指定一个较大的值(比如 2000),然后为您的生成率指定一个同样大的值(例如 500)。 这意味着在 4 秒内,您将创建所有 2000 个用户并访问您的端点。 压力测试将是类似的,但生成率的值要低得多。 要了解您能做的一切,请查看 Locust 文件