优化自动化接口测试:利用钩子函数增强HTTP请求处理
创始人
2025-07-01 14:11:17
0

在自动化接口测试中,我们经常需要发送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请求的增强和扩展的示例和思路,希望能够为各位在自动化接口测试中的工作带来一些启发和帮助。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...