Jmeter对异步接口进行压测,第一个接口返回后,第二个接口取第一个接口的结果重复请求直到正确响应

本文描述了一个关于接口业务场景的压测过程,涉及while控制器实现重复请求直到结果,事务控制器记录总耗时。遇到的问题在于用户定义变量影响了后续循环,通过修改为BeanShell预处理程序解决了这个问题。最后,文章强调了输出报告中使用事务控制器的重要性以获取准确的业务流程统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我是小白,我很菜

这次压测的接口有个业务:获取局部区域的用户详单,先调用创建任务接口创建任务返回任务ID,后台创建任务后开始计算,再调用获取详情接口发送任务ID请求,若任务未有结果则返回计算中,任务完成计算后,返回详单数据

这种业务场景使用while控制器事务控制器

while控制器用于实现获取到结果就跳出循环的重复请求

事务控制器用来统计任务创建开始到获取到结果为止的总体时间(后台真正的计算时间)

1、实现第一个接口调用,这个很简单,添加Json提取器,提取每次接口返回的taskId

2、实现第二个接口的调用,主要是获取1的taskId并实现循环请求

(1)获取上个接口的任务ID,上一步json提取器已经实现了taskId的参数化,下面${taskId}就能拿到

(2)实现第二个接口的重复请求就要while控制器了,并设置终止条件,将第二个接口放在while控制器下,提取接口的code的值


这里判断条件为第二个接口的code==0退出,code != 0执行while里的循环

 添加用户定义的变量(此处大错特错,后面说

(3)到这里执行测试计划,设置3个线程,循环1次,(创建3个任务,获取3次详情)成功!

再改变循环为2次,理论应该有6次sample(创建6个任务,获取6次详情),结果每次线程组只有第一次执行了while,后面的循环没有执行,只创建了任务没有获取详情(创建了6个任务,获取了3次详情???)

查阅发现,第二个接口的json提取器获取到第一个返回值后(code==0),就一直被UDV保存了code=0,变量影响了后面的循环,因为变量的作用域是线程组,所以无论该线程无论循环多少次都不会执行while了

笔记:

如果用户参数、预处理器或正则表达式提取器定义了与 UDV 变量之一同名的变量,则 JMeter 将替换 UDV 下定义的初始值,线程中的所有其他测试元素将看到更新后的值。

如果有多个线程组,建议为不同的值使用不同的名称,因为 UDV 在线程组之间共享。

如果有多个线程组,则可以在测试计划下定义引用变量并使其全局化。因为变量在元素被处理一次之后才可用。

去掉用户定义的变量,改为BeanShell 预处理程序,给个默认值code为1,放在while控制器之前

跑起来了,每个线程的每一次循环都会执行while了

3、实现输出报告的统计

每次重复请求时,设置一个固定定时器,因为我的接口每次去查询都会将日志写入数据库,为了防止太过频繁导致数据库那边先瓶颈了,需要等待一下

程序从创建任务后到获取任务结果才是真正的计算时间,输出报告时每个接口都有自己的统计数据,不能表现业务流程的统计,那就用到事务控制器了,把接口一、二都添加到事务控制器里,勾选上这两个,非GUI执行就能输出体面的测试报告啦!!

### 实现多接口关联的方法 #### 准备工作 为了在 JMeter 中实现多个接口之间的关联并进行试,首先要确保 Java 开发环境已经正确配置[^2]。由于 JMeter 是基于 Java 的应用程序,在执行任何操作之前,安装 JDK 并设置 JAVA_HOME 环境变量是必要的。 #### 创建线程组 启动 JMeter 后,通过添加新的线程组来定义虚拟用户的数量以及这些用户的行为模式。这一步骤决定了并发访问的数量和频率。 #### 添加HTTP请求采样器 对于每一个需要调用的服务端点,都需要创建对应的 HTTP 请求采样器。如果存在依赖关系,则按照实际业务流程顺序依次排列各个 API 调用。 #### 使用JSON Extractor 提数据 当第一个API响应返回的数据被后续请求所需时,比如获到登录后的 `token` 或者其他形式的身份验证凭证,那么可以在前一个请求后面加入 **JSON Extractor** 来解析 JSON 格式的响应体,并从中抽特定字段作为变量存储下来以便于后面的使用。例如,可以通过路径表达式 `$..data.token` 获嵌套结构中的 token 值[^4]。 ```json { "status": true, "message": "", "data": { "token": "example_token_value" } } ``` #### 设置参数化与传递上下文信息 利用上述提出来的变量,在下一个 HTTP 请求中将其设为动态参数的一部分。这样就能模拟真实的会话过程,保持不同请求间的连续性和一致性。具体来说就是在 URL 参数、POST Body 或 Headers 中引用该变量 `${TOKEN}` 形式。 #### 断言机制保障准确性 在整个链路中适当位置插入断言组件(如 Response Assertion),用于校验预期的结果是否符合实际情况,从而提高试的有效性。 #### 运行试计划 完成以上配置后保存整个 Test Plan 文件(.jmx),最后点击“Start”按钮开始执行完整的场景描述下的负载试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值