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

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

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

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

这种要怎么做呢?

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

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

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

这样的,好做吗?

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

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

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

图片

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

图片

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

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

图片

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

图片

图片

图片

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

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

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

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

图片

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

图片

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

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

图片

图片

图片

图片

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

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

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

在这里插入图片描述

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

### 提取接口响应中的动态字段 在 JMeter 中提取接口响应中的动态字段,通常可以通过正则表达式提取器或 BeanShell/JSR223 脚本来实现。正则表达式提取器适用于结构较为简单的响应内容,而 BeanShell 或 JSR223 更适合处理复杂的结构化数据(如 JSON 或 XML)。 例如,若接口返回的是 JSON 格式的数据,可以通过正则表达式提取其中的字段,也可以使用 JSON 解析库(如 `org.json.JSONObject` 或 `fastjson`)进行更精确的解析。提取出的可以存储为 JMeter 变量,供后续请求使用[^2]。 以下是一个使用 BeanShell 提取 JSON 响应字段的示例: ```java import org.json.JSONObject; // 获取响应数据 String response = prev.getResponseDataAsString(); // 解析 JSON JSONObject jsonResponse = new JSONObject(response); String userId = jsonResponse.getString("user_id"); // 存储为 JMeter 变量 vars.put("userId", userId); ``` ### 处理接口响应中的动态 在处理接口响应中的动态时,可以将提取的作为变量传递给后续请求。例如,从登录接口返回的 JSON 中提取 `user_id`,并在后续请求中作为参数使用。这种方式适用于需要动态传递参数的测试场景,如会话管理、令牌传递等[^2]。 此外,JMeter 提供了“正则表达式提取器”组件,可以在响应数据中通过正则表达式匹配动态。例如,若响应中包含如下内容: ``` Welcome, JohnDoe (ID: 12345) ``` 可以使用正则表达式 `ID: (\d+)` 提取 `12345`,并将其存储为变量 `userId`,供后续请求使用。正则表达式提取器支持种匹配模式,并可以设置缺省,以应对未匹配到的情况[^3]。 ### 使用 JSR223 脚本替代 BeanShell 为了提高性能和兼容性,推荐使用 JSR223 元素(如 JSR223 PreProcessor 或 JSR223 PostProcessor)来替代 BeanShell。JSR223 支持种脚本语言(如 Groovy、JavaScript),其中 Groovy 是首选语言,因其性能优于 BeanShell。 以下是一个使用 Groovy 提取 JSON 响应字段的示例: ```groovy import groovy.json.JsonSlurper // 获取响应数据 def response = prev.getResponseDataAsString() // 解析 JSON def json = new JsonSlurper().parseText(response) def userId = json.user_id // 存储为 JMeter 变量 vars.put("userId", userId) ``` ### 使用 fastjson 处理 JSON 数据 对于更复杂的 JSON 数据处理,可以使用阿里巴巴的 `fastjson` 库来实现。它能够高效地解析和生成 JSON 数据,适用于 Java 和 Android 开发环境。通过 `fastjson`,可以实现从响应中提取 JSON 键,并动态生成新的 JSON 数据,适用于复杂的接口测试场景[^4]。 ### 示例:处理动态数组并传递给其他接口 在某些测试场景中,需要从数据库中获取一组动态数据(如关键字列表),并将其逐个传递给其他接口进行处理。例如,从数据库获取一个关键字数组,再将其逐个传递给百度搜索接口,并验证搜索结果是否符合预期。这种情况下,可以通过 JMeter 的 BeanShell 或 JSR223 脚本读取数组内容,并循环调用接口进行测试[^5]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值