您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

优化自动化接口测试:利用钩子函数增强HTTP请求处理

时间:2023-06-16 15:00:48  来源:测试玩家勇哥  作者:

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

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

钩子函数设计

遥想当年,勇哥一开始对【钩子】也是懵逼的!!钩子函数就是在特定事件发生前后执行的函数。通过钩子我们可以在 HTTP 请求的不同阶段执行花里胡哨的自定义操作,如修改URL、更新请求头、请求参数加密加签、处理响应结果...

上代码:

```Python/ target=_blank class=infotextkey>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请求的增强和扩展的示例和思路,希望能够为各位在自动化接口测试中的工作带来一些启发和帮助。



Tags:HTTP请求   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
探索Java的HTTP请求与响应处理机制
Java的HTTP请求与响应处理机制是开发Web应用程序或与Web服务进行交互时非常重要的一部分。下面将详细介绍Java中HTTP请求和响应的基本概念、常见的处理方式以及一些最佳实践...【详细内容】
2023-11-08  Search: HTTP请求  点击:(222)  评论:(0)  加入收藏
Spring Boot是如何处理HTTP请求的?
在Spring Boot中创建基本的REST控制器是个简单的过程。通过使用一些注释,您可以封装所需的逻辑,让Spring Boot处理其余部分。但是,这背后究竟发生了什么?本文将详细介绍Spring B...【详细内容】
2023-09-20  Search: HTTP请求  点击:(214)  评论:(0)  加入收藏
Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。我之前的HTTP开发是用apache的Htt...【详细内容】
2023-09-14  Search: HTTP请求  点击:(315)  评论:(0)  加入收藏
HTTP请求:Requests的进阶使用方法浅析
1 背景上篇文章讲解了 requests 模块的基础使用,其中有 get、put、post 等多种请求方式,使用 data、json 等格式做为请求参数,在请求体中添加请求头部信息的常见信息,如:headers...【详细内容】
2023-06-28  Search: HTTP请求  点击:(175)  评论:(0)  加入收藏
优化自动化接口测试:利用钩子函数增强HTTP请求处理
在自动化接口测试中,我们经常需要发送HTTP请求来模拟用户的操作并验证接口的正确性。够灵活处理请求参数、添加认证信息以及处理依赖参数。这正是钩子函数的用武之地。下面勇...【详细内容】
2023-06-16  Search: HTTP请求  点击:(95)  评论:(0)  加入收藏
Java发送http请求
一,原始方式使用java.net包中的HttpURLConnection类。以下是一个简单的示例代码,用于发送GET请求并获取响应:javaCopy codeimport java.io.BufferedReader;import java.io.Inpu...【详细内容】
2023-05-28  Search: HTTP请求  点击:(352)  评论:(0)  加入收藏
node http请求
对于前端来说,网络请求主要就是用 ajax 的方式去处理。所以本文也会站在前端角度简单讲解 Node 中如何使用 http 模块。前后端对接时,现在常用的请求方法有 GET、POST、PUT、P...【详细内容】
2023-05-22  Search: HTTP请求  点击:(121)  评论:(0)  加入收藏
如何使用Java处理HTTP请求和响应?
Java中有许多成熟的HTTP框架可以使用,例如Spring、Netty等。这些框架提供了各种HTTP处理器和工具类,使得HTTP请求和响应处理变得更加容易和高效。下面是一个简单的Java代码示...【详细内容】
2023-05-17  Search: HTTP请求  点击:(340)  评论:(0)  加入收藏
为了一个HTTP请求问题,差点和iOS干起来
本次斗殴事件起因全部归iOS,为啥这么说,http请求都不会发,瞎写的什么玩意(ps:他应该不会看到...)。在处理本次冲突中,意外发现了另外一个存在已久的bug,我们先说说这个玩意,再说我们...【详细内容】
2023-03-14  Search: HTTP请求  点击:(164)  评论:(0)  加入收藏
HTTP请求工具之“拿来吧你”
导语:在进行网关、CDN类型产品的转发测试过程中,除了普通的HTTP|HTTPS请求,通常我们还会涉及到一些协议以及TLS层面的测试。在敏捷环境下,通常到一定时间段我们的测试工具会五花...【详细内容】
2023-03-01  Search: HTTP请求  点击:(159)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条