全网最牛,python接口自动化测试-接口sign签名(实战撸码)

news2024/11/24 14:25:59

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

一般公司对外的接口都会用到 sign 签名,对不同的客户提供不同的apikey ,这样可以提高接口请求的安全性,避免被人抓包后修改请求参数乱请求。

接口sign签名

一登陆的接口请求为例,如下接口抓包报文信息,其中sign的签名规则如下

第一步,拼接字符串,首先去除sign参数本身,然后去除值是空的参数p3,剩下p2=v2&p1=v1&method=cancel&pn=vn,
然后按参数名字符升序排序,method=cancel&p1=v1&p2=v2&pn=vn.
第二步,然后做参数名和值的拼接,最后得到methodcancelp1v1p2v2pnvn
第三步,在上面拼接得到的字符串后加上验证密钥apikey,我们假设是abc,得到新的字符串methodcancelp1v1p2v2pnvnabc
第四步,然后将这个字符串换为小写进行md5计算,假设得到的是abcdef,这个值即为sign签名值。

注意:计算md5之前请确保接口与接入方的字符串编码一致,如统一使用utf-8编码或者GBK编码,如果编码方式不一致则计算出来的签名会校验失败。

POST http://127.0.0.1:8000/api/v3/login HTTP/1.1
User-Agent: Fiddler
Content-Type: application/json
Host: 127.0.0.1:8000
Content-Length: 111

{
	"username": "test",
	"password": "123456",
    "sign": "1aca01806e93bb408041965a817666af"

}

HTTP/1.1 200 OK
Date: Sat, 26 Oct 2019 03:38:31 GMT
Server: WSGIServer/0.2 CPython/3.6.0
Content-Type: application/json
Vary: Accept, Cookie
Allow: POST, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Length: 109

{"code": 0, "msg": "login success!", "username": "test", "token": "a76ba3b8fcbdff82f6a94e5ad5bf8fb934192e5f"}

实现 sign 签名

在 conftest.py 编写 pre_sign 函数,对请求的 body 部分预处理

import hashlib
from pytest_yaml_yoyo import my_builtins


def sign_body(body: dict) -> str:
    """对body 签名"""
    key = "12345678"      # 接口项目的开发提供
    # 去掉sign 和值为空的
    new_body = [''.join(item) for item in body.items() if item[0] != 'sign' and item[1] != '']
    # print(new_body)
    # 做排序
    new_body.sort()
    # 拼接
    # print(new_body)
    str_body = ''.join(new_body) + key
    # print(str_body)
    # md5加密

    def jiamimd5(src: str):
        """md5加密"""
        m = hashlib.md5()
        m.update(src.encode('UTF-8'))
        return m.hexdigest()

    sign = jiamimd5(str_body)
    return sign


def pre_sign(req: dict):
    print(f'请求预处理:{req}')
    sign = sign_body(req.get('json'))
    req['json']['sign'] = sign
    print(f'处理后的req数据:{req}')


my_builtins.pre_sign = pre_sign

pre_sign 函数中的 req 参数 对应yaml 用例中的 request 请求参数,是一个字典类型的数据

test_sign_login.yml 用例内容

config:
  name: 登录
  hooks:
    request: ['pre_sign']

test_login:
  name: 登录
  request:
    method: POST
    url: /api/v3/login
    json:
      username: test8
      password: "123456"
  validate:
    - eq: [body.code, 0]

运行用例

pytest test_sign_login.yml

运行日志

test_sign_login.yml::test_login
---------------------------------------------------- live log call -----------------------------------------------------
2023-06-08 09:45:11 [INFO]: 执行文件-> test_sign_login.yml
2023-06-08 09:45:11 [INFO]: base_url-> http://127.0.0.1:8200
2023-06-08 09:45:11 [INFO]: config variables-> {}
2023-06-08 09:45:11 [INFO]: 运行用例-> test_login
请求预处理:{'method': 'POST', 'url': '/api/v3/login', 'json': {'username': 'test8', 'password': '123456'}}
处理后的req数据:{'method': 'POST', 'url': '/api/v3/login', 'json': {'username': 'test8', 'password': '123456', 'sign': '
65faa7273d552aaedda3abdd1fe5c865'}}
2023-06-08 09:45:11 [INFO]: --------  request info ----------
2023-06-08 09:45:11 [INFO]: yml raw  -->: {'method': 'POST', 'url': '/api/v3/login', 'json': {'username': 'test8', 'passw
ord': '123456', 'sign': '65faa7273d552aaedda3abdd1fe5c865'}}
2023-06-08 09:45:11 [INFO]: method   -->: POST
2023-06-08 09:45:11 [INFO]: url      -->: /api/v3/login
2023-06-08 09:45:11 [INFO]: headers  -->: {'User-Agent': 'python-requests/2.30.0', 'Accept-Encoding': 'gzip, deflate', 'A
ccept': '*/*', 'Connection': 'keep-alive'}
2023-06-08 09:45:11 [INFO]: json     -->: {"username": "test8", "password": "123456", "sign": "65faa7273d552aaedda3abdd1f
e5c865"}
2023-06-08 09:45:11 [INFO]: ------  response info  200 OK ------
2023-06-08 09:45:11 [INFO]: 耗时     <--: 0.207054s
2023-06-08 09:45:11 [INFO]: url      <--: http://127.0.0.1:8200/api/v3/login
2023-06-08 09:45:11 [INFO]: headers  <--: {'Date': 'Thu, 08 Jun 2023 01:45:11 GMT', 'Server': 'WSGIServer/0.2 CPython/3.6
.8', 'Content-Type': 'application/json', 'Allow': 'POST, OPTIONS', 'X-Frame-Options': 'SAMEORIGIN', 'Content-Length': '11
0', 'Vary': 'Cookie'}
2023-06-08 09:45:11 [INFO]: cookies  <--: {}
2023-06-08 09:45:11 [INFO]: raw text <--: {"code": 0, "msg": "login success!", "username": "test8", "token": "045acf05c42
2ad8a40e2309ecb8de830d664e50c"}
2023-06-08 09:45:11 [INFO]: validate 校验内容-> [{'eq': ['body.code', 0]}]
2023-06-08 09:45:11 [INFO]: validate 校验结果-> eq: [0, 0]
2023-06-08 09:45:11 [INFO]: export 导出全局变量:{}
PASSED            

从运行结果可以看到,虽然用例里面没有传sign参数,通过hooks中的request 钩子,对请求参数预处理,实现了动态签名自动添加sign参数了。

请求预处理:{'method': 'POST', 'url': '/api/v3/login', 'json': {'username': 'test8', 'password': '123456'}}
处理后的req数据:{'method': 'POST', 'url': '/api/v3/login', 'json': {'username': 'test8', 'password': '123456', 'sign': '
65faa7273d552aaedda3abdd1fe5c865'}}

用例中hooks参数使用
前面示例是把hooks参数放到config中, 作用范围是对当前yaml用例文件中的每个请求都会自动调用预处理函数。

config:
  name: 登录
  hooks:
    request: ['pre_sign']

如果只是针对单个请求预处理,可以把hooks参数放到接口的请求参数中

config:
  name: 登录

test_login:
  name: 登录
  request:
    method: POST
    url: /api/v3/login
    json:
      username: test8
      password: "123456"
    hooks:
      request: ['pre_sign']
  validate:
    - eq: [body.code, 0]

这样hooks的作用范围就只针对单个接口请求了。

下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

只有拼尽全力,才能超越自我,让梦想翱翔。无论前方荆棘如何密布,我们都要勇敢闯过去,追逐心中的星辰大海。坚持不懈,成功必将属于那些敢于奋斗的人。

只有拼尽全力,才能抵达辉煌的彼岸;只有坚持不懈,才能创造出属于自己的奇迹;只要心怀梦想,每一步都是向成功迈进的勇敢起点。相信自己,奋斗不止!

每一次努力都是一个机会,每一次坚持都是一份希望。不要害怕失败,成功需要勇气和决心。只有不断奋斗,才能迎接美好的未来。相信自己,你可以做到!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

groupkfold 报错:raise keyerror(f“{not foud} not in index“)

【1】使用groupkfold 的时候出现以上报错&#xff1a;索引错误&#xff0c;groups的索引和x y 的不对应 【2】源代码&#xff1a; 【3】进行修改&#xff1a; 可以成功索引&#xff01;&#xff01;&#xff01;

tomcat下上传html

html 最基本结构服务器xshelltomcat 下载是否可以访问到服务器上传html html 最基本结构 .html 后缀名 <!DOCTYPE HTML> <html><head><meta charset"utf-8"> <title>2306</title></head><body>大家好&#xff01;…

C++图形开发(7):能进行抛物线运动且触墙能反弹的小球

今天来实现一下触墙能反弹的小球、 我们之前所实现的都只是小球的上下&#xff0c;也就是y轴方向的运动&#xff08;详见&#xff1a;C图形开发&#xff08;6&#xff09;&#xff1a;落下后能弹起的小球&#xff09;&#xff0c;那么要使小球能够呈抛物线状运动&#xff0c;我…

Failed to start connector [Connector[HTTP/1.1-8080]]

1、解决Web server failed to start. Port 8080 was already in use 2、SpringBoot启动报错:“Error starting ApplicationContext. To display the conditions report re-run your application with ‘debug’ enabled.” 3、Failed to start end point associated with Proto…

015-从零搭建微服务-远程调用(一)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&#xff1a;https://gitee.com/csps…

如何利用Spine制作简单的2D骨骼动画

在2D游戏中&#xff0c;我们经常看到各种各样的角色动画。动画能给游戏带来生机和灵气。创作一段美妙的动画&#xff0c;不仅需要强大的软件工具&#xff0c;更需要一套完善的工作流程。 Spine就是一款针对游戏开发的2D骨骼动画编辑工具。Spine 可以提供更高效和简洁 的工作流…

【STM32智能车】寻迹模块

【STM32智能车】寻迹模块 寻迹模块 传感器原理接线说明 智能车寻迹是一种机器人控制技术&#xff0c;它通过使用传感器和程序算法&#xff0c;使汽车能够在行驶过程中识别出路径上的黑线&#xff0c;并沿着该线路行驶。 智能车寻迹常用于竞赛或教育用途&#xff0c;可以提高学生…

【学习心得】Virtual Studio Code下载安装与简单设置

一、下载 1、vs code 官网&#xff1a;https://code.visualstudio.com/ 二、安装 1、双击安装文件开始安装。 2、同意协议开始下一步。 3、选择你自己想要安装的路径。 4、勾选这三个&#xff0c;方便右键在vs code 中打开文件或文件夹。 5、安装步骤几乎没有坑&#xff0c;直…

探究低代码开发平台的价值所在,为企业带来哪些优势?

随着数字化转型的加速&#xff0c;企业和组织需要以更快的速度交付新的软件应用程序&#xff0c;以保持竞争力和创新性。然而&#xff0c;传统的软件开发模式已经不再适用于当前的快节奏商业环境。在这种背景下&#xff0c;低代码开发平台日益成为软件开发的热门趋势&#xff0…

【JavaWeb基础】三层架构

一、知识点整理 三层架构的含义 Controller: 控制层,接收前端发送的请求,对请求进行处理,并响应数据。 Service:业务逻辑层,处理具体的业务逻辑。 Dao(Data Access Object): 数据访问层(持久层),负责数据访问操作,包括数据的增、删、改、查。 二、代码实现 原EmpController.…

spring整合logBack日志框架:

1. SLF4J简介 SLF4J&#xff08;Simple Logging Facade for Java&#xff09;是一种日志规范&#xff0c;类似于JDBC&#xff0c;我们常用的日志log4j、logback等都实现了这个规范&#xff0c;所以我们可以直接使用SLF4J的规范来使用日志。 2. logback和log4j 它们是同一个作…

【hadoop】大数据的几个基本概念

大数据的几个基本概念 数据仓库的基本概念数据仓库与大数据OLTP与OLAP 数据仓库的基本概念 数据仓库&#xff0c;英文名称为Data Warehouse&#xff0c;可简写为DW或DWH。数据仓库&#xff0c;是为企业所有级别的决策制定过程&#xff0c;提供所有类型数据支持的战略集合。 本…

堆排序算法及其稳定性分析

堆排序算法及其稳定性分析 什么是堆排序&#xff1f; 堆排序是利用数据结构堆而设计的一种排序算法。 堆分为两种&#xff0c;大顶堆和小顶堆。 所谓大顶堆就是每个节点的值都大于或者等于其左右孩子节点的值。 小顶堆则是相反的&#xff0c;每个节点的值都小于或者等于其…

超全整理,接口测试实战详细(实例)一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、接口测试范围 …

Git无法上传删除 Commit里面有大文件

1.Bug描述 因为在一次提交中不小心把一个打包的aab文件弄到commit文件里了&#xff0c;于是在上传的时候push rejected 了。 因为GitHub的文件上限是100M&#xff0c;但是打的包太大了&#xff0c;有170M&#xff0c;所以是不能上传的&#xff0c;但是又是已经在Commit历史中了…

rsync增量备份工具

目录 一、概述 二、配置 rsync 源服务器 1.查看rsync配置文件位置 2.修改 /etc/rsync.conf 配置文件 3.为备份账户创建数据文件 4.保证所有用户对源目录都有读取权限 5.启动 rsync 服务 三、发起端 1.rsync命令 2.将指定的资源远程同步到本地/opt 目录下进行备份。 3.将…

【Docker】docker安装nginx及端口映射相关配置

前言&#xff1a; 最近&#xff0c;在一台新服务器上准备运行一个前端vue项目&#xff0c;服务器上安装了docker&#xff0c;想要尝试试通过docker安装nginx的并运行项目&#xff0c;以下是操作步骤 操作步骤&#xff1a; 一、安装nginx 1、拉取镜像 从docker仓库里拉取最…

unaipp打包app启动界面配置

1、配置代码 2、IOS端启动界面demo参考 iOS平台自定义storyboard启动界面 - DCloud问答

面试官当面夸奖了我,反手却把我挂了,这是什么套路?

最近几个朋友找我聊天&#xff0c;给我讲述了面试过程中遇到的一些不太理解的事情。我有个朋友作为一个技术面试官&#xff0c;今天来分享 10 个面试相关的套路。 1.自我介绍 自我介绍是一个重要的开始&#xff0c;好的开始是成功的一半。不需要太多花里胡哨的东西&#xff0…

SpringBoot05:自动配置原理

一、自动配置原理 SpringBoot官网 1、分析自动配置原理 以HttpEncodingAutoConfiguration&#xff08;Http编码自动配置&#xff09;为例解释自动配置原理 //表示这是一个配置类&#xff0c;和以前编写的配置文件一样&#xff0c;也可以给容器中添加组件 Configuration(prox…