当前位置: 首页 > news >正文

【接口自动化_09课_大量响应报文处理及加解密、签名处理】

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 #引用加密类#这个是加密的方法@staticmethoddef 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


 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Kafka系列之:Kafka存储数据相关重要参数理解
  • Nginx 不转发请求 IP
  • tinymce富文本支持word内容同时粘贴文字图片上传 vue2
  • Framework源码面试之Handler面试集合
  • Laravel+swoole 实现websocket长链接
  • Netty Websocket
  • 【数据结构进阶】二叉搜索树
  • DC-1靶场打靶第一次!!!!冲冲冲!
  • 算法日记day 16(二叉树的广度优先遍历|反转、对称二叉树)
  • Android APP 基于RecyclerView框架工程(知识体系积累)
  • 在虚拟机 CentOS7 环境下安装 MySQL5.7 数据库
  • 深入理解Linux网络(三):TCP对象创建
  • [HTML]一文掌握
  • MySQL中EXPLAIN关键字详解
  • Python入门基础教程(非常详细)
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • “大数据应用场景”之隔壁老王(连载四)
  • 10个最佳ES6特性 ES7与ES8的特性
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Cookie 在前端中的实践
  • docker容器内的网络抓包
  • ES2017异步函数现已正式可用
  • golang中接口赋值与方法集
  • HTML5新特性总结
  • nodejs实现webservice问题总结
  • QQ浏览器x5内核的兼容性问题
  • React16时代,该用什么姿势写 React ?
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 从零开始在ubuntu上搭建node开发环境
  • 第2章 网络文档
  • 基于webpack 的 vue 多页架构
  • 技术:超级实用的电脑小技巧
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 日剧·日综资源集合(建议收藏)
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 应用生命周期终极 DevOps 工具包
  • 再谈express与koa的对比
  • 栈实现走出迷宫(C++)
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • # 数仓建模:如何构建主题宽表模型?
  • # 数论-逆元
  • #android不同版本废弃api,新api。
  • #Z2294. 打印树的直径
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C)一些题4
  • (poj1.2.1)1970(筛选法模拟)
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十六)Flask之蓝图
  • (四)Android布局类型(线性布局LinearLayout)