1. 全字段断言-DeepDiff应用【理解】
2. 全量报文断言进行封装【理解】
3. 接口加密/解密封装【理解】
4. 接口签名知识理解【理解】 -- 和加密是一个思路--加密(二次加密)
解决两个问题:
1、对响应报文进行断言
2、对数据进行加密
3、签名,就是在加密基础上进行二次加密
一、全字段断言-DeepDiff应用
1、什么是deep diff:深度差异
安装命令
pip install deepdiff -i https://pypi.tuna.tsinghua.edu.cn/simple
2、作用与如何使用
对比各种数据结构类型:字典、列表、元组、json都可以进行对比
deepdiff 深度差异
对比各种数据结构类型:字典、列表、json都可以进行对比
有差异:会显示对应数据? 会怎么显示呢?有以下4种差异
# 1. 修改某个值 : values_changed
# 2. 修改数据的类型不同: type_changes
# 3. 多一个数据(增加) :dictionary_item_added
# 4. 少一个数据(删除):dictionary_item_removed
没有差异:会返回空字典
"""
deepdiff(t1,t2) 以t1数据为标准
对该类进行实例化,发现其他参数都有默认值,那么使用这个类和方法的时候,必须自己赋值的必传参数是没有默认赋值的
以前一个参数为标准,比较出后一个参数的差异
1)对比一样的,返回{} 空字典
from deepdiff import DeepDiff
# 使用类之前,必须先实例化 :DeepDiff(数据1,数据2)
json1 = {
'code': 0,
"message": "成功",
"data": {
"total": 28,
"id": 123
}
}
json2 = {
'code': 0,
"message": "成功",
"data": {
"total": 28,
"id": 123
}
}
# 案例一:一样的数据返回{}
res = DeepDiff(json1, json2)
print(res)
2) 值对比不同:'values_changed'
3) 类型改变:'type_changes'
4) 多了一个数据:'dictionary_item_added'
5)少了一个数据:'dictionary_item_removed'
3、过滤的几个常用的场景
1)过滤顺序:ignore_order =true/false
1.1)过滤无序的数据,会没有差异
JSON数据
1.2)过滤有序的数据,有差异
列表数据
查看这个类,忽略顺序默认的是 不忽略
2)过滤大小写:ignore_string_case
3)过滤某个字段:exclude_paths
错误案例:
4、搜索的几种场景
1)精准匹配-搜索
2)模糊匹配-搜索
通配符 *
use_regexp=True 正则表达式
3) 匹配-搜索--大小写敏感
5、deepdiff方法的封装
1)不定长参数的传参:
diff方法里面有非常多的参数,常用的规则也很多,不能把参数都写进去,这是需要引入不定长传参
在Python中,不定长传参是一个非常有用的特性,它允许你定义函数时不必明确指定参数的数量。这主要通过两种特殊的语法来实现:*args 和 **kwargs。
*args
*args 用于接收任意多个位置参数,并将它们作为元组(tuple)传递给函数。当你不确定函数调用时会传递多少个位置参数时,这个特性非常有用。
示例代码:
python
def my_func(*args):
for arg in args:
print(arg)
my_func(1, 2, 3, 4, 5) # 输出: 1 2 3 4 5
**kwargs
**kwargs 用于接收任意多个关键字参数,并将它们作为字典(dict)传递给函数。这对于处理未知数量的关键字参数非常有用。
示例代码:
python
def my_func(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
my_func(name="Alice", age=30, city="New York") # 输出: name: Alice age: 30 city: New York
两者结合使用
你还可以在同一个函数中同时使用 *args 和 **kwargs,但需要注意的是,*args 必须放在 **kwargs 之前。
示例代码:
python
def my_func(*args, **kwargs):
for arg in args:
print(arg)
for key, value in kwargs.items():
print(f"{key}: {value}")
my_func(1, 2, 3, name="Alice", age=30) # 输出: 1 2 3 name: Alice age: 30
deepdiff方法的参数
正常运行
2)jsonDeepDiff:这是一个自定义函数,它封装了DeepDiff
的调用
**kwargs 用于接收任意多个关键字参数,并将它们作为字典(dict)传递给函数
定义了一个名为oth
的字典,它包含了DeepDiff
的一个配置选项:exclude_paths
。这个选项用于指定在比较过程中应该被排除的路径,过滤了一下
'封装'是一个核心概念,
它涉及到将数据和操作这些数据的函数(通常称为方法)组合到一个单一的类中。
封装的主要目的是隐藏对象的内部状态,保护数据不被外部直接访问或修改,从而确保数据的完整性和安全性。
二、框架
1、分析数据,需要在excel维护2个值:期望结果和过滤条件
2、全量断言
3、加密
pip install pycryptodome
1)如何加密--思路
接口需要加密 -- 登录接口
对用户而言 :需要写明文
明文:{"username":"admin","password":"123456"}
让你的测试团队的小伙伴,不需要知道加密需要加成什么数据,所以就可以进行封装起来。
代码层面,必须知道:什么时候需要加密,什么时候不需要加密。---怎么打个标识。
思路:
excel :接口需要加密的话,你就在请求数据key前面加一个@符号。--打个标识
{"@username":"admin","password":"123456"}
这样我就知道这个数据是否要加密
但是加密的时候,不能把@也一起加密,否则和输入的数据有差异。需要用切片符把@切除
2)写一个加密类,并定义加密规则
下面这个是个写的加密类,定义了加密方法的规则
对输入的tony进行加密
3)引用上面这个加密的方法,进行数据加密
加密的时候,不能把@也一起加密,否则和输入的数据有差异。需要用切片符把@切除
下面是处理@符号
下面是调用上面封装的加密方法的例子
代码解释
from P09_PytestFrame.Common.encryptAes import ENCRYPTAES #引用加密类
#这个是加密的方法
@staticmethod
def data_encryptAes(data):
"""
把对应的数据进行Aes加密(有可能需要加密,有可能不需要加密)
@param data:
@return:
"""
# {"username":"admin","password":"123456"}
# {"@username":"admin","@password":"123456"}
# print("原始数据是:",data)
newdata = {}
for key in data:
if key[0] == "@":
# 需要加密
# 把数据进行加密之后,要恢复原本的key(不要@符号--为了打个标识)
# 字典名[key] = value
#ENCRYPTAES是上面那个加密类实例化出来的一个对象,用于调用aes_encrypt()加密方法
newdata[key[1:]] = ENCRYPTAES.aes_encrypt(data[key])
else:
# 不需要加密
newdata[key] = data[key]
return newdata
4)运行main