首页 > 其他分享 >利用钩子函数增强HTTP请求处理

利用钩子函数增强HTTP请求处理

时间:2023-08-14 21:33:56浏览次数:40  
标签:HTTP 请求 钩子 after request func hooks 函数

From: 原创 测试玩家勇哥 测试玩家勇哥 2023-06-16 19:24 发表于广东

在自动化接口测试中,我们经常需要发送HTTP请求来模拟用户的操作并验证接口的正确性。够灵活处理请求参数、添加认证信息以及处理依赖参数。这正是钩子函数的用武之地。

下面勇哥将以一个实际的示例场景为例,详细介绍如何利用钩子函数进行自动化接口测试,并展示如何设计和应用这些钩子函数。

钩子函数设计

钩子函数就是在特定事件发生前后执行的函数。通过钩子我们可以在 HTTP 请求的不同阶段执行花里胡哨的自定义操作,如修改URL、更新请求头、请求参数加密加签、处理响应结果...
上代码:

```python
class Hooks:
def __init__(self):
self.before_request_funcs = {}
self.after_request_funcs = {}

def before_request(self, func):
"""
注册 before_request 钩子函数
"""
self.before_request_funcs[func.__name__] = func
return func

def after_request(self, func):
"""
注册 after_request 钩子函数
"""
self.after_request_funcs[func.__name__] = func
return func

def run_before_request_hooks(self, func_names, request, json_data):
"""
执行 before_request 钩子函数
"""
for func_name in func_names:
if func_name in self.before_request_funcs:
func = self.before_request_funcs[func_name]
json_data = func(request, json_data)
return json_data

def run_after_request_hooks(self, func_names, request, response):
"""
执行 after_request 钩子函数
"""
for func_name in func_names:
if func_name in self.after_request_funcs:
func = self.after_request_funcs[func_name]
response = func(request, response)
return response

场景:注册用户

模拟用户注册,并验证注册接口的正确性。同时,在每个请求中自动添加认证信息和处理依赖参数。

钱包: 封装请求

有钱才能吃饭,所以我们看看怎么封装代码

def req(url, method, **kwargs):
"""
发送请求并返回响应对象
"""
before_hooks = kwargs.pop('before_hooks', [])
after_hooks = kwargs.pop('after_hooks', [])
json_data = kwargs.pop('json', {})

request = requests.Request(method=method, url=url, **kwargs)
prepared_request = session.prepare_request(request)

json_data = hooks.run_before_request_hooks(before_hooks, prepared_request, json_data)
prepared_request.body = json.dumps(json_data)
response = session.send(prepared_request)
response = hooks.run_after_request_hooks(after_hooks, prepared_request, response)

return response

上述代码中,勇哥先封装一个http请求,在里面实现不同位置调用钩子函数

买菜:写测试用例

常规玩法,干百度。

def test_user_registration():
url = "http://www.baidu.com"
# url = "http://jsonplaceholder.typicode.com/posts"
data = {
"userId": "testuser",
"title": "password123",
"body": "测试玩家勇哥"
}
headers = {
"Content-Type": "application/json"
}
before_hooks = [add_authentication_headers.__name__, handle_dependent_parameters.__name__]
after_hooks = [after_dependent_parameters.__name__]
kwargs = {"json": data, "headers": headers}

return req(url, "post", before_hooks=before_hooks, after_hooks=after_hooks, **kwargs)

在上述测试用例中,我们使用req函数发送了一个POST请求来模拟用户注册,并对返回的响应进行了断言验证。

切菜:注册前置钩子函数

写N个前置钩子函数,发送注册请求前自动添加认证信息。

@hooks.before_request
def add_authentication_headers(request, json_data):
"""
添加认证头信息
"""
print("前置钩子函数,添加认证头信息", request)
request.headers["Authorization"] = "Bearer YOUR_AUTH_TOKEN"
return json_data


@hooks.before_request
def handle_dependent_parameters(request, json_data):
"""
处理依赖参数
"""
print("前置钩子函数,处理依赖参数", request)

json_data["verification_code"] = get_verification_code()
return json_data

定义一个add_authentication_headers函数,它是一个前置钩子函数。在这个钩子函数中,我们通过调用get_access_token函数获取访问令牌,并将其添加到请求的Authorization头信息中。

通过注册该钩子函数,每次发送请求前都会自动添加认证信息,无需在每个测试用例中重复编写。

切菜前的工具箱:封装公共方法

def get_verification_code():
# 实现获取验证码的逻辑
return "YOUR_VERIFICATION_CODE"

上述代码是可以是一些公共函数,以便全局使用,比如我们这里写一些获取验证码的方法

煮菜:处理依赖参数

处理一些依赖参数,例如在注册用户之前需要获取一个验证码,并将验证码添加到注册请求中。

@hooks.after_request
def after_dependent_parameters(request, response):
"""
处理后置
"""
print("发送请求后执行", request, "后置钩子函数,处理依赖参数", response)

return response

我们又定义了一个后置钩子函数。在这个钩子函数中,我们调用after_dependent_parameters函数处理一些依赖数据,并返回任意结果。

通过注册该钩子函数,每次发送请求前以及发送请求后都会自动处理依赖参数,使我们的测试用例更加简洁和可维护。

上菜:执行测试用例

可以按照这种方式执行测试用例,并观察钩子函数的作用。

if __name__ == "__main__":
res = test_user_registration # 执行测试
print("打印看看响应结果",res)

输出结果如下:

执行test_user_registration()函数来执行我们的测试用例,但是这个测试用例在前面已经被我们注册了很多钩子函数,所以不需要额外处理,我们在买菜这部分就已经实现了,通过不同的函数名,执行不同的钩子函数,非常灵活,扩展性非常强。

标签:HTTP,请求,钩子,after,request,func,hooks,函数
From: https://www.cnblogs.com/Raul2018/p/17629814.html

相关文章

  • HTTP基础:学习HTTP协议的基本知识,了解请求和响应的过程
    HTTP(HypertextTransferProtocol,超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议,它是Web中最基本的协议。HTTP请求和响应都是由客户端和服务器之间进行的。一个完整的HTTP请求由以下几个部分组成:请求行:包括请求方法(GET、POST等)、请求的URI和HTTP协议的版本号。请......
  • beast网络库搭建http服务器
    参考:https://llfc.club/category?catid=225RaiVNI8pFDD5L4m807g7ZwmF#!aid/2RlhDCg4eedYme46C6ddo4cKcFN简介前面的几篇文章已经介绍了如何使用asio搭建高并发的tcp服务器,以及http服务器。但是纯手写http服务器太麻烦了,有网络库beast已经帮我们实现了。这一期讲讲如何使用beast......
  • HTTP代理IP在自媒体中的作用有哪些?
    随着自媒体业务的兴起和发展,为更多人提供了一个很好的平台。在自媒体业务中,HTTP代理IP的作用主要有以下几个方面:一、爬虫和数据采集:自媒体从不同的网站抓取数据时,为了避免被网站封禁IP,可以使用HTTP代理IP进行请求,通过不断切换IP地址来绕过网站的限制,实现抓取数据的稳定性。二、流量......
  • 深入解析:HTTP和HTTPS的三次握手与四次挥手
    推荐阅读AI文本OCR识别最佳实践AIGamma一键生成PPT工具直达链接玩转cloudStudio在线编码神器玩转GPUAI绘画、AI讲话、翻译,GPU点亮AI想象空间「java、python面试题」来自UC网盘app分享,打开手机app,额外获得1T空间https://drive.uc.cn/s/2aeb6c2dcedd4AIGC资料包https:......
  • 在安卓模拟器上如何实现HTTP代理自动切换
    在开发和测试应用程序时,有时需要在安卓模拟器上实现HTTP代理的自动切换以方便调试。本文将介绍如何在安卓模拟器上实现HTTP代理的自动切换。1.使用脚本文件使用脚本文件是一种实现HTTP代理自动切换的简单方法。以下是一个示例脚本文件:这个脚本定义了一个代理服务器地址和端口号数组......
  • IIS 请求筛选模块被配置为拒绝包含双重转义序列的请求。
    方法1:web.config内容如下:<?xmlversion="1.0"encoding="UTF-8"?><configuration><system.webServer><security><requestFilteringallowDoubleEscaping="true"/></security></system.webServer&g......
  • 【程序员高阶工具】idea自带的http客户端插件使用
    idea自带的http客户端插件使用一.前言http客户端的工具还是很多的,如postman,jmeter,apifox等。其中jmeter只支持本地,如果多成员间需要协作,需要进行文件传输,较为繁琐。postman和apifox,更方便进行用户间共享,但是这些工具的使用,需要打开第三方软件,从研发人员的角度不是很简便。目......
  • Nginx反向代理POST请求获取不到请求体
    好学人2023-08-14问题描述:Nginx升级HTTPS后,反向代理GET请求正常,POST请求获取不到请求体。问题原因:在升级HTTPS时,统一将所有HTTP请求都重定向到了HTTPS请求,所有再通过HTTP请求调取接口时,会被重定向到HTTPS请求,导致请求异常。解决方案:改用HTTPS请求即可。举例:http://api.example......
  • HTTP基本概念
    一、HTTP请求所有的HTTP消息(请求和响应)中都包含一个或几个单行显示的消息头,然后说一个强制空白行,最后是消息主体。如何查看HTTP请求?鼠标右键在网页上面点击选择审查元素并选择网络标签。HTTP请求头:Host消息头:用于指定被访问的地址中的主机名称。Accept:表示浏览器支持的MIME类......
  • Python 潮流周刊#15:如何分析 FastAPI 异步请求的性能?
    你好,我是猫哥。这里每周分享优质的Python、AI及通用技术内容,大部分为英文。标题取自其中一则分享,不代表全部内容都是该主题,特此声明。本周刊精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精......