浅谈后置处理器之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响应数据,进而构建更加动态和强大的性能测试脚本。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从数据仓库到数据湖(上):数据湖导论

文章目录 一、什么是数据湖?起源数据湖的特征 二、为什么要用数据湖?三、数据湖与数据仓库的区别数据仓库和数据湖的对比 四、数据湖本质数据存储架构数据处理工具:三类第一类工具第二类工具第三类工具 小结 五、总结六、参考资料 一、什么是…

Spring Boot中@Async注解的使用及原理 + 常见问题及解决方案

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

手机怎么用代理ip上网

在数字化时代,网络已经成为我们生活中不可或缺的一部分。然而,有时候出于安全、隐私或访问特定网络资源的需要,我们可能需要使用代理IP来上网。那么,什么是代理IP?如何在手机上设置并使用它呢?本文将为您详…

南通网站制作基本步骤有哪些

南通网站制作是一个非常重要的工作,它可以帮助企业展示产品、服务和品牌形象,吸引更多的客户和创造更多的商机。网站制作的基本步骤包括需求分析、规划设计、页面制作、网站测试和上线等。 首先是需求分析。在南通网站制作的初期阶段,需要和客…

SpringCloud Alibaba Sentinel网关流量控制实践总结

官网地址:https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html GitHub地址:GitHub Sentinel 网关限流 【1】概述 Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 Sentinel 1.6.0 引入了 Sentinel API …

QFileDialog的简单了解

ps:写了点垃圾(哈哈哈) 现在感觉Qt库应该是调用了Windows提供的这块的接口了。 它继承自QDialog 这是Windows自己的文件夹 这是两者的对比图: 通过看QFileDialog的源码,来分析它是怎么实现这样的效果的。 源码组成…

探索Java网络编程精髓:UDP与TCP的实战魔法!

Java 中提供了专门的网络编程程序包 java.net,提供了两种通信协议:UDP(数据报协议)和 TCP(传输控制协议),本文对两种通信协议的开发进行详细介绍。 1 UDP 介绍 UDP:User Datagram Pr…

node-gyp 重新安装,解决编译遇到的问题【超详细图解】

一、报错信息 npm ERR! gyp info it worked if it ends with ok npm ERR! gyp info using node-gyp10.0.1 npm ERR! gyp info using node18.19.0 | darwin | arm64 npm ERR! gyp info find Python using Python version 3.12.2 found at "/opt/homebrew/opt/python3.12/…

3D工艺大师快速生成装配动画,驱动汽车工业装配流程革新

在现代制造业的一般生产流程中,车间装配环节是产品由蓝图迈向市场前至关重要的一道工序。随着产品结构的日益复杂化和个性化需求的不断增长,车间装配工作面临着前所未有的挑战。高精密度的装配要求、错综复杂的组件关系以及频繁变更的生产计划&#xff0…

《代理选择与反爬虫策略探究:如何优化网络爬虫效率与稳定性》

代理IP如何选以及常见反爬策略 为什么需要代理? 因为有的网站会封IP,用户如果没有登录,那IP就是身份标识,如果网站发现用户行为异常就非常可能封IP 什么是代理IP 就是让一个人帮你转交请求,帮你转交的人对面不熟&a…

华为OD机试 - 堆内存申请(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(D卷C卷A卷B卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测…

VMware安装Ubuntu以及利用vscode远程Ubuntu

一、VMware安装Ubuntu (1)VMware安装Ubuntu主要参考此文VMware虚拟机安装Ubuntu22.04图文教程(超详细!!!)。 (2)VMware密钥参考此文24年VMware 17密钥(附下载链接&#…

【经典面试题】是否形成有环链表

1.环形链表oj 2. oj解法 利用快慢指针: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; bool hasCycle(struct ListNode *head) {ListNode* slow head, *fast…

M J更改图像生成方式的参数选项

一个完整的/imagine命令可能包含几个内容,例如图像 URL、图像权重、算法版本和其他开关。 /imagine参数应遵循以下顺序: /imagine prompt: https://example/tulip.jpg a field of tulips in the style of Mary Blair --no farms --iw .5 --ar 3:2 在这种情况下,“开关”是指…

SpringBoot使用Redisson操作Redis及使用场景实战

前言 在SpringBoot使用RedisTemplate、StringRedisTemplate操作Redis中,我们介绍了RedisTemplate以及如何SpringBoot如何通过RedisTemplate、StringRedisTemplate操作Redis。 RedisTemplate的好处就是基于SpringBoot自动装配的原理,使得整合redis时比较…

论文AIGC率需降低?降AI率工具,快速有效

当论文借助AI撰写时,难免会留下AI的痕迹;若未经处理直接提交给导师,很可能会遭到批评。因此,去除AI痕迹成为了关键的一环。幸运的是,笔灵去ai痕迹提供了去AI痕迹的功能,极大地简化了这一过程。用户仅需一键…

如何通过博客获得独立站外链?

通过博客获取独立站外链是一种非常有效的策略,其中GPB外链尤为出色,在多种外链的形式中,博客外链本身就是最好的外链 而想通过博客来获取高质量的独立站外链,创建高质量的内容是关键,无论是谷歌还是用户,对…

mts怎么改成mp4?介绍四个将mts改成MP4的方法

mts怎么改成mp4?当你需要将mts文件转换为MP4格式时,你可以采取一些简单的方法来完成这个任务。mts是一种视频文件格式,通常用于高清摄像机录制的视频,而MP4是一种通用且流行的视频格式,几乎在所有设备和平台上都得到支…

DockerCompose拉取DockerHub镜像,并部署OpenMetaData

参考博主:http://t.csdnimg.cn/i49ET 一、DockerCompose拉取DockerHub镜像 方法一(不太行): 在daemon.json文件中添加一些国内还在服务的镜像站(可能某些镜像会没有) ([ -f /etc/docker/daemon.json ] ||…

数据结构之单链表(赋源码)

数据结构之单链表 线性表 线性表的顺序存储结构,有着较大的缺陷 插入和删除操作需要移动大量元素。会耗费很多时间增容需要申请空间,拷贝数据,释放旧空间。会有不小的消耗即使是使用合理的增容策略,实际上还会浪费许多用不上的…