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

news2025/1/14 19:31:41

前言

做接口自动化,断言是比不可少的。如何快速巧妙的提取断言数据就成了关键,当然也可以提高用例的编写效率。笔者在工作中接触到了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 的功能和灵活性。

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

软件测试面试文档

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

在这里插入图片描述

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

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

相关文章

安达发APS|生产计划部门如何提升产量?

在当下制造业中&#xff0c;生产计划的制定和执行对于提高产量、降低成本、保证交货期等方面具有重要意义。随着科技的发展&#xff0c;越来越多的企业开始使用APS生产排程软件来优化生产计划&#xff0c;提高生产效率。本文将从以下几个方面介绍如何利用APS生产排程软件提升产…

外滩大会观察|重估蚂蚁!

点击关注 文丨刘雨琦&#xff0c;编丨王一粟 “不同品种的小狗排队通过‘实名认证’、刷脸识别不仅能识别人&#xff0c;还能识别狗”。“人脸、虹膜、掌纹都已经不算黑科技&#xff0c;脑纹识别才是真的不可替代。” 2023年上海外滩大会上&#xff0c;6G、无人安全检测实验室…

学Python的漫画漫步进阶 -- 第十四步.网络通信

学Python的漫画漫步进阶 -- 第十四步.网络通信 十四、网络通信14.1 基本的网络知识14.1.1 TCP/IP14.1.2 IP地址14.1.3 端口14.1.4 HTTP/HTTPS 14.2 搭建自己的Web服务器14.3 urllib.request模块14.3.1 发送GET请求14.3.2 发送POST请求 14.4 JSON数据14.4.1 JSON文档的结构14.4.…

方案:TSINGSEE青犀智能分析网关皮带撕裂算法的场景应用

在工地矿山等现实场景中&#xff0c;皮带运输在生产过程中是必不可少的&#xff0c;然而&#xff0c;由于长时间高强度的运转&#xff0c;皮带很容易发生撕裂、破损、跑偏等问题。这些问题会严重影响生产速度&#xff0c;甚至会导致严重的安全事故。为了有效预防此类安全事故发…

短视频抖音账号矩阵系统源码开发者自研(四)

抖音是一款备受欢迎的短视频APP&#xff0c;拥有数亿的用户&#xff0c;其中包括了大量的粉丝。为了让更多的人能够发现和观看到你的视频&#xff0c;抖音SEO是必不可少的一环&#xff0c;特别是对于拥有企业或个人品牌的用户来说。在这个过程中&#xff0c;抖音SEO源码的开源部…

不要动 WindowsApps 文件夹的权限以及更新 win10 版本

前言&#xff1a; 先简单说几句&#xff0c;本来打算开始写论文的&#xff0c;装个 mathtype 到 word 中&#xff0c;word 的安装路径在 WindowsApps 文件夹中&#xff0c;修改权限后导致 wsl 不能使用、微软自带的软件报错&#xff08;参数错误&#xff09;以及微软商店不能使…

区块链交易平台开发流程

随着区块链技术的日益发展&#xff0c;越来越多的金融机构和创业公司开始探索开发区块链交易平台的潜力。以下是一篇关于区块链交易平台开发流程的指南。 一、理解区块链技术 在开发区块链交易平台之前&#xff0c;必须深入理解区块链技术的内在机制和原理。区块链是一…

大数据之-Flink学习笔记

Flink Apache Flink — 数据流上的有状态计算。 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算处理。 任何类型的数据都以事件流的形式生成。信用卡交易、传感器测量、机器日志或网站或移动应用程序 2上的用户交互&#xff0c;…

java复习-10-String类

String 类 实例化 String 本身包装的是一个数组&#xff0c;并且其有两种对象的实例化形式&#xff1a;直接赋值、构造方法实例化。 public class StringDemo {public static void main(String args[]){// 直接赋值String str1 "Hello,World";// 构造方法实例化S…

Web自动化测试理解

最近几天&#xff0c;由于工作需要接触Web自动化测试&#xff0c;所以我从网上找的资料&#xff0c;学习了解&#xff0c;然后自己总结汇总的随笔&#xff0c;如文章中有不足的地方&#xff0c;请大家多多指教&#xff1b;或者文章内容与他人相似&#xff0c;望见谅。 手工测试…

成都瀚网科技有限公司:抖店平台买家怎么修改评价?

在抖音电商平台上&#xff0c;买家的评价对店铺的声誉和销售业绩有着重要影响。然而&#xff0c;有时买家可能会因为某些原因想要修改之前的评价。那么&#xff0c;抖店平台上的买家如何修改评价呢&#xff1f;修改评价对店铺有什么影响&#xff1f;本文将介绍买家如何修改评价…

控制台日志打印console的封装,加入美化、行显示与打印开关,支持node.js环境

控制台日志打印console的封装&#xff0c;加入美化、行显示与打印开关&#xff0c;支持node.js环境 为什么要写这个&#xff1f; 封装这个控制台日志打印工具&#xff0c;主要是在项目中自己做的SDK需要提供给其他开发人员使用&#xff0c;加入了日志美化和打印打开&#xff…

C语言 cortex-A7核UART总线实验

一、C 1&#xff09;uart4.h #ifndef __UART4_H__ #define __UART4_H__ #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h&quo…

maven清理本地仓库。删除_remote.repositories文件和删除失败的jar包

1.图预览 .bat文件要和仓库在同一平级目录 REPOSITORY_PATH要改成你自己仓库的地址 2、删除.lastUpdated文件(失败的jar包) 使用.bat文件 注明&#xff1a;REPOSITORY_PATHD:\software\Java\maven\repository 改成你仓库的地址 set REPOSITORY_PATHD:\software\Java\maven\rep…

nvm下载安装教程

前言 nvm 官网地址&#xff1a;https://nvm.uihtm.com 一、nvm 下载 进入 nvm github 地址&#xff0c;下载最新版本&#xff1a;https://github.com/coreybutler/nvm-windows/releases 点击选择当前最新版本。 滑动到底部&#xff0c;点击 nvm-setup.exe 下载安装文件。 接…

【C++ 番外】【指针】数组类型的指针,指向数组的指针,数组的元素是指针,这个视频说明白。数组和指针

from&#xff1a; https://www.bilibili.com/video/BV1H34y1K7AM/ 指向数组第一个元素的指针 数组类型指针 数组的类型都是指针 超级混合版本&#xff0c;加深理解

Spring-AOP+入门案例(注解)+AOP切入点语法+AOP通知类型

一、简介工作流程。 简介 SpringAop实际上就是代理模式 工作流程 二、导入依赖 1.spring-aop包 该包是在spring-context依赖下的子包&#xff0c;所以有context就有aop <dependency><groupId>org.springframework</groupId><artifactId>spring-con…

​消费盲返:消费者和商家都受益的消费返利

消费盲返是什么&#xff1f;它是一种新型的消费返利模式&#xff0c;它的核心思想是&#xff1a;消费者在平台购买商品后&#xff0c;可以获得后续一定数量的订单的部分利润作为奖励。这样&#xff0c;消费者不仅可以享受商品的优惠&#xff0c;还有可能赚取更多的钱。这种模式…

第七章 查找 六、平衡二叉树

目录 一、定义 二、最小不平衡子树 1、平衡方法 2、查找效率 三、插入、删除操作 平衡二叉树的插入操作&#xff1a; 平衡二叉树的删除操作&#xff1a; 1、例子1 &#xff08;1&#xff09;若我们要删除9 &#xff08;2&#xff09;若我们要删除55 2、例子2 ​编辑…

高云FPGA系列教程(10):letter-shell移植

文章目录 letter-shell简介letter-shell源码获取letter-shell移植函数和变量应用示例 本文是高云FPGA系列教程的第10篇文章。 shell&#xff0c;中文是外壳的意思&#xff0c;就是操作系统的外壳。通过shell命令可以操作和控制操作系统&#xff0c;比如Linux中的Shell命令就包括…