当前位置: 首页 > news >正文

用JMeter对HTTP接口进行压测(一)压测脚本的书写、调试思路

文章目录

  • 安装JMeter和Groovy
    • 为什么选择Groovy?
  • 压测需求以及思路
  • 准备JMeter脚本以及脚本正确性验证
    • 使用Test Script Recorder来获取整条业务线上涉及的接口
      • 为什么使用Test Script Recorder?
    • 配置Test Script Recorder
    • 对接口进行动态化处理
      • 处理全局变量以及命名各接口
      • 接口请求前、请求后的脚本处理
        • 使用JSR233 PreProcessor读取商品ID
        • 请求接口
        • 使用Regular Expression Extractor Post-Processors来处理接口响应并为下一个接口设置变量
        • 使用Debug Sampler或Debug PostProcessor来调试脚本
        • 继续下一个接口
        • 在提交表单项时存在多个值的动态处理
  • 撤销JMeter的某些改动
  • 结语

安装JMeter和Groovy

Mac OS下使用Homebrew安装

brew install jmeter
brew install groovy

安装完毕之后,确保jmeter和groovy没问题

直接启动JMeter

jmeter

查看groovy版本

groovy -v

为什么选择Groovy?

在JMeter中使用脚本语言有BeanShell和Groovy,因为Groovy和Java更相近,所以选择Groovy。虽然以前没接触过Groovy,但是靠着IDE和官方文档、Google上手还算顺利。

压测需求以及思路

因为是需要对整条业务流程进行压测,所以各个接口之间的请求、响应需要相互依赖,做起来有点像自动化测试的流程,只不过自动化测试专注于验证测试流程结果是否准确,而这里的压测专注于某些接口是否有问题。

由于我不属于自动化测试团队,所以在我接到这个需求的时候,第一个想法就是如何准备测试数据

因为压测的是用户购买的流程,但是在用户购买之前,商家需要创建商品、根据不同的业务再给商品设置一些特殊的属性,例如商品显示设置、购买限制、折扣等。这些其实就是准备数据了。

毕竟压测还是想做成自动化的,如果做成自动化的话,那么准备数据的脚本也要写,但是这一部分其实是和自动化测试重复了。经过考虑之后,决定做成半自动化。也就是准备数据来自于自动化测试,先运行自动化测试生成基础准备数据,在基础准备数据之上,再手动做一些配置,例如给商品加很多库存等。因为我们的自动化测试对于商品不会有很多库存,而压力测试必须运行在很多库存的前提下,所以这一步通过手动配置,最后再运行压力测试。大概思路就是这样,虽然不是尽善尽美,但是能基本保证工作重心在压力测试的脚本准备以及测试上,而不是准备数据上。

准备JMeter脚本以及脚本正确性验证

由于整条业务线涉及到N个接口,所以我这里只拿几个接口来举例子,每个接口的配置思路以及调试方式基本类似。

使用Test Script Recorder来获取整条业务线上涉及的接口

为什么使用Test Script Recorder?

不知道Test Script Recorder的同学,建议先去读一遍官方文档。一句话概括就是,它会把你在页面上各种点点点的动作设计到的请求都记录下来,生成一个集合。

现实情况可能是这样:

  1. 开发团队没有接口管理工具(或者即使有),但是当前测试的这条业务线涉及的都有哪些接口,写压测脚本的人不一定很清楚。即写压测的人和开发的人不是一拨人。这种情况下,不太可能花太多时间再去了解其业务、接口传参、接口返回等等。
  2. 整体业务线接口多、复杂,各种情况都有(这在现实中很常见),而我们要测的这条线的某种场景,可能并不需要传某些参数或者处理某些响应,这样我们也不需要花太多时间去搞清楚到底什么该传什么。
  3. 方便,不需要自己一个接口一个接口的去建相关的HTTP Request Sampler,只需要进行一些参数动态处理即可。大大减少了我们的工作量。

我们只需要使用Test Script Recorder,像功能测试一样,按照我们要测试的流程,一路在页面上点下来,正常完成业务流程即可,就可以拿到,该测试流程上的所有请求接口了。

配置Test Script Recorder

直接参考JMeter官方Test Script Recorder一节即可。

注意:浏览器要使用官方文档中提到的Iceweasel/Firefox,我一开始也看到了文档,但是天真的以为是个浏览器就行,在尝试了Google和Edge之后无果后,乖乖地下载了一个Firefox浏览器。

对接口进行动态化处理

到这一步,你本地应该已经成功运行了Test Script Recorder并拿到了相关接口集合,如果没有的话,建议阅读上面提到的官方文档,确保拿到接口集合之后再阅读这部分。

处理全局变量以及命名各接口

对于每个接口都会用到的scheme、host、port、contextPath,放在User Defined Variables中,在这里插入图片描述
并在HTTP Request Defaults中引用,在这里插入图片描述
对于每个接口,最好重命名每个Http Request Sampler使其能体现出该Sampler对应的功能,这样做不仅见名知义,对于以后更复杂的压力测试,我们可能会使用多个Test Fragment来完成,也有助于以后我们拆分或重构压力测试脚本。不会因为各种奇葩命名而去花费时间再去搞清楚该脚本到底是干嘛用的。

接口请求前、请求后的脚本处理

每个接口的请求数据都是动态的,我们使用Test Script Recorder得到的接口集合里面的数据是静态的,这一步我们就是要把数据变成动态的。完成这一工作的是Pre Processors和Post-Processors。

我们前面说过,压力测试的基础数据来自于自动化测试,好在自动化测试团队将测试过程中生成的关键信息,例如商家ID、商品ID写入某个文件, 所以在请求接口之前我们需要读取该文件拿到商品ID列表,并随机获得一个商品ID

使用JSR233 PreProcessor读取商品ID

在这里插入图片描述
在显示商品接口请求之前,使用Groovy读取文件来随机获得商品ID和后续用来购买的邮件地址,并通过vars.put将其放到对应的变量中去以便后续可以读取。
关于vars支持的方法以及用法请参考JMeter官方文档最佳实践一节以及用户手册中的Function一节

请求接口

在这里插入图片描述
这里通过${itemId}引用刚刚在PrePocessor中设置的值

使用Regular Expression Extractor Post-Processors来处理接口响应并为下一个接口设置变量

由于我们这里的业务流程是MVC,而不是REST,所以返回的是个HTML页面,所以通过正则表达式后置处理器来获取页面中的元素在这里插入图片描述
这里对要获取的页面元素使用正则表达式的捕获组,也就是要用(),$1$代表第一个捕获组,以此类推。

Match No. (0 for Random) Indicates which match to use. The regular expression may match multiple times

这里会把正则表达式的结果赋值给onSale,和vars.put一样,以便后续接口可以引用

使用Debug Sampler或Debug PostProcessor来调试脚本

在对整条业务线的接口进行动态化处理的时候,我建议是:

  • 一个接口一个接口来,即改完一个接口,验证一个,没问题再继续下一个。
  • 如果是中间的接口,则是该接口没问题之后,还要和前面已验证的接口一起再验证一遍,确保接口本身动态化没问题,确保整条业务线到该接口处是正确的。
  • 在修改接口的过程中,将在该接口后面的接口先暂时Disable掉。

验证脚本 > Thread Group 右键> Validate
如果有问题了,例如没参数是空、或者请求失败等,我们需要知道,是否正确地读取了数据和正确地处理了响应数据。这时我们就需要知道,在整个脚本运行过程中,那些动态参数到底是什么?

Debug Sampler和Debug PostProcessor二者作用类似,都是将脚本运行中的参数打印出来,我一般使用Debug Sampler,放在最后面,如上面的几张截图一样。

继续下一个接口

在这里插入图片描述
这里使用If Controller来判断上一个接口响应设置的onSale是否不为空,如果不为空,则进入该controller的里面的接口。这里的接口动态化和验证和上面的类似 ,按照上述原则,这个接口验证没问题了,就可以下一个,下一个没问题,再下一个,直到整条业务线接口都覆盖到。不再赘述。

在提交表单项时存在多个值的动态处理

如果表单中每一项的HTML元素只对应一项,那么使用上面的流程没什么问题。有时候,我们一个元素可能会提交多项,正常的HTML表单提交上来的是

itme_id_1: 1
item_id_2: 2
item_id_3: 3

这种,如何处理这种情况的呢?举个例子,在Pre Processor中使用如下脚本即可

def idPrefix = "item_id_"
for(i in 1..30) {var key = idPrefix + idef value = vars.get(key)if(value){sampler.addArgument("item_ids", value)} else {break}
}

有关该问题可参考stackoverflow更详细的回答

撤销JMeter的某些改动

一般在写脚本的时候,保存之前 Command + Z就可以撤销,但是保存之后就撤销不了了。平时没什么问题,但是有些极特殊情况下,在保存之后想要撤销怎么办呢?

我在写脚本期间,由于JMeter不能开多个窗口,导致我有时候会频繁切换jmx文件,有一次把整体业务线的压力测试接口都已调整好了,但是我此时在JMeter中又使用Test Script Recorder中玩了一遍其他流程,然后保存了…当我反应过来之后我直接傻了,相当于之前所有的工作白做了…慌得要死…

经过调查,幸好JMeter有backup机制,默认最大备份文件是10个,文件路径是JMeter安装路径下的backups目录。不过这些都可以修改。也算是虚惊一场了。

结语

本博文没有对JMeter中的各个组件及其概念做过多介绍,我认为,这些基础的东西看看官方文档,自己多配置几个脚本就基本知道这些组件到底是干嘛的了,官方文档已经是最精华的教学文档了,我就不必在这里再次赘述了。

希望想要学习JMeter的同学,多读官方文档,遇到概念不清楚、配置不清楚的问题按图索骥即可。刚上手的同学建议多读FAQ以及Best Practices部分。

下一篇将介绍如何搭配Jenkins Job来实现半自动化压力测试,以及使用Grafana可视化压测结果,以及使用其他工具来分析压测过程中是否存在性能瓶颈。

相关文章:

用JMeter对HTTP接口进行压测(一)压测脚本的书写、调试思路

文章目录 安装JMeter和Groovy为什么选择Groovy? 压测需求以及思路准备JMeter脚本以及脚本正确性验证使用Test Script Recorder来获取整条业务线上涉及的接口为什么使用Test Script Recorder? 配置Test Script Recorder对接口进行动态化处理处理全局变量以…...

接着聊聊如何从binlog文件恢复误delete的数据,模拟Oracle的闪回功能

看腻了文章就来听听视频演示吧:https://www.bilibili.com/video/BV1cV411A7iU/ delete忘加where条件(模拟Oracle闪回) 操作基本等同于上篇:再来谈谈如何从binlog文件恢复误update的数据,模拟Oracle的回滚功能 原理&a…...

计算机竞赛 深度学习机器视觉车道线识别与检测 -自动驾驶

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 🔥 优质竞赛项目系列,今天要分…...

pyqt5使用经验总结

pyqt5环境配置注意: 安装pyqt5 pip install PyQt5 pyqt5-tools 环境变量-创建变量名: 健名:QT_QPA_PLATFORM_PLUGIN_PATH 值为:Lib\site-packages\PyQt5\Qt\plugins pyqt5经验2: 使用designer.exe进行设计&#xff1…...

【MQTT】mosquitto库中SSL/TLS相关API接口

文章目录 1.相关API1.1 mosquitto_tls_set1.2 mosquitto_tls_insecure_set1.3 mosquitto_tls_opts_set1.4 mosquitto_tls_insecure_set1.5 mosquitto_tls_set_context1.6 mosquitto_tls_psk_set 2.示例代码 Mosquitto 是一个流行的 MQTT 消息代理(broker&#xff09…...

假期题目整合

1. 下载解压题目查看即可 典型的猪圈密码只需要照着输入字符解开即可得到答案 2. 冷门类型的密码题型,需要特意去找相应的解题思路,直接百度搜索天干地支解密即可 3. 一眼能出思路他已经给了篱笆墙的提示提示你是栅栏密码对应解密即可 4. 最简单的社会主…...

Redisson—分布式服务

一、 分布式远程服务(Remote Service) 基于Redis的Java分布式远程服务,可以用来通过共享接口执行存在于另一个Redisson实例里的对象方法。换句话说就是通过Redis实现了Java的远程过程调用(RPC)。分布式远程服务基于可…...

volatile使用方法

volatile使用方法 编译优化。使用等级3的话,可能将优化了一些变量。 这为什么会开启等第三呢?这是关于单片机的内存容量比较小,所以开启优化的话,可以可以省一些空间,但是如果。会出现些变量的问题,需要通过…...

提升您的 Go 应用性能的 6 种方法

优化您的 Go 应用程序 1. 如果您的应用程序在 Kubernetes 中运行,请自动设置 GOMAXPROCS 以匹配 Linux 容器的 CPU 配额 Go 调度器 可以具有与运行设备的核心数量一样多的线程。由于我们的应用程序在 Kubernetes 环境中的节点上运行,当我们的 Go 应用程…...

计算摄像技术02 - 颜色空间

一些计算摄像技术知识内容的整理:颜色视觉与感知特性、颜色空间和基于彩色滤镜阵列的彩色感知。 文章目录 一、颜色视觉与感知特性 (1)色调 (2)饱和度 (3)明度 二、颜色空间 (1&…...

Pytorch笔记之分类

文章目录 前言一、导入库二、数据处理三、构建模型四、迭代训练五、模型评估总结 前言 使用Pytorch进行MNIST分类,使用TensorDataset与DataLoader封装、加载本地数据集。 一、导入库 import numpy as np import torch from torch import nn, optim from torch.uti…...

【目标检测】——PE-YOLO精读

yolo,暗光目标检测 论文:PE-YOLO 1. 简介 卷积神经网络(CNNs)在近年来如何推动了物体检测的发展。许多检测器已经被提出,而且在许多基准数据集上的性能正在不断提高。然而,大多数现有的检测器都是在正常条…...

Java 数组转集合

数组转集合 如果仅仅这样转化Arrays.asList(数组)&#xff0c;导致集合只能查询&#xff0c;无法进行其他操作&#xff0c;因此&#xff0c;对该方法进行优化&#xff1a; List<实体> list1 new ArrayList<>(Arrays.asList(数组))以上方法就可以使用集合的所有操…...

Elasticsearch:ES|QL 查询语言简介

警告&#xff1a;此功能处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。 Elastic 将尽最大努力解决任何问题&#xff0c;但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。在目前的 Elastic Stack 8.10 中此功能还没有提供。 Elasticsearch 查询语言 (ES|…...

qt qml中listview出现卡顿情况时的常用处理方法

如果在qt QML中使用ListView时出现卡顿情况&#xff0c;可能是因为渲染大量的数据或者在模型中进行复杂的数据处理。以下是常用的解决方法&#xff1a; 1. 设置ListView的缓存策略&#xff1a;通过设置ListView的cacheBuffer属性为适当的值&#xff0c;可以提高滚动的流畅性。…...

Elasticsearch基础操作演示总结

一、索引操作 &#xff08;一&#xff09;创建索引 创建Elasticsearch&#xff08;ES&#xff09;索引是在ES中存储和管理数据的重要操作之一。索引是用于组织和检索文档的结构化数据存储。 当创建Elasticsearch索引时&#xff0c;通常需要同时指定索引的设置&#xff08;Se…...

Spring 作用域解析器AnnotationScopeMetadataResolver

博主介绍&#xff1a;✌全网粉丝近5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经…...

如何发布一个 NPM 包

首先初始化: npm init 文件夹结构 .gitignore Git 库忽略文件清单.npmignore 不包括在 npm 注册库中的文件清单LECENSE 模块的授权文件README.md 说明文档bin 保存模块可执行文件的文件夹doc 保存模块文档的文件夹example 保存模块实际示例lib 保存模块代码man 保存模块的手册…...

Flask小项目教程(含MySQL与前端部分)

CONTENTS 1. 环境配置2. 快速搭建Flask应用程序 1. 环境配置 首先我们在项目的根目录下创建一个 Python 虚拟环境&#xff0c;打开命令行输入以下指令&#xff1a; python -m venv venv启动虚拟环境&#xff1a; .\venv\Scripts\Activate.ps1如果遇到报错&#xff1a;.\venv…...

Eureka

大家好我是苏麟今天带来Eureka的使用 . 提供者和消费者 在服务调用关系中&#xff0c;会有两个不同的角色&#xff1a; 服务提供者&#xff1a;一次业务中&#xff0c;被其它微服务调用的服务。&#xff08;提供接口给其它微服务&#xff09; 服务消费者&#xff1a;一次业务…...

AI工具导航与实战指南:从分类体系到选型策略

1. 项目概述&#xff1a;AI-Infinity&#xff0c;一个前沿AI工具的探索者指南如果你和我一样&#xff0c;对AI领域层出不穷的新工具感到既兴奋又头疼&#xff0c;那么这个项目绝对值得你花时间深入了解。AI-Infinity&#xff0c;这个由开发者meetpateltech维护的GitHub仓库&…...

为AI智能体构建持久化记忆系统:Shang Tsung项目实战解析

1. 项目概述&#xff1a;为AI智能体注入“灵魂”与“第二大脑”如果你和我一样&#xff0c;长期与各类AI智能体&#xff08;Agent&#xff09;打交道&#xff0c;无论是基于Claude Code、OpenClaw&#xff0c;还是其他本地化部署的LLM工具&#xff0c;你一定经历过那种令人沮丧…...

企业微信打卡数据同步到MySQL避坑指南:如何处理海量数据与状态判断逻辑?

企业微信打卡数据同步到MySQL的工程化实践&#xff1a;海量数据处理与状态判断架构设计 当企业员工规模从几百人扩展到数千人时&#xff0c;考勤系统面临的第一个挑战往往来自数据量的指数级增长。某互联网公司的技术团队曾遇到这样的场景&#xff1a;每天早高峰时段&#xff0…...

60 秒应急窗口下 AI 钓鱼攻击防御体系构建与工程实践

摘要 2026 年网络钓鱼攻击呈现秒级入侵、全域渗透、AI 驱动的显著特征&#xff0c;钓鱼邮件抵达至用户输入敏感信息的中位时间仅 60 秒&#xff0c;勒索软件攻击频率约每 2 秒一起&#xff0c;AI 自动化鱼叉式钓鱼点击率高达 54%&#xff0c;传统防御机制已无法适配当前威胁节奏…...

003、LVGL与其他GUI库对比

LVGL与其他GUI库对比:从一次内存泄漏调试说起 去年做一款智能家居中控屏,选了某款轻量级GUI库,跑了两周发现系统每隔几小时就卡死一次。用FreeRTOS的任务栈监控一看,某个绘图任务栈溢出——查了三天,发现是字体缓存没释放,每次切换界面都偷偷吃掉几百字节。后来换成LVGL…...

HsMod终极指南:55项功能全面优化炉石传说游戏体验的完整方案

HsMod终极指南&#xff1a;55项功能全面优化炉石传说游戏体验的完整方案 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是一款基于BepInEx框架开发的炉石传说模改插件&#xff0c;为…...

BGA虚焊别头疼!从焊膏印刷到回流焊曲线,一份保姆级的SMT工艺避坑指南

BGA虚焊别头疼&#xff01;从焊膏印刷到回流焊曲线&#xff0c;一份保姆级的SMT工艺避坑指南 在SMT产线上&#xff0c;BGA虚焊问题就像个幽灵&#xff0c;时不时冒出来折腾工程师。上周产线刚报修一批主板&#xff0c;X光下那些不规则焊点像极了抽象派画作——可惜客户要的是工…...

保姆级教程:用EEGLAB搞定脑电数据预处理,从导入到ICA去伪迹全流程避坑

零基础EEGLAB脑电预处理全流程&#xff1a;从数据导入到ICA去伪迹实战指南 当你第一次打开EEGLAB界面&#xff0c;面对密密麻麻的菜单选项和看似复杂的参数设置&#xff0c;是否感到无从下手&#xff1f;作为脑电研究的第一步&#xff0c;数据预处理的质量直接决定后续分析的可…...

大模型长文档理解新拐点已至(2026年Claude专项能力解密):支持128K上下文+动态摘要锚点+引用溯源追踪

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;大模型长文档理解新拐点已至&#xff1a;Claude 2026能力演进全景图 随着长上下文窗口突破200万token、原生支持跨页语义锚定与结构化元数据感知&#xff0c;Claude 2026标志着大模型对长文档的理解正式…...

Topit:突破macOS窗口层级限制,打造极致高效的多任务工作流

Topit&#xff1a;突破macOS窗口层级限制&#xff0c;打造极致高效的多任务工作流 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 想象一下这样的场景&#xff…...