前言
之前已经介绍过很多关于接口自动化的一些相关知识,但是不可忽略,在我们的实战过程中,还有有很多的小细节需要我们去关注和留意的,是都会使用到的,那么接下来,我们就再介绍一些实战会运动到的一些常规操作。
一、数据提取器(jsonpath)
在我们做接口自动化过程中,很难避免,需要接口依赖,就是通过需从上一接口中,提取接口返回结果,然后传递到下一个接口中,通过什么方式比较快呢 ?或者你会想到通过字典一层层的获取,也可通过正则表达式提取数据,还有一种更简单的方法,那就是———— jsonpath数据提取器 ;
1、简单语法介绍:
2、使用说明
1)JSONPath是xpath在json的应用;
2)JSONPath 是参照xpath表达式来解析xml文档的方式,json数据结构通常是匿名的并且不一定需要有根元素;
3)JSONPath 用一个抽象的名字$来表示最外层对象;
4)JSONPath 允许使用通配符 * 表示所以的子元素名和数组索引;
3、常用操作
1)安装:pip install jsonpath
2)导入模块: from jsonpath import jsonpath
3)其他说明:
jsonpath ,提取json里面的某部分数据, 登录前置,帮助我们快速点位到json数据中的某字段(key:value形式) 1、$ ==> 表根目录对象,表示提取所有 2、. ==> 表子字节(返回的主层级) 3、.. ==> 表子孙字节(表主层级及其以下层级) 注意: == :匹配的结果会放到一列表中,可获取多个 == :无匹配成功的,返回False
4)数据提取实战操作
from jsonpath import jsonpath
data = {
'code': 0,
'msg': 'OK',
'data': {
'id': 31,
'leave_amount': 600.0,
'mobile_phone': '18211112222',
'reg_name': '小拉拉',
'reg_time': '2021-01-28 15:27:07.0',
'type': 1,
'token_info': {
'token_type': 'Bearer',
'expires_in': '2021-01-29 20:40:00',
'token': 'eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjMxLCJleHAiOjE2MTE5MjQwMDB9.I20fFTVt5i8lK86GR7HOwCMMYPeaiTqSLVEiCJbxuXYvGtefg7JzFmK-fP6eOtTJyvSoSrMPaugwmFpaoIWSCA'
}
},
}
# 匹配的结果放在列表,如果没有匹配,False
resp = jsonpath(data, '$..token')
resp1 = jsonpath(data,'$.msg')
resp2 = jsonpath(data,'$.kjk')
print(resp)
print(resp1)
print(resp2)
运行结果:
['eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjMxLCJleHAiOjE2MTE5MjQwMDB9.I20fFTVt5i8lK86GR7HOwCMMYPeaiTqSLVEiCJbxuXYvGtefg7JzFmK-fP6eOtTJyvSoSrMPaugwmFpaoIWSCA']
['OK']
False
二、json序列化和反序列化
当我们在自动化测试过程中,有时候需要转化数据才能执行代码,比如说,正则表达式,是需要通过字符串格式才能进行提取,但恰好我们的数据又不是字符串时;再比如说,我们在excel中提取json或headers数据时,需要传递python数据,但我们提取到的又不是python数据时,我们就需要转化数据了.
ps:我的理解不太深,只能做简单的记录了... ~~~
1、反序列化( json.loads( ) )
== :将json格式字符串,转化为Python格式字典
2、序列化 ( json.dumps( ) )
== : 将Python格式的字典,转化为json格式的字符串
import json
# 将json格式字符串,转化为Python格式字典===> 反序列化
name = '{"name":"lala","age":19}'
print(json.loads(name))
# 将Python格式的字典,转化为json格式的字符串===> 序列化
new_name = {"name":"lana","age":18}
print(json.dumps(new_name))
运行结果:
{'name': 'lala', 'age': 19}
{"name": "lana", "age": 18}
三、多值断言(asseert)
断言,是作为预期结果和实际结果的比对,是我们验证接口运行结果的一个重要方法。那么如果我们在做接口自动化过程中,得到的返回结果,我们应该断言哪个呢?
单断言返回码吗?好像又不够准确,全量断言?好像也没有必要,那么这是,我们可以考虑一下多值断言。
在接口自动化测试中,我们一样把预期结果也放置在excel表格中,通过字典的格式存储,
例如:expect ==> {"code":0,"msg":"ok"}
expect ==> {"code":0,"msg":"ok"}
import json
# 方法一:
expect = json.loads(info['expect'])
assert resp.json['code'] == expect['code']
assert resp.json['msg'] == expect['msg']
# 方法二:
for key , value in expect.items():
assert resp.json()[key] == value
# 方法三:
将excel中的expect,改为:{"$..code":0,"$..msg":"ok"}
for key , value in expect.items():
assert jsonpath(resp.json,key) == value
# 方法四:
如果需判断expect中,code不为0,才需再断言msg,可写为:
assert resp_body['code'] == expect['code']
if resp_body['code'] != 0:
assert expect['msg'] in resp_body['msg']
总结
以上都是在接口自动化过程中,会遇到或者说可以优化的一些小操作,了解的不够深入,只能做点小记录了,方便以后查看。
最后鸡汤一波:
说句老套的话,付出不一定有收获,但是真的不付出就一定不会有收获,所以谁知道呢,还是先付出的,做了,不管结果如何,其实还是收获了点东西的,就看自己怎么衡量把,该努力还是得努力的,加油,fighting!!!!!
wanjie,撒花花花花花花花`~~~``~`!!!!!