当前位置: 首页 > news >正文

进阶知识:自动化测试框架开发之无参的函数装饰器

进阶知识:自动化测试框架开发之无参的函数装饰器

from functools import wrapsdef func_2(func):"""无参的函数装饰器:param func::return:"""@wraps(func)def wrap_func(*args, **kwargs):print('开始执行:'+ func.__name__)func(*args, **kwargs)print('执行完成:'+ func.__name__)return wrap_func@func_2
def func_1():"""业务函数:return:"""print('正在执行:'+func_1.__name__)# func_2() == func_2(func_1) ===> warp_func# func_1() == wrap_func()func_1()

一、代码执行顺序解析

1.1 完整执行流程

执行顺序图示:
定义装饰器func_2
↓
定义被装饰函数func_1(触发装饰器立即执行)
↓ 
调用func_1()↓ 
实际执行wrap_func()↓ 
执行wrap_func内部逻辑↓ 
调用原始func_1函数体

1.2 关键节点说明

执行步骤对应代码行说明
1def func_2(func):定义装饰器函数
2@func_2应用装饰器(此时立即执行func_2(func_1))
3func_1 = wrap_func原函数被替换为装饰器返回的wrap_func
4func_1()实际调用的是wrap_func()
5print(‘开始执行…’)执行装饰器添加的前置逻辑
6func(*args, **kwargs)调用原始func_1函数
7print(‘执行完成…’)执行装饰器添加的后置逻辑

二、代码逐行解析

2.1 装饰器定义部分

from functools import wrapsdef func_2(func):@wraps(func)  # 保留原函数元信息def wrap_func(*args, **kwargs):print('开始执行:'+ func.__name__)  # 前置操作func(*args, **kwargs)            # 执行原函数print('执行完成:'+ func.__name__) # 后置操作return wrap_func  # 返回包装后的函数
关键点说明:
  • @wraps(func):保持被装饰函数的原始信息(如__name__等)
  • *args, **kwargs:接受任意参数,保证装饰器通用性
  • func(*args, **kwargs):执行被装饰的原始函数

2.2 被装饰函数

@func_2  # 等价于 func_1 = func_2(func_1)
def func_1():print('正在执行:'+func_1.__name__) 

2.3 函数调用

func_1()  # 实际调用的是wrap_func()

三、执行逻辑必要性分析

3.1 解决的问题场景

场景传统实现方式装饰器实现优势
多个函数需要相同的前后处理逻辑每个函数内部重复写相同代码逻辑集中维护,避免代码重复
需要动态添加/移除功能模块需要修改函数源代码不修改原函数实现功能扩展
保持函数原始信息手动维护属性信息自动保留函数签名和文档

3.2 自动化测试中的典型应用

  1. 执行日志记录:自动记录用例执行开始/结束时间
  2. 异常捕获处理:统一处理断言失败截图
  3. 性能监控:统计用例执行耗时
  4. 权限校验:在执行前检查测试环境权限

四、执行流程详细拆解

4.1 代码加载阶段

Python解释器 func_2 func_1 wrap_func 定义装饰器函数 定义原始函数 @func_2触发装饰 返回包装函数 将func_1指向wrap_func Python解释器 func_2 func_1 wrap_func

4.2 函数调用阶段

测试代码 wrap_func 原始func_1 调用func_1() 执行前置打印 执行核心逻辑 返回结果 执行后置打印 测试代码 wrap_func 原始func_1

五、与传统实现的对比

5.1 无装饰器实现

def func_1():print('开始执行:func_1')print('正在执行:func_1')print('执行完成:func_1')def func_2():print('开始执行:func_2')print('正在执行:func_2')print('执行完成:func_2')

5.2 使用装饰器的优势

对比维度传统方式装饰器方式优势分析
代码复用性每个函数重复代码逻辑集中管理减少80%重复代码
维护成本修改需要调整所有函数只需修改装饰器降低维护难度
功能扩展性需要修改函数实现动态添加新功能实现开闭原则
代码可读性业务与辅助逻辑混杂关注点分离提升代码可维护性

六、工程实践建议

6.1 装饰器开发规范

  1. 始终使用@wraps:保持被装饰函数的元信息
  2. 使用*args和kwargs**:保证装饰器通用性
  3. 避免副作用:不要修改被装饰函数输入输出
  4. 合理命名:装饰器名称应体现功能特征

6.2 测试框架中的典型应用

def log_execution(func):""" 记录用例执行日志 """@wraps(func)def wrapper(*args, **kwargs):start = time.time()print(f"[{datetime.now()}] 开始执行用例:{func.__name__}")result = func(*args, **kwargs)print(f"用例执行耗时:{time.time()-start:.2f}s")return resultreturn wrapper@log_execution
def test_login():""" 登录测试用例 """# 核心测试逻辑

核心价值总结:装饰器通过AOP(面向切面编程)实现了业务逻辑与辅助功能的解耦,在自动化测试框架中能有效提升代码复用率(提升60%-80%),降低维护成本(减少50%的代码修改量),是构建可扩展测试框架的重要技术手段。


「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀

http://www.xdnf.cn/news/559495.html

相关文章:

  • 牛客网 NC14736 双拆分数字串 题解
  • MySQL的安装及相关操作
  • 150.WEB渗透测试-MySQL基础(五)
  • 张 推进对话式心理治疗:SOULSPEAK的聊天机器人
  • 多模态光学成像革命:OCT、荧光与共聚焦的跨尺度融合新范式
  • spark的缓存提升本质以及分区数量和task执行时间的先后
  • python学习day3
  • SpringSecurity基础入门
  • 深入解剖 G1 收集器的分区模型与调优策略
  • 8天Python从入门到精通【itheima】-20~22
  • 从零开始:Python语言基础之变量
  • 知识图谱构架
  • 从无标注的病理切片中自动提取临床相关的组织形态表型簇,探索其与患者预后、分子表型以及治疗反应的关联
  • HuggingFace全栈开发指南:从零构建AI应用的技术全景图
  • 【嵌入式】ESP32 Flash专题
  • java基础-异常
  • 2.前端汇总
  • 《初入苍穹:大一新手的编程成长之旅》
  • SpringBoot 项目实现操作日志的记录(使用 AOP 注解模式)
  • C++类与对象--6 特性二:继承
  • springMVC拦截器,拦截器拦截策略设置
  • 破解误区:WebView 调试常见认知误区与 WebDebugX 实践指南
  • AnyText2 在图片里玩文字而且还是所想即所得
  • V2X协议|如何做到“车联万物”?【无线通信小百科】
  • Hutool 常用工具类实战指南
  • selenium——基础知识
  • 数据一致性校验算法
  • 创建与管理MySQL数据库
  • Google精准狙击OpenAI Codex,发布AI编程助手Jules!
  • Fluent Bit持久化配置指南:保障日志不丢失的关键策略