Pytest Fixture 是什么?

Fixture 是什么?

Fixture 是 Pytest 测试框架的核心功能之一,用于为测试函数提供所需的依赖资源或环境。它的核心目标是:
提供测试数据(如模拟对象、数据库记录)
初始化系统状态(如配置、临时文件)
管理资源生命周期(自动清理,避免内存泄漏)

你可以把它想象成一个 “测试后勤管家” —— 在测试前准备好所需的一切,测试后自动打扫战场。


1. Fixture 的核心特点

特性说明
依赖注入测试函数通过参数声明需要的 Fixture,Pytest 自动注入
作用域控制可限定 Fixture 的生命周期(如每次测试/每个模块/整个测试会话只运行一次)
资源自动清理通过 yieldaddfinalizer 确保资源释放(如关闭文件、断开数据库)
复用性多个测试可共享同一个 Fixture,减少重复代码

2. 为什么需要 Fixture?

传统测试的痛点(无 Fixture)

def test_database_query():# 手动初始化资源conn = connect_db()  cursor = conn.cursor()# 测试逻辑cursor.execute("SELECT * FROM users")result = cursor.fetchall()assert len(result) > 0# 手动清理资源cursor.close()conn.close()  # 如果断言失败,可能跳过清理!

问题

  • 重复代码多(每个测试都要写初始化/清理逻辑)
  • 资源泄漏风险(测试失败时可能跳过清理)

使用 Fixture 的解决方案

@pytest.fixture
def db_connection():conn = connect_db()  # 初始化yield conn           # 返回资源conn.close()        # 无论测试成败,都会执行清理def test_query(db_connection):  # 自动注入result = db_connection.execute("SELECT * FROM users")assert len(result) > 0

优势

  • 代码复用:多个测试共享同一个 db_connection
  • 可靠清理yield 确保资源一定被释放
  • 声明式依赖:测试函数只需声明需要什么,无需关心如何创建

3. Fixture 的常见用途

场景示例
数据库连接初始化数据库,测试后回滚事务
临时文件/目录创建测试用的文件,测试后自动删除
模拟对象(Mock)替换真实服务(如 API、第三方库)
用户登录状态模拟已登录用户,避免每个测试重复登录逻辑
配置初始化加载测试专用的配置文件

4. Fixture 的工作原理

  1. 定义阶段:用 @pytest.fixture 标记一个函数(如 db_connection)。
  2. 请求阶段:当测试函数声明需要 Fixture(如 def test_query(db_connection)),Pytest 会:
    • 根据 Fixture 的 scope 决定是否重新运行或复用已有实例。
    • 执行 Fixture 函数到 yield 处(或 return),将结果注入测试函数。
  3. 清理阶段:测试完成后,执行 yield 之后的代码(或 addfinalizer 注册的函数)。
@pytest.fixture
def example_fixture():print("\nSetup")    # 测试前执行yield "resource"    # 注入测试函数print("\nTeardown") # 测试后执行def test_example(example_fixture):print(f"Testing with {example_fixture}")assert True

输出

Setup
Testing with resource
Teardown

5. 与传统 Setup/Teardown 的对比

FixturexUnit 风格(setup/teardown)
灵活性可动态选择依赖,支持嵌套固定作用于整个类/模块
复用性跨模块/类共享仅限当前类或模块
可读性声明式依赖(参数化)隐式依赖(需查看父类或 setup 代码)
资源清理通过 yield 确保执行需手动处理异常情况

6. 总结

  • Fixture 是 Pytest 的依赖注入系统,用于管理测试资源。
  • 核心价值:减少重复代码、确保资源清理、提升测试可维护性。
  • 关键功能:作用域控制、参数化、自动清理、嵌套依赖。

简单来说:Fixture 让你专注于测试逻辑本身,而不是繁琐的准备工作! 🛠️

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

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

相关文章

【深度剖析】流处理系统性能优化:解决维表JOIN、数据倾斜与数据膨胀问题

目录 前言:为什么你的流处理作业总是慢? 一、维表JOIN优化:从普通连接到高性能查询 1.1 时态表的双面性 1.2 Lookup Join 优化 1.3 多表JOIN优化策略 二、数据倾斜:单分区也会遇到的隐形杀手 2.1 单分区数据倾斜 2.2 热点键打散技术 2.3 时间窗口预聚合 三、数据…

Codeforces Round 1028 (Div. 2)(ABC)

A. Gellyfish and Tricolor Pansy 翻译: 水母和小花在玩一个叫 “决斗 ”的游戏。 水母有 a HP,花花有 b HP。 它们各有一个骑士。水母的骑士有 c HP,而花花的骑士有 d HP。 他们将进行一轮游戏,直到其中一方获胜。对于 k1、2、.…

数字创新智慧园区建设及运维方案

该文档是 “数字创新智慧园区” 建设及运维方案,指出传统产业园区存在管理粗放等问题,“数字创新园区” 通过大数据、AI、物联网、云计算等数字化技术,旨在提升园区产业服务、运营管理水平,增强竞争力,实现绿色节能、高效管理等目标。建设内容包括智能设施、核心支撑平台、…

缓存一致性协议的影响

在操作系统中,线程切换相比进程切换更轻量级的关键原因之一是 缓存(Cache)的有效性,尤其是对 CPU 缓存(如 L1/L2/L3)和 TLB(Translation Lookaside Buffer)的影响。以下从缓存角度详…

六月一日python-AI代码

python 运行 import turtle as t # 导入turtle库并简称为t,用于图形绘制 import random # 导入random库,用于随机数生成t.delay(0) # 设置绘图延迟为0,加快绘图速度 colors ["red", "blue", "gr…

58、辣椒种植学习

辣椒(学名:Capsicum annuum)属于茄科辣椒属,是一种重要的蔬菜兼调味作物,具有较高的经济价值和营养价值。其果实富含维生素C、辣椒素等成分,既可鲜食,也可加工成干辣椒、辣椒粉、辣椒酱等产品&a…

C语言进阶--程序的编译(预处理动作)+链接

1.程序的翻译环境和执行环境 在ANSI C标准的任何一种实现中,存在两种不同的环境。 第一种是翻译环境:将源代码转换为可执行的机器指令(0/1); 第二种是执行环境:用于实际执行代码。 2.详解编译链接 2.1翻译环境 程…

微调大模型:什么时候该做,什么时候不该做?

目录 一、什么是“微调”?你真的需要它吗? 二、什么时候不该微调? 🚫 不该微调的 5 个典型场景: 1. 通用问答、闲聊、常识类内容 2. 企业内部问答 / 文档助手 3. 想要通过微调“学会格式” 4. 没有大量高质量标…

微深节能 码头装卸船机定位与控制系统 格雷母线

微深节能码头装卸船机定位与控制系统:格雷母线技术赋能港口作业智能化升级 在现代化港口散货装卸作业中,装卸船机是连接船舶与陆域运输的核心枢纽设备。传统装卸船机依赖人工操作,存在定位偏差大、动态协同难、安全风险高等痛点。微深节能基于…

如何检查popover气泡组件样式?调试悬停元素CSS样式的解决方案

1. 问题 当我们要检查这种弹出层的CSS样式时,会发现特别棘手,因为鼠标移走就消失了。如果是display:none控制的,可能还能找到,如果是用js通过v-if控制的,就无法调试了。 2. 解决方案 使用 setTimeout debugger 就…

网络攻防技术一:绪论

文章目录 一、网络空间CyberSpace1、定义2、基本四要素 二、网络空间安全1、定义2、保护对象3、安全属性4、作用空间 三、网络攻击1、攻击分类2、攻击过程 四、网络防护1、定义2、安全模型3、安全服务5类4、特定安全机制8种5、普遍性安全机制5种 五、网络安全技术发展简史1、第…

彻底理解Spring三级缓存机制

文章目录 前言一、Spring解决循环依赖时,为什么要使用三级缓存? 前言 Spring解决循环依赖的手段,是通过三级缓存: singletonObjects:存放所有生命周期完整的单例对象。(一级缓存)earlySingleto…

【 SpringCloud | 微服务 网关 】

单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,这就存在一些问题: 每个微服务都需要编写登录校验、用户信息获取的功能吗? 当微服务之间调…

【前端面经】字节跳动一面

写在前面:面经只是记录博主遇到的题目。每题的答案在编写文档的时候已经有问过deepseek,它只是一种比较普世的答案,要学得深入还是靠自己 Q:三栏布局的实现方式(圣杯模型)如何实现 A: /* 整个 …

ST-GCN

1.bash 安装git 在目录下右键使用git bash打开 需要安装wgetbash download_model.sh,下载.sh文件 wget: command not found,Windows系统使用git命令 下载预训练权重_sh文件下载-CSDN博客 bash tools/get_models.sh 生成了三个.pt文件

计算机网络全维度解析:架构协议、关键设备、安全机制与新兴技术深度融合

计算机网络作为当今数字化社会的基石,其复杂性和应用广泛性远超想象。本文将从基础架构、协议体系、关键设备、安全机制到新兴技术,进行全方位、深层次的解析,并辅以实际应用场景和案例分析。 一、网络架构与分类的深度剖析 1.1 网络分类的立…

大语言模型的推理能力

2025年,各种会推理的AI模型如雨后春笋般涌现,比如ChatGPT o1/o3/o4、DeepSeek r1、Gemini 2 Flash Thinking、Claude 3.7 Sonnet (Extended Thinking)。 对于工程上一些问题比如复杂的自然语言转sql,我们可能忍受模型的得到正确答案需要更多…

黑马程序员C++核心编程笔记--3 函数高级

3.1 函数默认参数 本节内容之前已经整理过,详见22.函数的默认值 3.2 函数占位参数 C中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须补填该位置 语法: 返回值类型 函数名 (数据类型) {} 在现阶段函数的占位参数…

数据仓库分层 4 层模型是什么?

企业每天都在产生和收集海量数据。然而,面对这些数据,许多企业却陷入了困境:如何高效管理、处理和分析这些数据?如何从数据中提取有价值的信息来支持业务决策?这些问题困扰着众多数据分析师和 IT 管理者。 在众多架构…

Java正则表达式完全指南

Java正则表达式完全指南 一、正则表达式基础概念1.1 什么是正则表达式1.2 Java中的正则表达式支持 二、正则表达式基本语法2.1 普通字符2.2 元字符2.3 预定义字符类 三、Java中正则表达式的基本用法3.1 编译正则表达式3.2 创建Matcher对象并执行匹配3.3 常用的Matcher方法 四、…