📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
一、引言
在软件测试工作中,尤其是涉及到对接口返回的 JSON 数据进行验证和处理时,我们常常需要从复杂的 JSON 结构中提取特定的数据。JsonPath 就像是一把精准的手术刀,能够帮助我们高效地定位和提取所需的数据。本文将从软件测试工程师的角度出发,详细介绍 JsonPath 的相关知识和日常使用方法。
二、JsonPath 概述
定义
JsonPath 是一种用于在 JSON 数据中定位和提取特定元素的表达式语言,它的作用类似于 XPath 在 XML 数据中的作用。通过 JsonPath 表达式,我们可以方便地从 JSON 对象或数组中获取所需的数据。
优势
-
简洁高效:可以用简洁的表达式完成复杂的数据提取任务,减少代码量。
-
灵活性强:支持多种操作符和函数,能够满足不同的查询需求。
-
跨语言支持:在多种编程语言中都有相应的实现库,方便测试工程师在不同的测试框架中使用。
三、JsonPath 语法基础
根节点与子节点访问
-
根节点:使用 $ 表示根节点,它代表整个 JSON 数据。
-
子节点访问:可以使用点号 . 或者中括号 [] 来访问子节点。
示例 JSON 数据:
{
"store": {
"book": [
{
"category": "fiction",
"price": 12.99,
"title": "The Great Gatsby"
},
{
"category": "non-fiction",
"price": 15.99,
"title": "Sapiens: A Brief History of Humankind"
}
],
"bicycle": {
"color": "red",
"price": 399.99
}
}
}
使用点号访问子节点:
-
$.store.book[0].title:获取第一本书的标题。
-
$.store.bicycle.color:获取自行车的颜色。
使用中括号访问子节点:
-
$['store']['book'][0]['title']:同样获取第一本书的标题。
-
$['store']['bicycle']['color']:获取自行车的颜色。
数组索引
数组索引从 0 开始,用于访问数组中的特定元素。
-
$.store.book[1]:获取第二本书的所有信息。
通配符
*:用于匹配所有元素或属性。
-
$.store.*:选择 store 下的所有子节点。
-
$.store.book[*].price:获取所有书籍的价格。 ..:用于递归地查找所有符合条件的元素。
-
$..book:在整个 JSON 数据中查找所有的 book 元素,无论其嵌套层次多深。
四、常用操作符
过滤操作符 [?()]
用于根据特定条件过滤元素。
-
$.store.book[?(@.price < 15)]:选择所有价格低于 15 的书籍。
-
$.store.book[?(@.category == 'fiction')]:选择所有类别为小说的书籍。
逻辑操作符
支持 &&(与)、||(或)和 !(非)进行逻辑组合。
-
$.store.book[?(@.price < 15 && @.category == 'fiction')]:选择价格低于 15 且类别为小说的书籍。
-
$.store.book[?(@.price < 15 || @.category == 'non-fiction')]:选择价格低于 15 或者类别为非小说的书籍。
算术操作符
支持 +、-、*、/、% 等算术运算。
-
$.store.book[0].price * 2:将第一本书的价格乘以 2。
五、常用函数
length()
用于获取数组或字符串的长度。
-
$.store.book.length():返回 book 数组的长度。
min()、max()
用于获取数组中数字元素的最小值和最大值。
-
$.store.book[*].price.min():返回所有书籍价格的最小值。
-
$.store.book[*].price.max():返回所有书籍价格的最大值。
sum()
用于计算数组中数字元素的总和。
-
$.store.book[*].price.sum():计算所有书籍价格的总和。
六、Python编程语言中的使用
在 Python 中,可以使用 jsonpath-ng 库。首先需要安装该库:pip install jsonpath-ng
from jsonpath_ng import jsonpath, parse
# 示例 JSON 数据
json_data = {
"store": {
"book": [
{
"category": "fiction",
"price": 12.99,
"title": "The Great Gatsby"
},
{
"category": "non-fiction",
"price": 15.99,
"title": "Sapiens: A Brief History of Humankind"
}
],
"bicycle": {
"color": "red",
"price": 399.99
}
}
}
# 定义 JsonPath 表达式
jsonpath_expression = parse('$.store.book[*].title')
# 查找匹配的结果
matches = [match.value for match in jsonpath_expression.find(json_data)]
# 输出结果
print("书籍标题:", matches)
七、在软件测试中的实际应用
接口测试中的数据验证
在接口测试中,我们经常需要验证接口返回的 JSON 数据是否符合预期。使用 JsonPath 可以方便地提取关键数据进行验证。
示例场景:验证一个获取用户信息的接口返回的用户姓名是否正确。
import requests
from jsonpath_ng import jsonpath, parse
# 发送接口请求
response = requests.get('https://example.com/api/user/1')
json_data = response.json()
# 定义 JsonPath 表达式
jsonpath_expression = parse('$.name')
# 查找匹配的结果
matches = [match.value for match in jsonpath_expression.find(json_data)]
# 验证结果
expected_name = "John Doe"
if matches[0] == expected_name:
print("用户姓名验证通过")
else:
print("用户姓名验证失败")
数据提取与转换
在测试过程中,有时需要从 JSON 数据中提取部分数据进行后续处理或转换。 示例场景:从一个包含多个商品信息的 JSON 数据中提取所有商品的价格,并计算总价。
from jsonpath_ng import jsonpath, parse
# 示例 JSON 数据
json_data = {
"products": [
{
"name": "Product 1",
"price": 10.99
},
{
"name": "Product 2",
"price": 20.99
},
{
"name": "Product 3",
"price": 15.99
}
]
}
# 定义 JsonPath 表达式
jsonpath_expression = parse('$.products[*].price')
# 查找匹配的结果
prices = [match.value for match in jsonpath_expression.find(json_data)]
# 计算总价
total_price = sum(prices)
print("商品总价:", total_price)
八、注意事项
-
性能问题:在处理大规模 JSON 数据时,复杂的 JsonPath 表达式可能会影响性能。尽量使用简单的表达式或结合其他优化方法。
-
兼容性问题:不同的 JsonPath 实现库可能在语法和功能上存在细微差异,使用时需要注意选择合适的库并了解其特性。
-
错误处理:在使用 JsonPath 表达式时,可能会出现表达式错误或未匹配到数据的情况,需要进行适当的错误处理。
九、总结
JsonPath 是软件测试工程师在处理 JSON 数据时的得力工具,通过掌握其语法、操作符和函数,以及在不同编程语言中的使用方法,可以高效地完成数据提取和验证任务。在实际测试工作中,合理运用 JsonPath 能够提高测试效率和准确性,帮助我们更好地完成软件测试工作。希望本文对你在使用 JsonPath 方面有所帮助。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】