jmeter 如何循环使用接口返回的多值?

文章介绍了如何使用JMeter进行接口测试,特别是当接口返回多个值时,如何通过后置处理器提取数据,并利用循环控制器进行动态参数化。在第一种场景中,详细讲解了如何提取所有用户信息并进行循环登录测试。在第二种场景中,提到了如何随机选取部分用户进行测试,利用intSum函数动态计算循环次数。文章以实际操作步骤指导读者掌握这两种技巧。

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

有同学在用jmeter做接口测试的时候,经常会遇到这样一种情况:

就是一个接口请求返回了多个值,然后下一个接口想循环使用前一个接口的返回值。

这种要怎么做呢?

有一定基础的人,可能第一反应就是先提取前一个接口返回的所有值,然后再用一个循环控制器,循环使用值就可以了啊。

对,非常棒,思路清晰,完全正确,但是做起来真的就这么简单吗?

好,现在加大一点难度:我只想循环请求前一个接口返回值中的随机不定长度的某一些值(并不想用全部的)。

这样的,好做吗?

今天,我就和大家讲讲,这两种,我们如何实现。

第一种,如:有一个获取用户列表的接口,返回了所有的用户信息,接下来,我就想把所有用户都登录一遍。这种常见于企业中有一个获取商品列表的接口,就想验证下所有的商品详情信息是否都正常,是否存在无效商品。我们怎么做呢?

首先,在我们的获取用户信息列表接口,看下接口返回信息的类型和用户手机号码字段名称,如果返回类型时json的,我们就在下面增加一个后置处理器——json提取器或正则提取器,提取所有用户的手机号码信息。

图片

然后,我们再添加一个逻辑控制 > 循环控制器。因为获取的用户手机号码总数可能一直在变,不是一个固定值,所以,循环次数不能使用固定值。哪这个循环控制循环次数怎么配置呢?我们要使用上一步,json提取中变量名称加_matchNr这样的新变量。

图片

然后,在循环控制器下面挂上下一个接口。那此时又有个新问题了,有了循环次数,接口每次调用的时候,接口参数中手机号码如何自动更新值呢? 这个问题,有经验的同学,可能会第一反应说,加个计时器。

对,是个好办法。但是,我呢,比较懒,不想去再添加一个计时器配置元件,我就加个计时器函数。

图片

ok,万事俱备,只欠东风。run一下看下。

图片

图片

图片

看到了吗?总共有1000个手机号码,最后,汇总报告中,显示的总取样次数也是1000,说明我们的循环写法没有问题。

第二种,我们想随机抽取所有用户中的随意长度用户,常见于企业中商品数量比较多,随机抽检任意多个商品,验证商品详情是否正常。

这样的,我们该如何做呢?

第一步,依然是在获取用户列表接口下面添加后置处理器——json提取器或正则提取器。只是,这次我们的提取写法不一样了。

图片

第二步,依然是添加循环控制器,只是,又有一个新问题了,因为都是随机数,起始和终止值之间的差距不确定,循环次数也就不确定,哪这个循环次数如何设置呢? 这里我们引入一个intSum求和函数

图片

第三步,同第一种方法的第三步完全一样(有同学可能会问,为什么会完全一样呢?留个大家自学研究,动手验证)。

最后,我们也来run一下,看看我们的结果。

图片

图片

图片

图片

是不是‘碗豆腐’,完美!

好了,这样一个技巧,你是否已经get到了呢?

最后: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取 【保证100%免费】

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
在这里插入图片描述

<think>好的,我现在需要帮助用户解决在JMeter中设置循环查询接口并在满足条件时停止的问题。用户的具体需求是循环调用一个接口,直到返回值符合预期时停止。我需要结合用户提供的引用内容,尤其是关于While控制器和循环控制器的部分,来给出解决方案。 首先,我应该回顾一下用户提供的引用内容。引用[2]提到在While控制器中通过data的进入循环内部,请求内部的查询状态接口。这说明While控制器可以根据某个条件来循环执行内部的请求。引用[4]提到Loop Controller可以设置循环次数,但它是固定次数的循环,而用户需要的是条件满足时停止,所以可能需要结合While控制器。 然后,用户的问题是关于如何设置循环直到返回值满足条件。JMeter中常用的方法是使用While控制器,因为While控制器可以根据条件表达式的结果来决定是否继续循环。我需要确认如何正确配置While控制器,以及如何从接口响应中提取数据作为条件判断的依据。 接下来,步骤可能包括以下几个部分: 1. 添加While控制器,并在其下放置HTTP请求来查询状态。 2. 使用后置处理器(如JSON Extractor或正则表达式提取器)提取接口返回。 3. 设置循环的退出条件,可能需要在While控制器的条件中使用变量和函数。 4. 可能需要使用BeanShell Sampler或JSR223 Sampler来处理复杂的逻辑判断,或者在条件中直接使用JMeter函数。 根据引用[3],提到Recycle on EOF和Stop thread on EOF的互斥关系,但这里可能不直接相关,因为用户的问题是关于条件判断而非CSV文件读取。不过,这说明JMeter中有处理循环和停止线程的选项,需要注意配置。 外,用户提供的引用[1]中提到If循环控制器,但用户的问题可能更适合使用While控制器。需要比较两者的适用场景,While控制器更适合不确定循环次数的情况,而Loop Controller适合固定次数。因此,While控制器更符合用户需求。 可能的实现步骤: - 在测试计划中添加线程组。 - 添加While控制器到线程组下。 - 在While控制器内添加HTTP请求,用于查询状态。 - 使用后置处理器提取响应中的状态到变量。 - 配置While控制器的条件表达式,当变量不符合预期时继续循环,符合时退出。 需要注意,While控制器的条件如果留空或设置为"last",会检查最后一个Sampler的响应是否成功。但这里需要根据返回值内容判断,所以条件应该是一个表达式,例如${__jexl3("${status}" != "success")},这样当status变量不等于"success"时继续循环。 同时,需要确保在循环内部正确提取变量,并在条件中使用该变量。如果接口返回的是JSON,可以使用JSON Extractor;如果是其他格式,可以用正则表达式提取器。 还要考虑循环超时的情况,避免无限循环。可以添加一个计数器或使用超时机制来限制循环次数,防止测试计划长时间运行。 总结一下,解决方案的核心是使用While控制器结合变量提取和条件判断,在满足条件时退出循环。需要详细说明每个步骤的配置方法,并引用相关的引用内容来支持。</think>在JMeter中实现循环调用接口并满足条件后停止,可通过以下步骤实现: --- ### 一、基础配置步骤 1. **添加线程组** 右键测试计划 -> 添加 -> 线程(用户) -> 线程组,设置线程数和循环次数(若需线程并发)[^4]。 2. **添加While控制器** 右键线程组 -> 添加 -> 逻辑控制器 -> While控制器,用于控制循环条件[^2]。 3. **配置循环退出条件** - 在While控制器的`Condition`中输入逻辑表达式,例如: `$${__jexl3("${response_status}" != "success" && ${counter} < 10)}$$` 表示当`response_status`非"success"且循环次数未超过10次时继续循环[^1]。 --- ### 二、关键组件详解 1. **接口请求与响应提取** - 在While控制器内添加HTTP请求,调用目标接口。 - 使用**JSON Extractor**或**正则表达式提取器**提取返回值到变量(如`response_status`)。 2. **循环终止控制** - 添加**计数器**(Counter): 右键While控制器 -> 添加 -> 配置元件 -> 计数器,将`Reference Name`设为`counter`,用于统计循环次数。 - 在While条件中通过`${counter}`控制最大循环次数,避免死循环[^3]。 3. **条件判断优化** - 若需复杂逻辑(如条件组合),可使用**JSR223 Sampler**编写Groovy脚本动态修改变量。 - 示例脚本: ```groovy vars.put("response_status", prev.getResponseDataAsString().contains("success") ? "success" : "fail"); ``` --- ### 三、完整流程示例 ``` 线程组 ├─ While控制器(Condition: ${__jexl3("${status}" != "1")}) │ ├─ HTTP请求(查询接口) │ ├─ JSON Extractor(提取字段到变量`status`) │ └─ 计数器(记录循环次数) └─ 调试Sampler(可选,用于查看变量) ``` --- ### 四、注意事项 1. **超时保护** 务必通过计数器或`__time()`函数限制最大循环时间,例如: `$${__jexl3("${status}" != "1" && (${__time()/1000} - ${start_time}) < 60)}$$` 表示循环超时60秒后强制退出。 2. **变量作用域** While控制器内定义的变量需使用`vars.put()`和`vars.get()`确保全局有效。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值