当前位置: 首页 > news >正文

提高接口自动化测试效率:使用 JMESPath 实现断言和数据提取!

前言

做接口自动化,断言是比不可少的。如何快速巧妙的提取断言数据就成了关键,当然也可以提高用例的编写效率。笔者在工作中接触到了JMESPath,那到底该如何使用呢?带着疑惑一起往下看。

JMESPath是啥?

JMESPath 是一种用于查询和转换 JSON 数据的简洁、强大的查询语言。它提供了一种灵活的方式来从复杂的 JSON 结构中提取所需的数据,并支持各种操作和函数,以满足不同的查询需求。

JMESPath如何使用?

在使用 JMESPath 查询 JSON 数据之前,我们需要安装 jmespath 库。安装命令如下:

pip install jmespath

简单路径表达式

假设我们有以下的 JSON 数据:

data = {"name": "Alice","age": 25,"email": "alice@example.com"
}

我们想要从中提取"name"属性的值。使用 JMESPath,我们可以编写以下代码:

import jmespath
​
expression = "name"
result = jmespath.search(expression, data)
​
print(result)  # 输出:Alice

这里,我们定义了一个路径表达式"name",然后使用jmespath.search()函数将该表达式应用于数据data上。结果会被存储在result变量中,并输出为"Alice"

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

嵌套属性访问

当 JSON 数据具有嵌套结构时,可以使用点号 . 连接多个属性名来表示深层的属性访问。考虑以下 JSON 数据:

data = {"person": {"name": "Alice","age": 25,"email": "alice@example.com"}
}

我们要提取"name"属性,可以使用以下路径表达式:

expression = "person.name"
result = jmespath.search(expression, data)
​
print(result)  # 输出:Alice

这里,我们将属性名 "person" 和 "name" 使用点号 . 连接起来,表示深层的属性访问。

复杂嵌套查询

假设我们有一个包含学生信息和他们的课程成绩的更复杂的 JSON 数据,如下所示:

data = {"students": [{"name": "Alice","courses": [{"name": "Math", "score": 95},{"name": "English", "score": 88}]},{"name": "Bob","courses": [{"name": "Math", "score": 75},{"name": "English", "score": 92}]}]
}

现在,假设我们想要获取每个学生的数学成绩。可以通过以下表达式实现:

expression = "students[].courses[?name == 'Math'].score"

再次执行查询并打印结果:

result = jmespath.search(expression, data)
print(result)

输出结果将是一个包含每个学生数学成绩的列表:

[[95], [75]]

列表索引

对于 JSON 中的列表属性,可以使用方括号 [index] 来指定索引位置来检索数据。假设我们有以下 JSON 数据:

data = {"fruits": ["apple", "banana", "cherry"]
}

我们想要提取第二个元素,即"banana"。可以使用以下路径表达式:

expression = "fruits[1]"
result = jmespath.search(expression, data)
​
print(result)  # 输出:banana

这里,我们使用方括号 [1] 来指定索引位置,表示提取第二个元素。

过滤器

JMESPath 提供了过滤器功能,使我们能够根据特定条件筛选出符合要求的数据。过滤器使用方括号 [?],后跟过滤条件。考虑以下 JSON 数据:

data = {"users": [{"name": "Alice", "age": 25},{"name": "Bob", "age": 30},{"name": "Charlie", "age": 28}]
}

我们想要提取年龄大于 25 岁的用户对象。可以使用以下路径表达式进行过滤:

expression = "users[?age > `25`]"
result = jmespath.search(expression, data)
​
print(result)

输出结果为:

[    {"name": "Bob", "age": 30},    {"name": "Charlie", "age": 28}]

这里,我们使用了过滤器 [?age > 25],表示只选择满足条件的用户对象。

合并操作

JMESPath 还支持合并操作符 [],用于将多个查询结果合并成一个列表。假设我们想要获取所有学生的所有课程名称。可以使用合并操作符 [] 来实现:

data = {"students": [{"name": "Alice","courses": [{"name": "Math", "score": 95},{"name": "English", "score": 88}]},{"name": "Bob","courses": [{"name": "Math", "score": 75},{"name": "English", "score": 92}]}]
}

获取所有学生的所有课程名称:

expression = "students[].courses[].name"
result = jmespath.search(expression, data)
print(result)

输出结果为:

['Math', 'English', 'Math', 'English']

排序和切片

JMESPath 还支持对查询结果进行排序和切片操作。假设我们想要按学生年龄进行降序排序。可以使用排序函数 sort() 和逆序函数 reverse() 来实现:

data = {"students": [{"name": "Alice", "age": 20},{"name": "Bob", "age": 22},{"name": "Charlie", "age": 21}]
}

得到按年龄降序排列的学生列表:

expression = "students | sort_by(@, &age) | reverse(@)"
​
result = jmespath.search(expression, data)
print(result) # [{'name': 'Bob', 'age': 22}, {'name': 'Charlie', 'age': 21}, {'name': 'Alice', 'age': 20}]

切片

data = {"fruits": ["apple", "banana", "cherry"]
}

利用切片获取第一个元素

import jmespath
​
data = {"fruits": ["apple", "banana", "cherry"]
}
expression = "fruits[0:1]"
result = jmespath.search(expression, data)
​
print(result) # ['apple']

管道

使用管道符号(|),将当前节点的结果传到管道符右侧继续投影。

data = {"students": [{"name": "Alice", "age": 20},{"name": "Bob", "age": 22},{"name": "Charlie", "age": 21}]
}

获取所有的姓名:

expression = "students[*].name"
result = jmespath.search(expression, data)
print(result) # ['Alice', 'Bob', 'Charlie']

如果在此基础上想要得到Bob这个值。我们尝试使用索引:

expression = "students[*].name[1]"
result = jmespath.search(expression, data)
print(result) # []

发现执行结果是一个空列表,这个时候怎么办呢?使用管道表达式, <expression> | <expression>

expression = "students[*].name | [1]"

内置函数

计算列表长度

data = {"students": [{"name": "Alice", "age": 20},{"name": "Bob", "age": 22},{"name": "Charlie", "age": 21}]
}
​
expression = "length(students)"  # 也可以这样写expression = "students | length(@)"
result = jmespath.search(expression, data)
print(result) # 3

length就是jmespath内置的函数。
当然还有一些其他常用的内置函数,比如:

  • starts_with(str, prefix): 检查字符串是否以指定前缀开头。
  • ends_with(str, suffix): 检查字符串是否以指定后缀结尾。
  • contains(str, substring): 检查字符串是否包含子字符串。
  • length(arr): 返回数组的长度。

最后

jmespath确实很强大,通过逐步学习和实践,可以更好地掌握 JMESPath 的功能和灵活性。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
 

在这里插入图片描述

相关文章:

提高接口自动化测试效率:使用 JMESPath 实现断言和数据提取!

前言 做接口自动化&#xff0c;断言是比不可少的。如何快速巧妙的提取断言数据就成了关键&#xff0c;当然也可以提高用例的编写效率。笔者在工作中接触到了JMESPath&#xff0c;那到底该如何使用呢&#xff1f;带着疑惑一起往下看。 JMESPath是啥&#xff1f; JMESPath 是一…...

【Linux操作系统教程】用户管理与权限管理你真的懂了吗(三)

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…...

华为全联接大会2023 | 尚宇亮:携手启动O3社区发布

2023年9月20日&#xff0c;在华为全联接大会2023上&#xff0c;华为正式发布“联接全球服务工程师&#xff0c;聚合用户服务经验”的知识经验平台&#xff0c;以“Online 在线、Open 开放、Orchestration 协同”为理念&#xff0c;由华为、伙伴和客户携手&#xff0c;共同构建知…...

MySQL数据库查缺补漏——基础篇

MySQL数据库查缺补漏-基础篇 基础篇 net start mysql80[服务名] net stop mysql80 create database pshdhx default charset utf8mb4; 为什么不使用utf8&#xff1f;因为其字符占用三个字节&#xff0c;有四个字节的字符&#xff0c;所有需要设置为utf8mb4; 数值类型&…...

ESP8266 WiFi物联网智能插座—电能计量

目录 1、芯片功能 2、性能指标 3、寄存器说明 4、UART通信协议 4.1、写操作帧格式和时序 4.2、读操作帧格式和时序 4.3、读取全电参数数据包 4.4、配置波特率 4.5、UART保护机制 5、功能说明 5.1、电流电压瞬态波形计量 5.2、有功功率 5.3、有功功率防潜动 5.4、电能计量 5.5、…...

“智慧”北京,人工智能引领“新风尚”

原创 | 文 BFT机器人 北京时间&#xff0c;9月15日&#xff0c;北京人工智能产业峰会暨中关村科学城科创大赛颁奖典礼在北京中关村举行&#xff0c;同时惠阳还举行了“中关村人工智能大模型产业集聚区”启动建设的揭牌仪式。 此次大会围绕北京AI产业的建设与发展&#xff0c;各…...

狮子鱼社区团购小程序v18.1独立全开源版+小程序前端

狮子鱼社区团购商城系统小程序V18.1独立开源版&#xff0c;该系统本身就非常完善也没更新的必要&#xff0c;此系统拿来即用非常方便&#xff0c;同一版一样人类小徐特别优化很多细节首页美化了下&#xff0c;如小程序端授权窗口美化了下&#xff0c;该版本用户授权接口正常。功…...

深拷贝和浅拷贝的区别

本文内容 主要阐述下深拷贝和浅拷贝的区别 通俗理解 深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体&#xff0c;而不是引用。 假设B复制了A&#xff0c;修改A的时候&#xff0c;看B是否发生变化&#xff1a; 如果B跟着也变了&#xff0c;说明是浅拷贝&…...

利用优化算法提高爬虫任务调度效率

目录 一、任务调度优化的重要性 二、选择合适的优化算法 三、建立任务调度模型 四、设计适应性函数 五、算法实施和调优 六、性能评估和优化结果分析 代码示例 总结 随着网络信息的爆炸式增长&#xff0c;网络爬虫在信息获取和数据挖掘等领域的应用越来越广泛。然而&am…...

Swiper的使用流程

1.官网查看演示 Swiper演示 - Swiper中文网 2.找到想使用的 比如想使用 卡片切换(255) 记住这个名字 3.去下载示例 下载Swiper - Swiper中文网 4.找到对应文件 5.根据里面引入的东西加到自己的页面 一定要引入swiper的 js 和 css html结构要按示例对应的三层结构 需要 …...

如何快速实现一个可视化看板?

一、用python实现一个可视化数据看板&#xff0c;最多支持多大体量的数据处理&#xff1f; Python可以通过多种可视化库来实现数据看板&#xff0c;例如Matplotlib、Seaborn、Plotly等。这些库可以处理各种规模的数据&#xff0c;从小型数据集到大型数据集都可以应用。 对于小型…...

基于PyTorch搭建FasterRCNN实现目标检测

基于PyTorch搭建FasterRCNN实现目标检测 1. 图像分类 vs. 目标检测 图像分类是一个我们为输入图像分配类标签的问题。例如&#xff0c;给定猫的输入图像&#xff0c;图像分类算法的输出是标签“猫”。 在目标检测中&#xff0c;我们不仅对输入图像中存在的对象感兴趣。我们还…...

线性表应用(非递减合并、分解链表、删除线性表)

将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间&#xff0c;不另外占用其它的存储空间。表中允许有重复的数据。 #include<iostream> using namespace std; typedef struct list {int data;list* next; }list,*linklist;…...

【C++面向对象侯捷下】1.导读

文章目录 来源&#xff1a;我的百度网盘 百科全书 专家书籍 C标准库 C编译器...

Ubuntu22.04 vnc远程黑屏

一、原因 原因是Ubuntu22.04使用的gnome启用了Wayland。vnc、teamviewer、向日葵、todesk等均无法使用或者远程黑屏等。 简单的说vnc、teamviewer、向日葵、todesk等均基于xorg实现&#xff08;xorg太流行&#xff09;&#xff0c;并不兼容Wayland&#xff0c;所以vnc无法正常…...

【1区TOP】Elsevier旗下CCF推荐,仅3个月左右录用!

01 期刊简介 CCF推荐人工智能类SCIE&EI 【期刊概况】IF&#xff1a;8.0-9.0&#xff0c;JCR1区&#xff0c;中科院2区TOP&#xff1b; 【版面类型】正刊&#xff1b; 【检索情况】SCIE&EI双检&#xff0c;CCF推荐&#xff1b; 【数据库收录年份】1992年&#xff…...

CentOS下安装Python3

一、电脑有网络&#xff1a; 1、直接使用yum包管理安装&#xff1a; yum是CentOS的默认包管理器&#xff0c;在安装软件时非常方便。要安装Python3&#xff0c;可以使用以下命令&#xff1a; sudo yum install python3等待安装完成后&#xff0c;查看python3是否安装完成 //不…...

微信小程序底部安全区域高度获取

CSS 属性 safe-area-inset-bottom safe-area-inset-bottom 就是安全区的高度 padding-bottom:env(safe-area-inset-bottom); wx.getSystemInfoSync() wx.getSystemInfoSync()可以获取系统信息 let system wx.getSystemInfoSync() let bottomSafe system.screenHeight -…...

虚拟机部署linux网络连接配置

1、虚拟机安装linux后&#xff0c;配置网络访问 虚拟机网络设置为NAT模式 linux网络配置好IP&#xff0c;主要是以下网络配置 2、linux没有ifconfig命令&#xff0c;ifconfig命令是在net-tools.x86_64包里 yum install net-tools.x86_64安装...

2591. 将钱分给最多的儿童(Java)

给你一个整数 money &#xff0c;表示你总共有的钱数&#xff08;单位为美元&#xff09;和另一个整数 children &#xff0c;表示你要将钱分配给多少个儿童。 你需要按照如下规则分配&#xff1a; 所有的钱都必须被分配。 每个儿童至少获得 1 美元。 没有人获得 4 美元。 请你…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...