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

news2024/9/23 1:33:53

浅谈后置处理器之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.coloradmin.cn/o/1921398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能行业应用-垃圾识别一

垃圾识别应用主要体现在AI图像垃圾识别技术上,这是一种基于人工智能和计算机视觉技术的图像处理技术,广泛应用于各个领域以提高垃圾处理的效率和准确性。 1、垃圾识别效果图 2 垃圾识别任务分析 综合利用Python语言、Qt开发模块,OpenCV开发模…

python使用tkinter加载rtsp视频流

简介 最近有个需求,需要开发个桌面应用工具,可是实时显示rstp视频,于是想到了用python自带的tkinter 来开发,最后打包成exe应用。 import cv2 import random import threading from tkinter import * from PIL import Image, Ima…

group 与查询字段

需求 每周周一,统计菜单在过去一周,点击次数,和点击人数(同一个人访问多次按一次计算) 表及数据 日志表 CREATE TABLE t_data_log ( id varchar(50) NOT NULL COMMENT 主键id, operation_object varchar(500) DE…

麦克风领夹式的哪个牌子最好,一文告诉你无线领夹麦克风哪款好

​在选择无线麦克风时,多样化的市场需求和不断进步的技术,使得从专业级到入门级的各类产品应运而生,满足不同场景和预算的需求。为了让消费者在众多选择中找到适合自己的无线麦克风,我们基于市场销量和用户口碑,整理出…

Java中的Set系列集合超详解

Set List是有序集合的根接口,Set是无序集合的根接口,无序也就意味着元素不重复。更严格地说,Set集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素。   使用Set存储的特点与List相反:元素…

界面组件Kendo UI for React 2024 Q2亮点 - 生成式AI集成、设计系统增强

随着最新的2024年第二季度发布,Kendo UI for React为应用程序开发设定了标准,包括生成式AI集成、增强的设计系统功能和可访问的数据可视化。新的2024年第二季度版本为应用程序界面提供了人工智能(AI)提示,从设计到代码的生产力增强、可访问性…

219.贪心算法:柠檬水找零(力扣)

代码解决 class Solution { public:bool lemonadeChange(vector<int>& bills) {int num50, num100; // 初始化5美元和10美元的计数器for(int i0; i < bills.size(); i) // 遍历所有账单{if(bills[i]5) // 如果账单是5美元{num5; // 增加5美元的计数continue; // …

永磁同步电机谐波抑制算法(7)——基于自适应陷波(adaptive notch filter,ANF)的精确谐波电流抑制策略

1.前言 1.1经典谐波抑制策略存在的问题 在之前的谐波抑制专题中&#xff0c;主要介绍了两种谐波抑制策略——基于多同步旋转坐标系的谐波抑制策略以及基于比例积分谐振PIR调节器的谐波抑制策略&#xff0c;同时还介绍了这两种策略的改进办法&#xff0c;进而使得这两种策略在…

视频号矩阵系统源码,实现AI自动生成文案和自动回复私信评论,支持多个短视频平台

在当今短视频蓬勃发展的时代&#xff0c;视频号矩阵系统源码成为了自媒体人争相探索的宝藏。这一强大的技术工具不仅能帮助我们高效管理多个短视频平台&#xff0c;更能通过AI智能生成文案和自动回复私信评论&#xff0c;为自媒体运营带来前所未有的便利与效率。 一、视频号矩…

【算法】接雨水

难度&#xff1a;困难 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例&#xff1a; 示例1 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是…

开放式耳机哪款好一点?开放式耳机科普五款推荐!

“选择开放式耳机真的太难了” “哥&#xff0c;怎么才能选到心仪的开放式耳机啊” 这种评论总是会出现后台或者现实的朋友也会问起来&#xff0c;所以作为耳机测评的博主&#xff0c;在这里给大家科普一下到底一款好用的开放式耳机到底怎么选&#xff0c;这篇文章我花了三天…

【RHCE】基于密钥身份认证

1.在本主机点击【⼯具】按钮打开【⽤⼾密钥管理者】选项 在该⻚⾯单击【⽣成】按钮来创建密钥对 在向导⻚⾯&#xff0c;选择【密钥类型】和【密钥⻓度】&#xff0c;这⾥保持默认。单击【下⼀步】按钮。 跳转到以下⻚⾯&#xff0c;表⽰密钥对已经创建完成。单击【下⼀步】给…

Nessus相关

tenable 1 安装nessus scanner 1 )安装nessus scanner: 方法一 curl -H X-Key: xxxxx https://cloud.tenable.com/install/scanner?namescanner-name&groupsscanner-group | bash方法二&#xff1a; **# for ubuntu, its https://www.tenable.com/downloads/api/v1/pu…

面试篇-Java-3+类加载+JVM 内存划分

文章目录 前言一、你知道类的加载过程吗1.1 你都知道哪些类型的类加载器1.2 你知道双亲委派机制吗1.3 你来说类加载都有哪些步骤1.3.1 加载&#xff1a;1.3.2 连接&#xff1a;1.3.1.2 验证1.3.1.3 准备1.3.1.4 解析 1.3.3 初始化 二、你知道JVM 中内存的分配吗2.1 你知道类加载…

通用图形处理器设计GPGPU基础与架构(二)

一、前言 本系列旨在介绍通用图形处理器设计GPGPU的基础与架构&#xff0c;因此在介绍GPGPU具体架构之前&#xff0c;需要了解GPGPU的编程模型&#xff0c;了解软件层面是怎么做到并行的&#xff0c;硬件层面又要怎么配合软件&#xff0c;乃至定出合适的架构来实现软硬件协同。…

如何修复d3dx9_43.dll文件丢失问题,实测有效的几种方法分享

在日常工作生活中&#xff0c;计算机可能会出现提示“d3dx9_43.dll文件丢失”的情况&#xff0c;面对这种情况&#xff0c;您该如何应对呢&#xff1f;这种情况在计算机使用过程中是比较常见的&#xff0c;对于经常使用计算机的人来说&#xff0c;难免会遇到这种情况。今天&…

Milvus 核心设计(1) ---- 数据一致性的等级及使用场景

目录 背景 Milvus的数据一致性 设置数据一致性等级 等级类型 PACELC定理 level 详细解释 Strong Bounded staleness Session Eventually 总结 背景 分布式上的可扩展性是个比较重要的concept。Chroma 核心之前写过了,他的最大优势在于轻量级且好用。Milvus相对Ch…

PHP企业工商年报大师微信小程序系统源码

&#x1f31f;轻松搞定年报难题&#xff01;&#x1f4bc; &#x1f680;【一键直达&#xff0c;年报不再繁琐】 还在为每年的企业工商年报而头疼吗&#xff1f;繁琐的表格、复杂的流程&#xff0c;让人望而却步&#xff1f;现在有了“企业工商年报大师”微信小程序&#xff…

彻底解决找不到msvcr120.dll,无法继续执行代码的问题(最新方法)

在使用电脑过程中经常会遇到各种问题&#xff0c;其中msvcr120.dll丢失或找不到msvcr120.dll问题就是常见之一&#xff0c;那么遇到msvcr120.dll丢失要怎么解决&#xff1f;msvcr120.dll又是什么为什么会丢失&#xff1f;今天给大家介绍一下msvcr120.dll文件跟msvcr120.dll丢失…

189. 轮转数组 --- 多种方式解题

直接开新数组&#xff0c;暴力遍历&#xff0c;新位置(原位置k)%nums.length class Solution {public void rotate(int[] nums, int k) {int[] ans new int[nums.length];for (int i 0; i < nums.length; i) {int pos (i k) % nums.length;ans[pos] nums[i];}for (int…