浅谈后置处理器之JSON提取器

浅谈后置处理器之JSON提取器

JMeter 的 JSON 提取器(JSON Extractor)是一个强大的后置处理器,它允许用户从HTTP响应、数据库查询或其他类型的响应中提取JSON数据,并将这些数据存储为变量,以便在后续的请求中重用。这对于需要动态处理基于JSON格式API测试的场景尤为有用。以下是对JSON提取器的详细说明和使用教程。

使用场景

● 参数化请求:从一个API响应中提取token或其他标识符,用于后续请求的认证或数据关联。
● 数据驱动测试:提取JSON数组中的多个值,用于遍历测试不同的数据集。
● 验证响应内容:检查特定的JSON字段是否存在或其值是否符合预期。

配置步骤

添加JSON提取器

  1. 在你的JMeter测试计划中,选择一个采样器(如HTTP请求)。
  2. 右键点击该采样器,选择“添加” > “后置处理器” > “JSON 提取器”。

配置参数

JSON 提取器提供了多个配置选项,以下是关键参数的解释:
● 名称: 给这个后置处理器一个描述性的名称,便于识别。
● Names of created variables:变量名称
● JSON Path expressions: 输入JSON路径表达式,用于定位你想要提取的数据。例如$.username会提取根对象下的username字段。
● Match No. (0 for Random):
○ 0: 随机选择一个匹配项。
○ n: 提取第n个匹配项(n为正整数)。
○ -1: 提取所有匹配项,并以变量数组形式存储。
● Compute concatenation var(suffix_ALL):匹配到的所有数值并保存,默认为空即可
● Default Values: 如果没有找到匹配的JSON路径,可以设置一个默认值。
变量命名与引用
● 变量名: 为提取的数据指定一个变量名。如果Match No.设置为-1,则应使用数组形式的变量名,如users_,这样每个匹配项将会被命名为users_1、users_2等。

示例

假设你有一个API响应如下:

{"status": "success","data": {"userId": 12345,"username": "exampleUser"}
}

要提取username值,你可以配置JSON Extractor如下:
● JSON Path expressions: $.data.username
● Names of created variables: userNameVar
● Match No.: 1
之后,在JMeter中任何地方可以通过${userNameVar}引用提取到的用户名。

应用实例

首先我们使用SpingBoot编写部分测试接口代码

@PostMapping(value = "/login",produces = "application/json;charset=UTF-8")public String authenticate(@RequestBody JSONObject request) {String validUsername = "admin";String validPassword = "password";String response = "{\"total\":2,\"data\":[{\"id\":123,\"name\":\"John Doe\",\"email\":\"johndoe@example.com\",\"phone\":\"123-456-7890\",\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\",\"state\":\"NY\",\"zip\":\"10001\"},\"interests\":[\"sports\",\"music\",\"travel\"]},{\"id\":456,\"name\":\"Jane Smith\",\"email\":\"janesmith@example.com\",\"phone\":\"987-654-3210\",\"address\":{\"street\":\"456 Elm St\",\"city\":\"Los Angeles\",\"state\":\"CA\",\"zip\":\"90001\"},\"interests\":[\"reading\",\"cooking\",\"hiking\"]}]}";if (request.getString("username").equals(validUsername) && request.getString("password").equals(validPassword)) {return response;} else {return response;}}

我们编写如下测试脚本
在这里插入图片描述线现程组:保持默认
HTTP信息头管理器:名称content-type,值为application/json;charset=UTF-8
HTTP请求:协议http,服务器名称或IP为127.0.0.1,端口设置为8091,方法为post,路径/login,内容编码为utf-8,消息体数据设置如下

{"username": "admin","password": "password"}

运行脚本,查看结果树,在HTTP请求的响应数据中Response Body查看结果如下(已经美化JSON格式):

{"total": 2,"data": [{"address": {"zip": "10001","city": "New York","street": "123 Main St","state": "NY"},"phone": "123-456-7890","name": "John Doe","id": 123,"interests": ["sports","music","travel"],"email": "johndoe@example.com"},{"address": {"zip": "90001","city": "Los Angeles","street": "456 Elm St","state": "CA"},"phone": "987-654-3210","name": "Jane Smith","id": 456,"interests": ["reading","cooking","hiking"],"email": "janesmith@example.com"}]
}

情况1:返回值中提取total数据

JSON提取器中Names of created variables设置为var,JSON Path expressions设置为total或者$.total,两种效果一致,Match No. (0 for Random)设置为-1,Default Values设置为NotFound。
运行脚本,查看结果树中响应数据的Response Body

var_1=2
var_matchNr=1

情况2:返回值中提取address数据

JSON提取器中Names of created variables设置为var,JSON Path expressions设置为data[*].address或者$.data[*].address,两种效果一致,Match No. (0 for Random)设置为-1,Default Values设置为NotFound。
运行脚本,查看结果树中响应数据的Response Body

var_1={“zip”:“10001”,“state”:“NY”,“city”:“New York”,“street”:“123 Main St”}
var_2={“zip”:“90001”,“state”:“CA”,“city”:“Los Angeles”,“street”:“456 Elm St”}
var_matchNr=2

情况3:返回值中提取address数只需要上述情况2中var_1的数据

JSON提取器中Names of created variables设置为var,JSON Path expressions设置为data[0].address或者$.data[0].address,两种效果一致,Match No. (0 for Random)设置为-1,Default Values设置为NotFound。
运行脚本,查看结果树中响应数据的Response Body

var_1={“zip”:“10001”,“state”:“NY”,“city”:“New York”,“street”:“123 Main St”}
var_matchNr=1

情况4:返回值中提取interests的数据

JSON提取器中Names of created variables设置为var,JSON Path expressions设置为data[*].interests[*]或者$.data[*].interests[*],两种效果一致,Match No. (0 for Random)设置为-1,Default Values设置为NotFound。
运行脚本,查看结果树中响应数据的Response Body

var_1=sports
var_2=music
var_3=travel
var_4=reading
var_5=cooking
var_6=hiking
var_matchNr=6

情况5:返回值中提取interests的数据第一行的数据,即Sports和Reading

JSON提取器中Names of created variables设置为var,JSON Path expressions设置为data[*].interests[0]或者$.data[*].interests[0],两种效果一致,Match No. (0 for Random)设置为-1,Default Values设置为NotFound。
运行脚本,查看结果树中响应数据的Response Body

var_1=sports
var_2=reading
var_matchNr=2

情况6:勾选Compute concatenation var(suffix_ALL)

初勾选Compute concatenation var(suffix_ALL),其他设置跟情况5一直。
运行脚本,查看结果树中响应数据的Response Body

var_1=sports
var_2=reading
var_ALL=sports,reading
var_matchNr=2

注意事项

● 确保JSON路径表达式正确无误。
● 当提取多个值时,合理设置Match No.和变量名格式,避免数据混乱。
● 对于复杂的JSON结构,深入理解JSONPath语法将大大提高提取效率。
通过以上步骤和注意事项,你应该能够有效地使用JMeter的JSON提取器来处理和利用JSON响应数据,进而构建更加动态和强大的性能测试脚本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/377222.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW人工模拟肺控制系统开发

开发了一种创新的主被动一体式人工模拟肺模型,通过LabVIEW开发的上位机软件,实现了步进电机驱动系统的精确控制和多种呼吸模式的模拟。该系统不仅能够在主动呼吸模式下精确模拟快速呼吸、平静呼吸和深度呼吸,还能在被动模式下通过PID控制实现…

LeetCode加油站(贪心算法/暴力,分析其时间和空间复杂度)

题目描述 一.原本暴力算法 最初的想法是:先比较gas数组和cost数组的大小,找到可以作为起始点的站点(因为如果你起始点的油还不能到达下一个站点,就不能作为起始点)。当找到过后,再去依次顺序跑一圈,如果剩余的油为负数…

【代码随想录】【算法训练营】【第64天】 [卡码117]软件构建 [卡码47]参加科学大会

前言 思路及算法思维,指路 代码随想录。 题目来自 卡码网。 day 64,周三,继续ding~ 题目详情 [卡码117] 软件构建 题目描述 卡码117 软件构建 解题思路 前提: 思路: 重点: 代码实现 C语言 [卡码…

GO channel 学习

引言 单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。 虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁&#…

喰星云·数字化餐饮服务系统 多处 SQL注入漏洞复现

0x01 产品简介 喰星云数字化餐饮服务系统是一款专为餐饮企业设计的综合性管理软件,旨在通过信息化手段提升餐饮企业的运营效率、降低运营成本,并实现数据驱动的决策管理。该系统包括供应链管理、财务管理、巡店管理、人力资源管理等多个模块,可全面覆盖餐饮企业的日常运营需…

[RoarCTF2019]polyre

参考博客 buu-[RoarCTF2019]polyre(控制流平坦化,虚假控制流程)-CSDN博客 [RoarCTF2019]Polyre | bypass ollvm - 暖暖草果 - 博客园 (cnblogs.com) buu-[RoarCTF2019]polyre(控制流平坦化,虚假控制流程&#xff09…

Java 设计模式系列:外观模式

简介 外观模式(Facade Pattern)是一种设计模式,又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部…

VUE_TypeError: Cannot convert a BigInt value to a number at Math.pow 解决方法

错误信息 TypeError: Cannot convert a BigInt value to a number at Math.pow vue 或 react package.json添加 "browserslist": {"production": ["chrome > 67","edge > 79","firefox > 68","opera >…

树的结构(b,b+树)

无论线性表,栈还是队列,都是一对一,查询的时候,效率较低,数据量比较的大的情况 1.树的定义 一种数据结构,有层次关系的集合,根朝上,叶朝下 除了根节点外,每个子节点都…

【自动驾驶汽车通讯协议】UART通信详解:理解串行数据传输的基石

文章目录 0. 前言1. 同步通讯与异步通讯1.1 同步通信1.2 异步通信 2. UART的数据格式3. 工作原理3.1 波特率和比特率3.2 UART的关键特性 4. UART在自动驾驶汽车中的典型应用4.1 UART特性4.2应用示例 5. 结语 0. 前言 按照国际惯例,首先声明:本文只是我自…

【周末闲谈】Stable Diffusion会魔法的绘画师

个人主页:【😊个人主页】 系列专栏:【❤️Python】 文章目录 前言Stable Diffusion介绍 使用ComfyUI 和 WebUIComfyUIWebUI 配置需求 Stable Diffusion资源分享吐司AiAUTOMATIC1111Civitai绘世整合包Nenly同学stability.ai 前言 在很早之前&…

香橙派AIpro部署YOLOv5:探索强悍开发板的高效目标检测能力

香橙派AIpro部署YOLOv5:探索强悍开发板的高效目标检测能力 一、香橙派AIpro开箱使用体验 1.1香橙派AIpro开箱 拿到板子后第一件事情就是开箱: 开箱后可以看见一个橘子的标识,也就是香橙派了,并且还有四个大字:为AI…

取消文字默认选中效果

点击的时候会选中文字 .user-select-none {user-select: none;}<div class"model user-select-none" onclick"createRipple(event)">Click me for ripple effect outside </div>点击再快也不会选中了

【C++】——类和对象(上)

文章目录 什么是类和对象类的定义类的访问限定符及其封装类的作用域类的实例化类的对象的大小计算this指针 什么是类和对象 类是一个用户定义的类型&#xff0c;它封装了数据&#xff08;称为属性或成员变量&#xff09;和操作这些数据的方法&#xff08;称为成员函数或方法&a…

Seven layers of the metaverse

看到一篇关于元宇宙的文章&#xff0c;分享给大家&#xff0c;供大家参考。 随着物理世界和数字世界的融合&#xff0c;元宇宙正在推动我们数字能力的新边界。从人类身份、个性和声誉到资产、情感和历史&#xff0c;元宇宙的虚拟现实中可以以全新的方式进行交互、控制和体验。因…

OpenGL笔记十之Shader类的封装

OpenGL笔记十之Shader类的封装 —— 2024-07-10 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记十之Shader类的封装1.运行2.目录结构3.main.cpp4.application4.1.CMakeLists.txt4.2.Application.h4.3.Application.cpp 5.assets5.1.shaders&#xf…

【吊打面试官系列-ZooKeeper面试题】简述 Zookeeper 文件系统?

大家好&#xff0c;我是锋哥。今天分享关于 【简述 Zookeeper 文件系统?】面试题&#xff0c;希望对大家有帮助&#xff1b; 简述 Zookeeper 文件系统? Zookeeper 提供一个多层级的节点命名空间&#xff08;节点称为 znode&#xff09;。与文件系统不同的是&#xff0c;这些节…

prometheus+grafana应用监控配置

配置Prometheus 官方地址&#xff1a;Download | Prometheus &#xff08;wegt下载压缩包&#xff0c;解压并重命名prometheus&#xff0c;文件放于/data/prometheus即可&#xff09; 配置 service方法(文件放于 /etc/systemd/system/prometheus.service)&#xff1a; [Unit…

博物馆地图导航系统:高精度地图引擎与AR/VR融合,实现博物馆数字化转型

在人民日益追求精神文化的时代下&#xff0c;博物馆作为传承与展示人类文明的璀璨殿堂&#xff0c;其重要性不言而喻。然而&#xff0c;随着博物馆规模的不断扩大和藏品种类的日益丰富&#xff0c;游客在享受知识盛宴的同时&#xff0c;也面临着“迷路”与“错过”的困扰。博物…

【CUDA】CUDA中缓存机制对计时的影响

笔者在阅读知乎上一个关于CUDA编程的专栏时&#xff0c;发现作者写的很多文章中都会附带计时的模块用于评估程序的运行效率&#xff0c;然而笔者发现&#xff0c;在运行这篇文章中的代码时时&#xff0c;得到的结果和作者的结果有较大差异&#xff0c;主要体现在&#xff1a;使…