news 2026/4/16 7:29:00

基于Python代码构造的压力测试工具

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Python代码构造的压力测试工具

Locust 是一个开源负载测试工具,通过 Python 形式的代码构造来定义用户行为,而不是与混乱的 UI 和臃肿的 XML 配置纠缠在一起。

先决条件

Python(+ pip 用于安装 locust 包

任何模拟负载测试的 HTTP 服务。(我们将创建一个小型 Spring Boot HTTP 服务作为本博客演示的一部分

演示 Spring Boot HTTP 服务

我们通过 Spring Boot 创建了一个简单的 REST API,如下所示,它有一个简单的端点/greet,它不执行 CPU 或 I/O 密集型工作,而只是返回一个字符串。该服务在端口 8080 上本地运行,我们将在该端口上执行负载测试。

示例 Spring Boot HTTP 代码

  1. import org.springframework.boot.SpringApplication;

  2. import org.springframework.boot.autoconfigure.SpringBootApplication;

  3. import org.springframework.web.bind.annotation.GetMapping;

  4. import org.springframework.web.bind.annotation.RestController;

  5. @SpringBootApplication

  6. public class SpringBootLoadServiceApplication {

  7. public static void main(String[] args) {

  8. SpringApplication.run(SpringBootLoadServiceApplication.class, args);

  9. }

  10. }

  11. @RestController

  12. class RandomResource {

  13. @GetMapping(value = "/greet")

  14. public String greet() {

  15. return "Locust Load Test.";

  16. }

  17. }

Locust设置

像往常一样,我们将创建并激活虚拟环境以避免将来使用时出现包冲突。

python -m venv virtualenv

激活虚拟环境:

source virtualenv/Scripts/activate.bat

设置虚拟环境后,我们将使用 pip 仅安装 locust 所需的软件包,如下所示:

pip install locust

安装locust后,验证以下是否显示版本以证明安装成功:

locust -V

如果如下所示,我们就可以开始使用 Locust 进行负载测试了。

Locust版本验证

设置 Locust 脚本文件

现在我们将编写一个 Python 代码(springboot_locust.py)来模拟负载测试,该测试将到达我们的本地端点,如下所示。

代码片段

  1. from locust import HttpUser, task, between #this is self-explanatory we importing required classes, function from locust module.

  2. class SpringBootUser(HttpUser): #Simulates a single Real-world User. HttpUser class is extended so we provide what task the user will do.

  3. '''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'''

  4. wait_time = between(1, 3)

  5. '''This is main core functionality of locust. @task are treated as a singel http request made.

  6. We can multiple have @task. In below we are going to hit /greet endpoint on our localhost'''

  7. @task

  8. def hello_world(self):

  9. self.client.get("/greet")

添加注释以确保代码是不言自明的。我们只是定义一个任务,一个任务是一个微线程的单次执行。我们也可以有多个任务,以模拟流程和权重来确定它们的执行顺序,否则它们将被随机选取。

现在我们将开始 Locust 测试,通过执行以下命令来启动 Locust Web UI:

locust -f springboot_locust.py

默认情况下,它将在端口 8089 上启动 Locust Web UI 并显示以下屏幕:

注意:我们不会看到太多的峰值,因为该服务不执行任何 I/O 或 CPU 密集型工作。但想法是看到一个小峰值来验证我们的服务负载测试。但是,我们可以添加 I/O 部分,以基于对本文的响应调用某些 HTTP 或 DB 的形式:)

执行负载测试

我们将执行 2 项测试,一项有 100 个用户,另一项有 1000 个用户。我们将每秒生成 5 个和 20 个用户,直到分别达到 100 和 1000 个最终用户目标。

100 个用户的负载,每秒生成 5 个用户

我们将在填充以下值后开始 Swarming:

Locust 扩展到 100 个用户,每个用户向 API 发送一个请求

从下面的图表中,我们可以看到,随着负载增加到 100 个用户,这没有什么区别,其中平均响应时间保持在 2 毫秒,而 95% 百分位响应时间约为 3 毫秒。因此我们可以看到,在处理 100 个用户请求时,用户没有出现任何峰值。

每个测试都有不同的选项卡,如下所示,用于显示测试的实时结果,并且大多数选项卡都是不言自明的。主要使用统计、图表(实时结果)和下载数据(用于共享测试后结果)。

每秒生成 20 个用户,负载 1000 个用户

我们现在将模拟 1000 个用户测试,但每秒生成 20 个用户,以获得用于博客目的的正确图表并查看服务的反应:

现在我们看到,有 1000 个用户正在使用我们的 API:

在查看下面的图表之前,我们会让服务承受几分钟的压力,以扩展到 1,000 个用户。
从下面的图表中,我们可以看到当我们的服务负载以用户增加和请求触发的形式增加时,Locust如何捕获响应时间。随着 API 负载的增加,我们看到中位数以及 95% 百分位响应时间有所增加。

下面的公告显示了用户扩展所增加的时间:

  • 对于少于400 个运行的用户,我们的中值响应时间为2 毫秒,95% 百分位数响应为5 毫秒

  • 对于少于450-675 名运行的用户,我们的中值响应时间为3 毫秒,95% 百分位数响应为7 毫秒

  • 对于少于750-1000 名运行的用户,我们的中位响应时间为4-5 毫秒,95% 百分位数响应为10-12 毫秒*

因此我们可以看到 Locust 如何提供实时图表来捕获服务的响应时间,这些服务根据负载生成的行为有所不同。显然,上述服务是一个虚拟服务,但在现实场景中,它将有助于识别在负载下行为异常的服务。然后可以通过分析工具进行传递,以便根据 locust 报告进行进一步分析。

可以在此处找到相同负载测试的报告。

显然,这只是一个主要用例,但Locust的用途远不止于此。上述内容可以帮助您在本地进行基本的单元负载测试,然后再在集成环境中进行测试。

除此之外,还有许多可用的自定义项,这些自定义项在文档中指定,下面的链接也是如此。

相关链接:

Locust官方网站:https://locust.io/

Locust文档:https://docs.locust.io/en/stable/

用于博客的完整源代码

https://github.com/cycorax12/locust-load-test

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 14:26:20

错过Open-AutoGLM autodl等于错过AI未来?5个理由告诉你必须立即上手

第一章:错过Open-AutoGLM autodl等于错过AI未来?在人工智能技术飞速演进的当下,自动化机器学习(AutoML)正从辅助工具演变为驱动创新的核心引擎。Open-AutoGLM 的 autodl 框架凭借其对大语言模型与自动深度学习的深度融…

作者头像 李华
网站建设 2026/4/13 9:11:43

Java毕设选题推荐:基于springboot的社区居民服务系统的设计与实现 “便民服务 - 信息交互 - 事务管理” 的一体化平台【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/14 23:10:32

CUDA/NCCL/NVlink实现GPU之间的通信/GPU不同架构解读

CUDA解读 NCCL解读 NCCL 是 NVIDIA Collective Communications Library 的缩写 读法就是:妮蔻(NCCL) 参考视频: https://www.bilibili.com/video/BV1SWpXe2Epa/?spm_id_from333.337.search-card.all.click&vd_source132c…

作者头像 李华
网站建设 2026/4/14 4:27:25

2025大模型产品经理黄金元年:7阶段学习路线+免费资源包助你高薪转型_零基础转行大模型产品经理

本文揭示了2025年大模型产品经理的黄金机遇,详细介绍了转型所需的5大核心能力模型和零基础逆袭的7阶段学习路线,并通过真实案例展示成功路径。文章还附赠技术文档、实战项目和求职资源包,助力程序员和职场人士快速掌握大模型产品技能&#xf…

作者头像 李华
网站建设 2026/3/14 3:00:18

大模型应用开发必学:提示工程、RAG与微调全解析【建议收藏】

本文详细介绍大模型应用开发三种模式:提示工程(优化输入)、RAG(检索增强生成)和微调(参数调整)。重点解析RAG技术原理,通过外部知识库检索提高回答准确性和时效性,减少幻觉问题。提供DeepSeekFaiss搭建本地知识库的实战代码,以及查…

作者头像 李华
网站建设 2026/4/5 11:11:32

为什么企业都在用TensorFlow镜像跑大模型Token任务?

为什么企业都在用TensorFlow镜像跑大模型Token任务? 在大模型落地的战场上,一个看似不起眼的技术选择——使用 TensorFlow 官方镜像——正悄然成为工业界的标准动作。无论是金融领域的命名实体识别、医疗文本中的术语抽取,还是智能客服中的意…

作者头像 李华