【接口自动化_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 #引用加密类

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


 

相关推荐

  1. 自定义对外开放接口解密签名、验签

    2024-07-21 20:34:03       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 20:34:03       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 20:34:03       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 20:34:03       45 阅读
  4. Python语言-面向对象

    2024-07-21 20:34:03       55 阅读

热门阅读

  1. Flask校验

    2024-07-21 20:34:03       18 阅读
  2. 基带成型(脉冲成形)

    2024-07-21 20:34:03       19 阅读
  3. mysql索引篇

    2024-07-21 20:34:03       19 阅读
  4. FedAvg

    FedAvg

    2024-07-21 20:34:03      16 阅读
  5. 我在vue2重生之vite加强版

    2024-07-21 20:34:03       16 阅读
  6. 2024.7.20 暑期训练记录(6)

    2024-07-21 20:34:03       16 阅读
  7. 调用第三方接口-OkHttpClient

    2024-07-21 20:34:03       19 阅读
  8. C Prinmer Plus笔记第1-6章

    2024-07-21 20:34:03       18 阅读
  9. MySQL8的备份方案——差异备份(CentOS)

    2024-07-21 20:34:03       16 阅读
  10. C语言——数组指针

    2024-07-21 20:34:03       20 阅读
  11. 【Golang 面试基础题】每日 5 题(一)

    2024-07-21 20:34:03       21 阅读
  12. npm小记

    2024-07-21 20:34:03       16 阅读
  13. 【busybox记录】【shell指令】df

    2024-07-21 20:34:03       20 阅读
  14. C语言之封装,继承,多态

    2024-07-21 20:34:03       23 阅读