自动化测试数据校验神器!

2023-11-22 15:56:14 浏览数 (3)

在做接口自动化测试时,经常需要从接口响应返回体中提取指定数据进行断言校验。

今天给大家推荐一款json数据提取神器: jsonpath

jsonpath和常规的json有哪些区别呢?在Python中,json是用于处理JSON数据的内置模块,而jsonpath是用于从JSON数据中提取特定数据的查询语言和相关库。

它们的区别和适用场景:

json模块:

  • json模块是Python的内置模块,用于解析和生成JSON格式的数据。
  • 它提供了loads()和dumps()等方法,用于将JSON数据与Python数据结构之间进行转换。

jsonpath是一种用于从JSON对象中提取特定数据的查询语言,类似于XPath,但是针对JSON格式的数据而设计。

它提供了一种灵活的方式来定位和提取JSON对象中的数据,可以使用通配符、过滤器等功能进行精确的数据定位。

简单来说json模块适用于处理JSON数据的基本操作,而jsonpath适用于需要精确定位和提取JSON数据的复杂场景。

jsonpath用法

从上述可知,jsonpath是一种用于从JSON对象中提取特定数据的查询语言,类似于XPath,可以更精确地定位JSON对象中的数据。

常用的jsonpath操作符和通配符额:

  • $: 根对象
  • @: 当前对象
  • .: 子对象
  • ..: 递归地查找子对象
  • *: 通配符,匹配任何属性或数组元素
  • []: 过滤器,用于指定属性或数组元素的条件

下面是一个使用jsonpath提取JSON对象数据的示例:

代码语言:javascript复制
import json
from jsonpath_ng import parse

# JSON对象
json_obj = {
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    }
}

# 使用jsonpath提取数据
jsonpath_expr = parse("$.store.book[1].author")
result = [match.value for match in jsonpath_expr.find(json_obj)]
print(result)  # 输出: ['Evelyn Waugh']

在上面的示例中,我们使用jsonpath_ng库解析了一个jsonpath表达式,并使用find()方法在JSON对象中查找匹配的数据。在这个例子中,我们使用$.store.book[1].author提取了第二本书的作者。

当在自动化测试中使用jsonpath时,可以通过jsonpath表达式来提取JSON响应中的特定数据,以便进行断言、验证和后续的处理。以下是一些常见的提取场景示例:

1、提取单个属性的值:

代码语言:javascript复制
# 提取单个属性的值
jsonpath_expr = parse("$.store.book[0].title")
result = [match.value for match in jsonpath_expr.find(response.json())]
assert result[0] == "Sayings of the Century"

2、提取数组中的所有元素:

代码语言:javascript复制
# 提取数组中的所有元素
jsonpath_expr = parse("$.store.book[*].author")
result = [match.value for match in jsonpath_expr.find(response.json())]
assert result == ["Nigel Rees", "Evelyn Waugh"]

3、提取满足条件的元素:

代码语言:javascript复制
# 提取满足条件的元素
jsonpath_expr = parse("$.store.book[?(@.price < 10)].title")
result = [match.value for match in jsonpath_expr.find(response.json())]
assert result == ["Sayings of the Century"]

4、提取嵌套属性的值:

代码语言:javascript复制
# 提取嵌套属性的值
jsonpath_expr = parse("$.store.bicycle.color")
result = [match.value for match in jsonpath_expr.find(response.json())]
assert result[0] == "red"

5、提取多个属性的值并进行组合:

代码语言:javascript复制
# 提取多个属性的值并进行组合
jsonpath_expr = parse("$.store.book[0].['title', 'author']")
result = [match.value for match in jsonpath_expr.find(response.json())]
assert result[0] == {"title": "Sayings of the Century", "author": "Nigel Rees"}

在这些示例中,我们使用了jsonpath表达式从JSON响应中提取了不同的数据,包括单个属性的值、数组中的所有元素、满足条件的元素、嵌套属性的值以及多个属性的值并进行组合。这些提取场景可以帮助我们在自动化测试中对API的响应数据进行验证和处理。

0 人点赞