断言
- 从响应结果当中,提取表达式
- 期望结果
- 比对方式 = 相等…
{"expr":"$.code", # "expr"指的是实际结果 :"$.code" 指的是 通过 jsonpath 元素定位获取的值 名称
"expected":0, # "expected" 指的是希望结果: 0 指的是 得到的结果
"type":"eq"} # "type" 指的是 希望结果: "eq"指的是实际结果,两则比对是否相等,如同:希望结果 == 实际结果
1、必须是列表形式
2、列表中的成员,必须是字典形式
3、字典必须有3个key:expr, expected, type
4、type表示实际和期望如何去比对,有以下值可以使用:eq,gt,in
[{"expr":"$.code","expected":0,"type":"eq"}, \
{"expr":"$.msg","expected":"OK","type":"eq"}, \
{"expr":"$..mobile_phone""expected":"18610100022""type":"eq"}]
========================================================
jsonpath
这是JSONPath语法元素与其XPath对应元素的完整概述和并排比较。
也可参照官网地址:https://goessner.net/articles/JsonPath/index.html#e2
如何提取,请参照如下:
| XPath | JSONPath | 描述 |
|---|---|---|
| / | $ | 根对象/元素 |
| . | @ | 当前的对象/元素 |
| / | . 或者 [ ] | 后代(直属后代:子辈) |
| . . | 不适用 | 父运算符 |
| // | . . | 递归下降。JSONPath从E4X借用此语法。(用的情况较多,在自己的后代中:子辈、孙辈) |
| * | * | 通配符。所有对象/元素,无论其名称如何。 |
| @ | 不适用 | 属性访问。JSON结构没有属性。 |
| [ ] | [ ] | 下标运算符。XPath使用它来遍历元素集合和谓词。在Javascript和JSON中,它是本机数组运算符。 |
![]() | [ , ] | XPath中的Union运算符导致节点集的组合。JSONPath允许将备用名称或数组索引作为一组。 |
| 不适用 | [开始:结束:步骤] | 从ES4借用的数组分片运算符。 |
| [ ] | ?() | 应用过滤器(脚本)表达式。 |
| 不适用 | () | 脚本表达式,使用基础脚本引擎。 |
| () | 不适用 | 在Xpath中分组 |
=================================================================
期望结果 与 实际结果比对
下列使用代码编写:
import ast
import jsonpath
# 从excel当中,读取出来的断言列表
check_srt = '[{"expr":"$.code","expected":0,"type":"eql"}, ' \
'{"expr":"$.msg","expected":"OK","type":"eql"},]'
# 把字符串转换成python列表
check_list = ast.literal_eval(check_srt) # 使用 ast.literal_eval 记得先导入 import ast
print(check_list)
""" 打印得到的结果:
[{'expr': '$.code', 'expected': 0, 'type': 'eql'}, {'expr': '$.msg', 'expected': 'OK', 'type': 'eql'}]
"""
# =================================================================
"""
1、从响应结果当中,提取表达式 -- jsonpath
jsonpath在线使用:http://jsonpath.com/
2、如何从响应果当中,通过jsonpath表达式,提取出要比对的数据。
第三方库:jsonpath 使用jsonpath, 记得先导入:import jsonpath
安装:pip install jsonpath
用法:jsonpath.jsonpath(response.json(), jsonpath表达式)
返回:列表。如果没有匹配到,返回False
"""
# 响应结果
response = {
"code": 0,
"msg": "OK",
"data": {
"id": 1000398923,
"reg_name": "白糖",
"mobile_phone": "13567748360"
}
}
check_res = [] # 定义一个比对结果的列表,有多个比对时使用列表,可以更明确
for check in check_list: # 遍历check_list列表
# actual = 通过jsonpath表达式,从响应结果当中拿到了实际结果
actual = jsonpath.jsonpath(response, check_index["expr"])[0]
if isinstance(actual,list): # 判断:如果 actual 的类型是个 列表:actual = actual[0]
actual = actual[0]
# 与实际结果做比对
if check_index["type"] == "eql":
check_res.append(actual == check_index["expected"])
print(check_res) # 打印比对的结果是:[True, True]; 成功是:True 失败是:False
if False in check_res:
print("断言失败!请查看结果为:False")
raise AssertionError
else:
print("所有断言成功!")
=================================================================
封装 期望结果 与 实际结果比对
import ast
import jsonpath
class MyAssert:
def assert_response_value(self, check_str, response_dict):
"""
:param check_str: 从excel当中,读取出来的断言列。是一个列表形式的字符串。里面的成员是一个断言
:param response_dict: 接口请求之后的响应数据,是字典类型。
:return: None
"""
# 所有断言的比对结果列表
check_res = []
# 把字符串转换成python列表
check_list = ast.literal_eval(check_str)
print(check_list)
for check_index in check_list:
actual = jsonpath.jsonpath(response_dict, check_index["expr"])[0]
if isinstance(actual, list):
actual = actual[0]
# 与实际结果做比对
if check_index["type"] == "eql":
check_res.append(actual == check_index["expected"])
if False in check_res:
raise AssertionError
=================================================================
faker
faker造数据:
faker的官方文档:https://faker.readthedocs.io/en/master/locales.html
测试派文章:http://testingpai.com/article/1615615023407>
1、安装:
pip install faker
2、使用:
1) 导入:from faker import Faker
2) 语言支持:
简体中文:zh_CN
繁体中文:zh_TW
美国英文:en_US
英国英文:en_GB
德文:de_DE
日文:ja_JP
韩文:ko_KR
法文:fr_FR
比如中文:f = Faker("zh_CN")
3) faker提供的数据生成类型:
faker.Provider
示例:
f = Faker("zh_CN")
print(f.phone_number())

该博客介绍了如何进行接口响应的断言检查,包括使用JSONPath提取响应数据,以及如何对比预期结果。同时,文章提到了Faker库在生成测试数据时的应用,提供多种语言和数据类型的生成选项。

1705

被折叠的 条评论
为什么被折叠?



