Python的装饰器详解:提升接口自动化测试效率

news2024/12/24 21:01:30

在接口自动化测试中,我们经常会遇到一些共用的功能,例如请求日志记录、接口鉴权、性能监控等。为了避免在每个接口函数中重复编写这些功能的代码,Python提供了装饰器(Decorator)的功能,它能够在不修改原有函数代码的情况下,为函数添加额外的功能。本文将详细介绍Python装饰器的概念、用法和实际应用场景。

1. 装饰器基础概念
装饰器是Python的一种高级函数,它可以接受一个函数作为参数,并返回一个新的函数。通过使用装饰器,我们可以在不修改原函数代码的情况下,为函数添加额外的功能或行为。

装饰器的定义格式如下:

def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        # 在调用原函数之前的额外操作
        result = original_function(*args, **kwargs)
        # 在调用原函数之后的额外操作
        return result
    return wrapper_function

在上述示例中,decorator_function是装饰器函数,它接受一个原函数original_function作为参数,并返回一个新的函数wrapper_function。wrapper_function内部可以执行一些在调用原函数之前或之后的额外操作。‍

2. 接口自动化测试中的装饰器应用
接口自动化测试是一种常见的测试场景,我们可以利用装饰器来简化测试代码并提高测试效率。下面以一个示例来说明装饰器在接口自动化测试中的应用。

假设我们有一个接口测试类ApiTest,其中包含多个测试方法,每个方法对应一个接口的测试用例。在每个接口测试方法中,我们都需要进行一些公共操作,例如打印请求日志、鉴权、性能监控等。使用装饰器,我们可以将这些公共操作提取出来,封装成一个装饰器函数,然后在每个接口测试方法上应用该装饰器,实现代码复用和功能扩展。

下面是一个示例代码:

def log_decorator(api_func):
    def wrapper(*args, **kwargs):
        # 打印请求日志
        print(f"Request: {api_func.__name__}()")
        # 调用原函数
        result = api_func(*args, **kwargs)
        # 打印响应日志
        print(f"Response: {api_func.__name__}() -> {result}")
        return result
    return wrapper
class ApiTest:
    @log_decorator
    def test_login(self, username, password):
        # 接口测试代码
        pass
    @log_decorator
    def test_create_user(self,email, password):
# 接口测试代码
@log_decorator
def test_get_user_info(self, user_id):
    # 接口测试代码
    pass

在上述示例中,我们定义了一个名为`log_decorator`的装饰器函数。该装饰器函数接受一个接口测试方法`api_func`作为参数,并返回一个新的函数`wrapper`。在`wrapper`函数内部,我们可以实现请求日志的打印和响应日志的打印,并调用原接口测试方法`api_func`。通过在每个接口测试方法上应用`@log_decorator`装饰器,我们可以实现请求日志和响应日志的自动打印。

现在,我们可以运行接口测试类`ApiTest`中的方法,观察装饰器的效果。每次调用被装饰的接口测试方法时,会自动打印请求日志和响应日志,方便我们查看请求和响应的信息,提高调试和排查问题的效率。‍

3. 装饰器的应用场景推荐
除了在接口自动化测试中,装饰器还有很多其他实际应用场景。以下是一些常见的推荐使用装饰器的场景:

- 认证和鉴权:在Web应用中,可以使用装饰器进行用户认证和权限鉴权的校验,确保只有授权用户才能访问特定的功能或页面。

- 日志记录:可以使用装饰器实现日志的自动记录,例如请求日志、异常日志等,方便后续的排查和分析。

- 缓存:通过装饰器可以实现函数的结果缓存,提高函数的执行效率,避免重复计算。

- 性能监控:可以使用装饰器对函数的执行时间、内存占用等进行监控和统计,用于性能分析和优化。

- 事务处理:在数据库操作中,可以使用装饰器实现事务的自动提交和回滚,保证数据的一致性和完整性。

以上只是一些常见的场景,实际上,装饰器的应用非常灵活,可以根据具体需求进行扩展和定制。‍

总结
本文详细介绍了Python装饰器的概念、用法和实际应用场景。在接口自动化测试中,装饰器可以帮助我们简化代码,实现功能的复用和扩展,提高测试效率。除了接口自动化测试,装饰器在其他领域也有广泛的应用。希望本文对你理解和应用Python装饰器有所帮助。

如果你对这个项目感兴趣,你可以在你的项目中尝试使用装饰器来提升接口自动化测试的效率和可维护性。以下是一个完整的示例代码,演示了如何使用装饰器实现接口请求日志记录和数据存储的功能:

import requests
import json
import pymysql
from functools import wraps
# 装饰器函数:记录接口请求日志
def log_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 打印请求信息
        print(f"请求URL: {func.__name__}")
        print(f"请求参数: {kwargs}")
        # 调用原函数
        response = func(*args, **kwargs)
        # 打印响应信息
        print(f"响应结果: {response}")
        return response
    return wrapper
# 装饰器函数:保存接口请求数据到MySQL数据库
def save_data_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 调用原函数
        response = func(*args, **kwargs)
        # 保存数据到MySQL数据库
        save_data_to_mysql(response)
        return response
    return wrapper
# 保存数据到MySQL数据库
def save_data_to_mysql(data):
    connection = pymysql.connect(
        host='localhost',
        user='root',
        password='password',
        database='mock_data'
    )
    cursor = connection.cursor()
    # 创建表
    create_table_sql = """
    CREATE TABLE IF NOT EXISTS api_data (
        id INT AUTO_INCREMENT PRIMARY KEY,
        url VARCHAR(255) NOT NULL,
        response TEXT
    )
    """
    cursor.execute(create_table_sql)
    # 插入数据
    insert_sql = "INSERT INTO api_data (url, response) VALUES (%s, %s)"
    cursor.execute(insert_sql, (data['url'], json.dumps(data['response'])))
    connection.commit()
    cursor.close()
    connection.close()
# 接口请求函数:示例
@log_decorator
@save_data_decorator
def get_user_info(user_id):
    url = f"https://api.example.com/users/{user_id}"
    response = requests.get(url)
    return {
        'url': url,
        'response': response.json()
    }
# 测试接口调用
get_user_info(1)
get_user_info(2)

在上述示例代码中,我们定义了两个装饰器函数:log_decorator和save_data_decorator。log_decorator用于记录接口请求日志,save_data_decorator用于将接口请求数据保存到MySQL数据库。

然后,我们定义了一个接口请求函数get_user_info,并在该函数上应用了两个装饰器。通过装饰器的使用,每次调用get_user_info函数时,都会自动打印请求信息和响应结果,并将响应数据保存到MySQL数据库中。

你可以根据自己的实际需求,扩展和定制这些装饰器,添加更多的功能,例如接口鉴权、性能监控等。通过装饰器的灵活使用,可以大大提升接口自动化测试的效率和可维护性。

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

 

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

 资料获取方式 :

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

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

相关文章

SAP MM学习笔记26- SAP中 振替转记(转移过账)和 在库转送(库存转储)4- Plant间在库转送 之 在库转送Order(有出荷)

SAP 中在库移动 不仅有入库(GR),出库(GI),也可以是单纯内部的转记或转送。 1,振替转记(转移过账) 2,在库转送(库存转储) 1&#xff…

Web安全——信息收集下篇

Web安全 一、网络空间搜索引擎二、扫描敏感目录/文件1、御剑2、7kbstorm3、bbscan4、dirmap5、dirsearch6、gobuster7、网站文件 三、扫描网页备份四、网站头信息收集五、敏感文件搜索1、GitHub搜索2、Google-hacking3、wooyun漏洞库4、网盘搜索5、社工库6、网站注册信息7、js敏…

Vue学习笔记一(2019)

1.Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用…

【移动机器人】基于JADE改进差分算法的多AGV轨迹规划

最近帮同学做个东西,但是问题在于是之前从没接触过的领域–移动机器人轨迹规划,虽然也是搞机器人的,但是对 AGV 那边的情况是一无所知,这次能完成也算是挑战成功。此次任务目的是多辆AGV小车搬运货物,保证搬运总时间最…

Git学习part1

02.尚硅谷_Git&GitHub_为什么要使用版本控制_哔哩哔哩_bilibili 1.Git必要性 记录代码开发的历史状态 ,允许很多人同时修改文件(分布式)且不会丢失记录 2.版本控制工具应该具备的功能 1)协同修改 多人并行不悖的修改服务器端…

MinIO分布式存储k8s集群部署

一、MinIO是什么 MinIO是go开发的,高性能分布式存储;基于GNU AGPL v3开源,可免费使用; 官网:https://min.io/ github: https://github.com/minio/minio 官网宣传MinIO是世界上速度最快的分布式对象存储; …

Typora导出的PDF目录标题自动加编号

Typora导出的PDF目录标题自动加编号 在Typora主题文件夹增加如下文件后,标题便自动加上了编号: https://gitcode.net/as604049322/blog_data/-/blob/master/base.user.css 例如: 但是导出的PDF中,目录却没有编号: 这…

ConsoleApplication17_2项目免杀(Fiber+VEH Hook Load)

加载方式FiberVEH Hook Load Fiber是纤程免杀,VEH是异常报错,hook使用detours来hook VirtualAlloc和sleep,通过异常报错调用实现主动hook 纤程Fiber的概念:纤程是比线程的更小的一个运行单位。可以把一个线程拆分成多个纤程&#…

高可用集群介绍

一、高可用集群概念 高可用集群( High Availability Cluster, HA 集群),其中高可用的含义是最大限度地可以使用。从集群 的名字上可以看出,此类集群实现的功能是保障用户的应用程序持久、不间断地提供服务。当应用程序出现故障或…

XSSchallenge1-20

test1 第一题直接在test插入XSS代码即可 test2 第二关对内容进行”“包裹 这里可以采用”>来绕过 test3 代码审计发现这里用了htmlspecialchars函数&#xff0c;这个函数对<>和’ “等进行了转义&#xff0c;这里可以用事件来绕过 test4 这里用了str_replace&a…

vue+elementUI el-table实现单选

if (selection.length > 1) {this.$refs.table.clearSelection();this.$refs.table.toggleRowSelection(selection.pop());}

Kubernetes技术--k8s核心技术持久化存储

有时候需要在集群中进行一些重要的数据进行持久化存储,然后需要的时候再进行挂载,那么下面我们一起来看看如何实现数据的持久化存储操作。 1.nfs网络存储 -1.找一台服务器做nfs的服务端,安装nfs。(这里我们直接在master上实现)。 这里应该找再单独的搭建一个node节点做持…

Linux多线程同步机制(下)

文章目录 前言一、读写锁二、条件变量总结 前言 一、读写锁 多线程同步机制中的读写锁&#xff08;Read-Write Lock&#xff09;是一种特殊的锁机制&#xff0c;用于控制对共享资源的读写访问。读写锁允许多个线程同时读取共享资源&#xff0c;但在写操作时需要独占访问。 读…

2023年IT服务行业研究报告

第一章 行业概况 1.1 定义 IT服务行业是一个广泛的术语&#xff0c;涵盖了所有提供技术支持和服务的公司。这些服务包括系统集成&#xff0c;云计算服务&#xff0c;软件和硬件支持&#xff0c;网络服务&#xff0c;咨询服务&#xff0c;以及一系列其他类型的技术服务。此外&…

CodeFlow - 渐进式低代码开发管理工具(目前仅服务于前端)

CodeFlow 渐进式低代码开发管理工具 目前仅支持前端开发的使用。 简介 通过界面化操作&#xff0c;简化工作流程。 目前项目支持情况 前端 vue3 软件构想图 codeflow构想图.png 目前功能与界面 功能 前端Web 支持工程管理&#xff0c;将不同的项目归纳到一个工程下进行管理支持…

聊聊检索增强,LangChain一把梭能行吗?

背景 ChatGPT诞生之初&#xff0c;大家仿佛从中看到了未来&#xff1a;可以拿着大语言模型&#xff08;LLM&#xff09;这把锤子&#xff0c;锤遍业务上的钉子。其中最被看好的场景&#xff0c;莫过于搜索&#xff0c;不仅是微软、谷歌、百度这样的大公司将LLM用到自己的搜索业…

【ES6】Promise的入门介绍

Promise 是 JavaScript 中的一个对象&#xff0c;用于处理异步操作。Promise 对象代表一个最终可能完成&#xff08;并得到结果&#xff09;或失败&#xff08;并被拒绝&#xff09;的操作&#xff0c;以及其结果的值。 一个 Promise 有三种状态&#xff1a; Pending&#xf…

记录--vue 拉伸指令

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 在我们项目开发中,经常会有布局拉伸的需求,接下来 让我们一步步用 vue指令 实现这个需求 动手开发 在线体验 codesandbox.io/s/dawn-cdn-… 常规使用 解决拉伸触发时机 既然我们使用了指令的方式…

10.引入导航栏样式

1.导航栏为单独一个组件 在element-ui中引入导航栏的代码 &#xff01;注意 内容一定要在template中&#xff0c;否则bug遇到很久 <template><div><!-- 页面布局 --><el-container><!-- 侧边栏 --><el-aside width"200px"><…

模拟电子技术基础学习笔记二 杂质半导体

通过扩散工艺&#xff0c;在本征半导体中掺入少量合适的杂质元素&#xff0c;可得到杂质半导体。 按掺入的杂质元素不同&#xff0c;可形成N型半导体和P型半导体 控制掺入杂质元素的浓度&#xff0c;可以控制杂质半导体的导电性能。 一、N型半导体&#xff08;negative Semic…