pytest + yaml 框架 -6.hooks 钩子功能实现

在发送请求的时候,我们希望在发送请求参数前,带上签名的值,或者返回的内容需要二次处理,解密后返回。
此功能我们可以用 hooks 钩子来实现
pip 安装插件

pip install pytest-yaml-yoyo

hooks 功能在v1.0.4版本上实现

requests 库只支持一个 response 的钩子,即在响应返回时可以捎带执行我们自定义的某些方法。
可以用于打印一些信息,做一些响应检查或想响应对象中添加额外的信息

作者-上海悠悠 微信/QQ交流:283340479
blog地址 https://www.cnblogs.com/yoyoketang/
import requests
url = 'https://httpbin.org/get'

def response_status(resopnse, *args, **kwargs):
    print('url', resopnse.url)
    resopnse.status = 'PASS' if resopnse.status_code < 400 else 'FAIL'

res = requests.get(url, hooks={'response': response_status})
print(res.status)

以上是基于requests 库的钩子功能实现的基本方式

在yaml 文件中添加response 钩子功能,跟上面代码方式差不多, 有2种方式

  • 1.写到config 全局配置,每个请求都会带上hooks
  • 2.写到单个请求的request 下,仅单个请求会带上hooks功能

先看单个请求的response 钩子
test_hook1.yml

&#x4F5C;&#x8005;-&#x4E0A;&#x6D77;&#x60A0;&#x60A0; &#x5FAE;&#x4FE1;/QQ&#x4EA4;&#x6D41;:283340479
blog&#x5730;&#x5740; https://www.cnblogs.com/yoyoketang/
config:
  name: post&#x793A;&#x4F8B;
teststeps:
-
  name: post
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: test
      password: "123456"
    hooks:
      response: ['hook_response']
  extract:
      url:  body.url
  validate:
    - eq: [status_code, 200]
    - eq: [headers.Server, gunicorn/19.9.0]
    - eq: [$.code, 0]
-
  name: post
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: test
      password: "123456"
  extract:
      url:  body.url
  validate:
    - eq: [status_code, 200]
    - eq: [headers.Server, gunicorn/19.9.0]
    - eq: [$.code, 0]

在conftest.py 中注册钩子函数

&#x4F5C;&#x8005;-&#x4E0A;&#x6D77;&#x60A0;&#x60A0; &#x5FAE;&#x4FE1;/QQ&#x4EA4;&#x6D41;:283340479
blog&#x5730;&#x5740; https://www.cnblogs.com/yoyoketang/

def hook_response(response, *args, **kwargs):
    # print(response.text) &#x539F;&#x59CB;&#x6570;&#x636E;
    print("&#x6267;&#x884C;response hook &#x51FD;&#x6570;&#x5185;&#x5BB9;....")
    class NewResponse:
        text = '{"code": 0, "data": {"token": "yo yo"}}'  # response.text&#x89E3;&#x5BC6;
        history = response.history
        headers = response.headers
        cookies = response.cookies
        status_code = response.status_code
        raw = response.raw
        is_redirect = response.is_redirect
        content = b'{"code": 0, "data": {"token": "yo yo"}}'  # response.text&#x89E3;&#x5BC6;
        elapsed = response.elapsed

        @staticmethod
        def json():
            # &#x62FF;&#x5230;&#x539F;&#x59CB;&#x7684;response.json() &#x540E;&#x89E3;&#x7801;
            return {"code": 0, "data": {"token": "yo yo"}}

    return NewResponse

my_builtins.hook_response = hook_response

由于上面用例只在第一个请求中使用了hooks功能,所以第二个请求的断言 - eq: [$.code, 0] 会失败

钩子方法调用语法

  • 1.层级是在request 下
  • 2.hooks 关键字对应的是一个字典 {“response”: []}
  • 3.response 的值可以是单个函数名称,也可以是多个 func1, func2,或者是一个list类型[func1, func2]
  • 4.response 的值必须是一个可以调用的函数,此函数需在conftest 中注册绑定到 my_builtins 模块
  • 5.调用的函数第一个参数是 response, 可以重写response内容(如需要对返回结果解密),也可以不用重写
  request:
    method: POST
    url: http://httpbin.org/post
    hooks:
      response: ['hook_response']

在config 中配置全局hooks功能,格式如下

config:
  name: post&#x793A;&#x4F8B;
  hooks:
    response: ['hook_response']

test_hook2.yml完整示例

config:
  name: post&#x793A;&#x4F8B;
  hooks:
    response: ['hook_response']
teststeps:
-
  name: post
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: test
      password: "123456"
    hooks:
      response: ['hook_response']
  extract:
      url:  body.url
  validate:
    - eq: [status_code, 200]
    - eq: [headers.Server, gunicorn/19.9.0]
    - eq: [$.code, 0]
-
  name: post
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: test
      password: "123456"
  extract:
      url:  body.url
  validate:
    - eq: [status_code, 200]
    - eq: [headers.Server, gunicorn/19.9.0]
    - eq: [$.code, 0]

全局配置hooks, 那么该用例下所有的请求都会带上hooks

如果需要对请求参数预处理,我们还新增了一个request 请求钩子,可以获取到发送请求时的request参数

在conftest.py

&#x4F5C;&#x8005;-&#x4E0A;&#x6D77;&#x60A0;&#x60A0; &#x5FAE;&#x4FE1;/QQ&#x4EA4;&#x6D41;:283340479
blog&#x5730;&#x5740; https://www.cnblogs.com/yoyoketang/

def func1(req):
    print(f'&#x8BF7;&#x6C42;&#x9884;&#x5904;&#x7406;&#xFF1A;{req}')

def func2():
    print(f'&#x8BF7;&#x6C42;&#x9884;&#x5904;&#x7406;-----------')

my_builtins.func1 = func1
my_builtins.func2 = func2

在 yaml 文件中使用示例

config:
  name: post&#x793A;&#x4F8B;
teststeps:
-
  name: post
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: test
      password: "123456"
    hooks:
      request: ['func1', 'func2']
      response: ['hook_response']
  extract:
      url:  body.url
  validate:
    - eq: [status_code, 200]
    - eq: [headers.Server, gunicorn/19.9.0]
    - eq: [$.code, 0]
-
  name: post
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: test
      password: "123456"
    hooks:
      response: ['hook_response']
  extract:
      url:  body.url
  validate:
    - eq: [status_code, 200]
    - eq: [headers.Server, gunicorn/19.9.0]
    - eq: [$.code, 0]

在config 中设置全局hooks示例

config:
  name: post&#x793A;&#x4F8B;
  hooks:
    request: ['func1', 'func2']
    response: ['hook_response']

由于request 变量是pytest的一个内置fixture,此变量保留着,获取请求参数的函数使用 req 代替。
利用request hook功能可以实现请求参数的预处理,比如请求body签名和加密处理等需求。

Original: https://blog.csdn.net/qq_27371025/article/details/128125937
Author: 上海-悠悠
Title: pytest + yaml 框架 -6.hooks 钩子功能实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/773566/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2022年总结——实习

    lastday!感觉有很多想总结和分享的,但一落实到键盘上似乎就变得无从下手了(-__-)。但还是想发表点什么,哪怕是对看到这篇博客的你们有那么一点点帮助也是好的。 notice:…

    Python 2023年10月11日
    035
  • js学习笔记——条件 循环

    今天发现之前学的爱前端的课中JS部分函数等不全,果断换了一个课——渡一的《Web前端开发JavaScript高薪课堂》接着学习,不过废话有点多 语法:1、单if,条件成立,执行语句…

    Python 2023年6月12日
    054
  • NumPy和Matplotlib绘图

    NumPy和Matplotlib绘图 Matplotlib 是 Python 的绘图库,它经常与 NumPy 一起使用,从而提供一种能够代替 Matlab 的方案。不仅如此 Mat…

    Python 2023年8月24日
    037
  • Python 常用的库文件 和 国内镜像源

    Python 常用的库文件 Python 国内镜像源 国内源:# 清华: 阿里云: 中国科技大学: 华中理工大学: 山东理工大学: 豆瓣: 临时使用:# 永久修改,一劳永逸:# L…

    Python 2023年9月23日
    0100
  • 使用docker构建spark运行环境

    使用docker构建spark运行环境 * – 安装docker与docker-compose – 系统构架图: – docker compos…

    Python 2023年11月7日
    052
  • 大数据Kudu(二):Kudu架构

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年9月15日
    041
  • 数据分析工具Pandas

    ser_obj = pd.Series([1, 2, 3, 4, 5], index=[‘a’, ‘b’, ‘c&#82…

    Python 2023年8月7日
    039
  • 如何在 Spring Boot 项目中开启 “热部署“

    目录 1. 添加热部署框架支持 2. 设置当前项目 Settings 和新项目 Settings 开启项目自动编译 3. 开启运行中热部署 4. 使用 Debug 启动项目 (社区…

    Python 2023年9月28日
    029
  • python3pygame 游戏程序_python3 pygame实现接小球游戏

    本文实例为大家分享了python3 pygame接小球游戏的具体代码,供大家参考,具体内容如下 操作方法:鼠标操作 截图: 直接放代码: –– coding…

    Python 2023年9月24日
    031
  • MongoDB副本集群搭建和基础配置

    MongoDB副本集群 文章目录 MongoDB副本集群 * 1.MongoDB副本集介绍 – 1.1.副本集角色: 2.副本集介绍 – 2.1.副本集目录…

    Python 2023年9月26日
    029
  • 关于 JS 函数的一切

    本文基于: Bilibili – 自由的加百利 前置条件: 需掌握函数的编写、传参、返回、调用 理解作用域、掌握定时器的用法 知道引用类型和基本数据类型的区别 知道函数…

    Python 2023年6月12日
    052
  • Python PyQt5 | Hi音乐 v0.1.0 正式版发布

    Hi音乐 两大平台全音乐搜索、收听与下载的简洁网络音乐播放器 源码:Gitee 码云 简介 Hi&#x97F3;&#x4E50; 是基于 Python 开发的简洁网…

    Python 2023年11月10日
    045
  • Python安装第三方库常用方法 超详细~

    Python安装第三方库常用方法 前言 安装方法 * 1. 通过pychram安装 2. pip安装大法 3. 下载whl文件到本地离线安装 – 3.1 补充 4.其他…

    Python 2023年8月30日
    075
  • scrapy__邓治安

    命令提示符下载需要的依赖包 python -m pip install –upgrade pip 这条是更新 pip install wheel pip install…

    Python 2023年10月2日
    044
  • Pytest自动化脚本中各个层级的setup和teardown的执行流程和使用方法

    一般来说,自动化脚本是由若干个测试套组成的,而每个测试套又由测试套setup,若干个脚本,测试套teardown组成的。每个脚本又是由测试脚本级setup,测试脚本正文、测试脚本级…

    Python 2023年9月11日
    054
  • 跳出程序员思维:如何应对上手英文工具站的几点误区

    这次给大家带来程序员如何应对上手英文工具站的几点误区,帮助大家跳出程序员思维,一起出海赚美刀 ~ 误区二:没有技术的人,不需要技术就能挣钱。有技术的人,往往觉得技术能改变一切,这容…

    Python 2023年10月11日
    041
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球