news 2026/4/23 13:59:15

Python 使用 JsonPath 完成接口自动化测试中参数关联和数据验证

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 使用 JsonPath 完成接口自动化测试中参数关联和数据验证
背景:
  1. 接口自动化测试实现简单、成本较低、收益较高,越来越受到企业重视
  2. restful风格的api设计大行其道
  3. json成为主流的轻量级数据交换格式
痛点

接口关联

  • 接口关联也称为关联参数。在应用业务接口中,完成一个业务功能时,有时候一个接口可能不满足业务的整个流程逻辑,需要多个接口配合使用,简单的案例如:B接口的成功调用依赖于A接口,需要在A接口的响应数据(response)中拿到需要的字段,在调用B接口的时候,传递给B接口作为B接口请求参数,拿到后续响应的响应数据。
  • 接口关联通常可以使用正则表达式去提取需要的数据,但对于json这种简洁、清晰层次结构、轻量级的数据交互格式,使用正则未免有点杀鸡用牛刀的感觉(是的,因为我不擅长写正则表达式),我们需要更加简单、直接的提取json数据的方式。

数据验证

  • 这里的数据验证指的是对响应结果进行数据的校验
  • 接口自动化测试中,对于简单的响应结果(json),可以直接和期望结果进行比对,判断是否完全相等即可。如
{"status":1,"msg":"登录成功"}
  • 对于格式较复杂,尤其部分数据存在不确定性、会根据实际情况变化的响应结果,简单的判断是否完全相等(断言)通常会失败。如:
{"status":1,"code":"10001","data":[{"id":1,"investId":"1","createTime":"2018-04-27 12:24:01","terms":"1","unfinishedInterest":"1.0","unfinishedPrincipal":"0","repaymentDate":"2018-05-27 12:24:01","actualRepaymentDate":null,"status":"0"},{"id":2,"investId":"1","createTime":"2018-04-27 12:24:01","terms":"2","unfinishedInterest":"1.0","unfinishedPrincipal":"0","repaymentDate":"2018-06-27 12:24:01","actualRepaymentDate":null,"status":"0"},{"id":3,"investId":"1","createTime":"2018-04-27 12:24:01","terms":"3","unfinishedInterest":"1.0","unfinishedPrincipal":"100.00","repaymentDate":"2018-07-27 12:24:01","actualRepaymentDate":null,"status":"0"}],"msg":"获取信息成功"}

上面的json结构嵌套了很多信息,完整的匹配几乎不可能成功。比如其中的createTime信息,根据执行接口测试用例的时间每次都不一样。同时这个时间是响应结果中较为次要的信息,在进行接口自动化测试时,是可以选择被忽略的。

  • 我们需要某种简单的方法,能够从json中提取出我们真正关注的信息(通常也被称为关键信息)。如提取出status的值为1,data数组中每个对象的investId都为1,data中第三个对象的unfinishedPrincipal值为100.00,只要这三个关键信息校验通过,我们就认为响应结果没有问题。
解决方案

JsonPath可以完美解决上面的痛点。通过JsonPath可以从多层嵌套的Json中解析出所需要的值。

JsonPath
  • JsonPath参照XPath解析xml的方式来解析Json
  • JsonPath用符号$表示最外层对象,类似于Xpath中的根元素
  • JsonPath可以通过点语法来检索数据,如:
$.store.book[0].title
  • 也可以使用中括号[]的形式,如
$['store']['book'][0]['title']
运算符(Operators)
运算符说明
$根元素
@当前元素
*通配符,可以表示任何元素
..递归搜索
.子节点(元素)
['' (, '')]一个或者多个子节点
[ (, )]一个或者多个数组下标
[start:end]数组片段,区间为[start,end)
[?()]过滤器表达式,其中表达式结果必须是boolean类型,如可以是比较表达式或者逻辑表达式
JsonPath案例

json

{ "lemon": { "teachers": [ { "id": "101", "name": "华华", "addr": "湖南长沙", "age": 25 }, { "id": "102", "name": "韬哥", "age": 28 }, { "id": "103", "name": "Happy", "addr": "广东深圳", "age": 16 }, { "id": "104", "name": "歪歪", "addr": "广东广州", "age": 29 } ], "salesmans": [ { "id": "105", "name": "毛毛", "age": 17 }, { "id": "106", "name": "大树", "age": 27 } ] }, "avg": 25 }

JsonPath例子及说明

JsonPath路径说明
$.lemon.teachers[*].name获取所有老师的的名称
$..name获取所有人的名称
$.lemon.*所有的老师和销售
$.lemon..age所有人的年龄
$..age所有人的年龄
$.lemon.teachers[*].age所有老师的年龄
$.lemon.teachers[3]索引为3(第4个)老师的信息
$..teachers[3]索引为3(第4个)老师的信息
$.lemon.teachers[-2]倒数第2个老师的信息
$..teachers[-2]倒数第2个老师的信息
$..teachers[1,2]第2到第3个老师的信息
$..teachers[:2]索引0(包含)到索引2(不包含)的老师信息
$..teachers[1:3]索引1(包含)到索引3(不包含)的老师信息
$..teachers[-2:]最后的两个老师的信息
$..teachers[2:]索引2开始的所有老师信息
$..teachers[?(@.addr)]所有包含地址的老师信息(jsonpath_rw不支持)
$.lemon.teachers[?(@.age < 20)]所有年龄小于20的年龄信息(jsonpath_rw不支持)
使用jsonpath模块

安装jsonpath模块

pip install jsonpath==0.75

解析

# 1:导入相关模块 import json import jsonpath # 2: 准备json字符串 jsonStr = ''' { "lemon": { "teachers": [ { "id": "101", "name": "华华", "addr": "湖南长沙", "age": 25 }, { "id": "102", "name": "韬哥", "age": 28 }, { "id": "103", "name": "Happy", "addr": "广东深圳", "age": 16 }, { "id": "104", "name": "歪歪", "addr": "广东广州", "age": 29 } ], "salesmans": [ { "id": "105", "name": "毛毛", "age": 17 }, { "id": "106", "name": "大树", "age": 27 } ] }, "avg": 25 } ''' # 3:加载json字符串为json对象 json_obj = json.loads(jsonStr) # 4:使用jsonpath模块的jsonpath方法提取信息 # eg1: 提取所有包含addr属性的老师信息,结果为list类型 results = jsonpath.jsonpath(json_obj,"$..teachers[?(@.addr)]") print(results) # 输出结果:[{'id': '101', 'name': '华华', 'addr': '湖南长沙', 'age': 25}, {'id': '103', 'name': 'Happy', 'addr': '广东深圳', 'age': 16}, {'id': '104', 'name': '歪歪', 'addr': '广东广州', 'age': 29}] # eg2:提取所有年龄小于20岁的老师的name,结果为list类型 results2 = jsonpath.jsonpath(json_obj,"$.lemon.teachers[?(@.age < 20)].name") print(results2) # 输出结果为:['Happy']
使用jsonpath_rw

安装jsonpath_rw模块

pip install jsonpath-rw

解析

# 1:导入相关模块 import json from jsonpath_rw import jsonpath, parse # 2: 准备json字符串 jsonStr = ''' # 同上(略) ''' # 3:加载为json对象 json_obj = json.loads(jsonStr) # 4:采用parse创建jsonpath对象(该案例是得到所有的老师name) jsonpath_expr = parse('$.lemon.teachers[*].name') # 5:通过jsonPath检索json后返回匹配的数据,类型是DatumInContext的list datumInContexts = jsonpath_expr.find(json_obj) # 采用列表推导式检索出所有匹配的值 values = [datum.value for datum in datumInContexts] print(values) # 输出结果为:['华华', '韬哥', 'Happy', '歪歪'] # 案例2:提取索引为4的老师的name jsonpath_expr = parse('$.lemon.teachers[3].name') datumInContexts = jsonpath_expr.find(json_obj) print(datumInContexts) values = [datum.value for datum in datumInContexts] print(values) # 结果为:['歪歪']

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料,这些资料希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 23:35:36

90%用户忽略的Open-AutoGLM 2.0缺陷:如何提前识别并规避推理偏差?

第一章&#xff1a;90%用户忽略的Open-AutoGLM 2.0缺陷&#xff1a;现象与影响尽管 Open-AutoGLM 2.0 在自动化代码生成和自然语言理解任务中表现出色&#xff0c;但其底层设计存在若干被广泛忽视的缺陷&#xff0c;直接影响模型输出的稳定性与安全性。隐式上下文截断问题 当输…

作者头像 李华
网站建设 2026/4/19 17:46:02

robotframework自动化测试来实现接口测试,让你目瞪口呆!

robotframework(后续简称为robot)是一款自动化测试框架&#xff0c;可能做各种类型的自动化测试。 本文介绍通过robotframework来做接口测试。 第一步&#xff1a;安装第三方库&#xff0c;提供接口测试的关键字。 在robot当中&#xff0c;python语言的接口测试库名称为Requ…

作者头像 李华
网站建设 2026/4/18 8:28:27

为什么顶尖团队都在关注Open-AutoGLM?6大技术亮点深度拆解

第一章&#xff1a;Open-AutoGLM智能体 评测Open-AutoGLM 是一个基于 GLM 架构构建的开源自动化智能体框架&#xff0c;旨在实现任务驱动的自主决策与执行能力。其核心优势在于结合了自然语言理解、工具调用与动态规划能力&#xff0c;适用于复杂场景下的自动化流程处理。架构设…

作者头像 李华
网站建设 2026/4/18 6:43:18

智能体AI工作流完全指南:构建大模型应用的核心技术(附实例)

智能体工作流是基于大语言模型的多步操作流程&#xff0c;能高效完成复杂任务并提升输出质量。文章介绍了智能体的不同自主性程度、应用场景&#xff08;如发票处理、客户咨询&#xff09;及构建方法&#xff0c;强调任务分解、组件组合和评估分析的重要性。通过反思、工具使用…

作者头像 李华
网站建设 2026/4/18 11:04:04

好写作AI:突破写作瓶颈,AI工具如何激发学术创作灵感?

面对空白文档&#xff0c;你是否曾感到思维停滞&#xff1f;当研究数据就摆在眼前&#xff0c;却不知如何编织成一个有说服力的故事时&#xff0c;那种熟悉的焦虑感是否再次袭来&#xff1f;学术写作不仅是信息的堆砌&#xff0c;更是观点的塑造与知识的创新。研究表明&#xf…

作者头像 李华
网站建设 2026/4/20 11:28:33

思奥特智能:以光为笔,绘就工业检测新图景!

在智能制造浪潮席卷全球的今天&#xff0c;工业检测作为产品质量的“守门人”&#xff0c;其重要性日益凸显。而机器视觉光源&#xff0c;作为工业检测系统的“眼睛”&#xff0c;直接影响着检测结果的准确性与效率。深圳市思奥特智能科技有限公司&#xff08;以下简称“思奥特…

作者头像 李华