本中介绍如何使用Locust为开发的服务/网站执行负载测试。
Locust 是一个开源负载测试工具,可以通过 Python 代码构造来定义用户行为,避免混乱的 UI 和臃肿的 XML 配置。
步骤
-
设置Locust。
-
在简单的 HTTP 服务上模拟基本负载测试。
准备条件
-
Python(+ pip 用于安装 locust 包)
-
任何模拟负载测试的 HTTP 服务。(开发一个 Spring Boot HTTP 服务作为演示的被测对象)
Spring Boot HTTP 服务
我们通过 Spring Boot 开发了一个简单的 REST API 格式的接口/greet,它不执行 CPU 或 I/O 密集型工作【非事务性接口】,而只是返回一个字符串。将该服务在端口 8080 上本地运行。
Spring Boot HTTP 代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
public class SpringBootLoadServiceApplication {public static void main(String[] args) {SpringApplication.run(SpringBootLoadServiceApplication.class, args);}}@RestController
class RandomResource {@GetMapping(value = "/greet")public String greet() {return "Locust Load Test.";}
}
设置 Locust 脚本文件
现在我们将编写Python 代码(springboot_locust.py)来模拟负载测试,该测试脚本将打到本地8080端点,如下所示代码片段
from locust import HttpUser, task, between #this is self-explanatory we importing required classes, function from locust module.class SpringBootUser(HttpUser): #Simulates a single Real-world User. HttpUser class is extended so we provide what task the user will do.'''this won't take effect in our scenario, as this attribute is optional and specify wait time randomly picked between parameters passed (1-3 seconds) between multiple @task executed. We have only one @task executed'''wait_time = between(1, 3) '''This is main core functionality of locust. @task are treated as a singel http request made. We can multiple have @task. In below we are going to hit /greet endpoint on our localhost'''@taskdef hello_world(self):self.client.get("/greet")
添加注释以确保代码是不言自明的。我们只是定义一个任务,一个任务是一个线程的单次执行。我们也可以有多个任务,以模拟流程和权重来确定它们的执行顺序,否则它们将被随机选取。
现在我们将开始 Locust 测试,通过执行以下命令来启动 Locust Web UI:
locust -f springboot_locust.py
默认情况下,它将在端口 8089 上启动 Locust Web UI 并显示如下:
执行负载测试
我们将执行 2 次测试,一项有 100 个用户,另一项有 1000 个用户。我们将每秒生成 5 个和 20 个用户,直到分别达到 100 和 1000 个最终用户目标。
100 个用户的负载,每秒生成 5 个用户
我们将在填充以下值后 Start Swarming:Locust 逐步增加到 100 个用户,每个用户向 API 发送一个请求
从下面的图表中,我们可以看到,随着负载增加到 100 个用户,其中平均响应时间保持在 2ms,而 95% 百分位响应时间约为 3 毫秒。因此我们可以看到,在处理 100 个用户请求时,用户没有出现任何峰值。
每个测试都有不同的选项卡,如下所示,用于显示测试的实时结果,并且大多数选项卡都是不言自明的。主要使用统计、图表(实时结果)和下载数据(用于共享测试后结果)。
每秒生成 20 个用户,负载 1000 个用户
我们现在将模拟 1000 个用户测试,但每秒生成 20 个用户测试服务的性能:
现在我们看到,有 1000 个用户正在请求 API:
针对测试结果稳定之前,需要给予服务持续的压力,以逐步增加到 1000 个用户。
从下面的图表中,我们可以看到当我们的服务负载以用户增加和请求触发的形式增加时,Locust如何捕获响应时间。随着 API 负载的增加,我们看到中位数以及 95% 百分位响应时间有所增加。
下面结果展示了随着用户持续增加,我们开发的服务响应时间:
-
对于少于400 运行的用户,我们的中值响应时间为2 毫秒,95% 百分位数响应为5 毫秒。
-
对于少于450-675 运行的用户,我们的中值响应时间为3 毫秒,95% 百分位数响应为7 毫秒。
-
对于少于750-1000 运行的用户,我们的中位响应时间为4-5 毫秒,95% 百分位数响应为10-12 毫秒。
因此我们可以看到 Locust 如何提供实时图表来捕获服务的响应时间,这些服务根据负载生成的行为有所不同。显然,上述服务是一个虚拟服务,但在现实场景中,它将有助于识别在负载下行为异常的服务。
当然,这只是一个测试用例,但Locust的用途远不止于此。上述内容可以帮助大家在本地进行基本的负载测试实操。