Pytest Fixture 详解

news2025/6/7 1:49:48

Pytest Fixture 详解

Fixture 是 pytest 最强大的功能之一,用于提供测试所需的依赖资源(如数据库连接、临时文件、模拟对象等),并支持复用、作用域控制和自动清理。以下是全面详解:


1. 基本用法

定义 Fixture

使用 @pytest.fixture 装饰器定义:

import pytest

@pytest.fixture
def database_connection():
    conn = create_db_connection()  # 初始化资源
    yield conn                     # 返回资源,测试结束后执行清理
    conn.close()                   # 清理操作(yield 之后的部分)

使用 Fixture

在测试函数中作为参数传入:

def test_query_data(database_connection):
    result = database_connection.execute("SELECT * FROM users")
    assert len(result) > 0

2. Fixture 作用域(Scope)

通过 scope 参数控制 Fixture 的生命周期:

作用域说明使用场景
function每个测试函数运行一次(默认)轻量级资源(如临时变量)
class每个测试类运行一次类共享资源(如配置对象)
module每个测试模块(文件)运行一次全局配置(如日志初始化)
package每个测试包运行一次包级共享资源
session整个测试会话只运行一次昂贵资源(如数据库连接池)

示例

@pytest.fixture(scope="module")
def shared_config():
    return {"timeout": 30}

3. Fixture 的 Setup/Teardown

使用 yieldaddfinalizer 实现资源清理:

yield 方式(推荐)

@pytest.fixture
def temp_file():
    file = open("/tmp/test.txt", "w")
    yield file  # 测试中使用 file 对象
    file.close()  # 测试结束后关闭文件

addfinalizer 方式(更灵活)

@pytest.fixture
def temp_file(request):
    file = open("/tmp/test.txt", "w")
    def cleanup():
        file.close()
    request.addfinalizer(cleanup)  # 注册清理函数
    return file

4. Fixture 参数化

@pytest.mark.parametrize 对 Fixture 参数化:

@pytest.fixture(params=["user1", "user2", "admin"])
def user(request):
    return create_user(request.param)  # 根据参数生成不同用户

def test_user_permissions(user):
    assert user.has_permission("read")

5. 自动使用 Fixture(autouse)

设置 autouse=True,无需显式调用即可自动运行:

@pytest.fixture(autouse=True)
def setup_logging():
    logging.basicConfig(level=logging.INFO)  # 所有测试自动启用日志

def test_example():
    assert True  # 此测试会自动执行 setup_logging

6. Fixture 依赖注入

Fixture 可以依赖其他 Fixture:

@pytest.fixture
def db():
    return Database()

@pytest.fixture
def api_client(db):  # 依赖 db fixture
    return APIClient(db)

def test_api(api_client):
    response = api_client.get("/users")
    assert response.status_code == 200

7. 动态 Fixture

通过 request 对象动态调整 Fixture:

@pytest.fixture
def dynamic_data(request):
    marker = request.node.get_closest_marker("data")
    if marker:
        return marker.args[0]  # 获取测试标记的参数
    return {"default": 42}

@pytest.mark.data({"custom": 100})
def test_dynamic(dynamic_data):
    assert dynamic_data["custom"] == 100

8. 内置 Fixture

pytest 提供了一些常用内置 Fixture:

Fixture说明
tmp_path临时目录路径(pathlib.Path
tmpdir临时目录(Legacy py.path.local
capsys捕获 stdout/stderr
monkeypatch动态修改对象或环境变量
request访问测试上下文(如参数、标记)

示例

def test_tmp_file(tmp_path):
    file = tmp_path / "test.txt"
    file.write_text("Hello")
    assert file.read_text() == "Hello"

9. Fixture 覆盖与插件

覆盖 Fixture

conftest.py 中定义的 Fixture 可被当前目录及子目录的测试共享:

project/
├── conftest.py         # 定义全局 Fixture
├── tests/
│   ├── conftest.py     # 覆盖父级 Fixture
│   └── test_demo.py

Fixture 插件

通过插件扩展 Fixture(如 pytest-django 提供 django_db):

def test_django_model(django_db):
    user = User.objects.create(name="Alice")
    assert user.name == "Alice"

10. 最佳实践

  1. 将 Fixture 定义在 conftest.py 中以便复用。
  2. 避免 Fixture 逻辑过于复杂,保持单一职责。
  3. 优先使用 yield 而非 addfinalizer(代码更简洁)。
  4. scope 减少重复初始化(如数据库连接池用 session 作用域)。

通过灵活使用 Fixture,你可以实现:

  • 资源复用(减少重复代码)
  • 依赖管理(清晰表达测试需求)
  • 环境隔离(避免测试间干扰)

掌握后,测试代码会变得更简洁、可维护! 🚀

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

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

相关文章

力扣HOT100之二分查找:74. 搜索二维矩阵

这道题直接a了,我们可以参考上一道题:35.搜索插入位置的思路,详情见我的上一篇博客。将每一行的第一个元素当作一个数组中的元素,然后对这个数组进行二分查找,如果直接找到了target,则直接返回true&#xf…

编程技能:格式化打印04,sprintf

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:编程技能:格式化打印03,printf 回到目录…

R语言基础| 下载、安装

在此前的单细胞教程中,许多小伙伴都曾因为R语言基础不足而十分苦恼。R语言是一种开源的编程语言和软件环境,专门用于统计分析、图形表示和数据挖掘。它最初由Ross Ihaka和Robert Gentleman在1993年创建,旨在为统计学家和数据分析师提供一个广…

微软的新系统Windows12未来有哪些新特性

在今年即将到来的重大设计升级中,苹果计划对其全线操作系统统一按年份命名,作为另一巨头微软的win12还远吗?win11和win10是微软现在正在用的主流版本,win11系统发布于2021年6月24日,win10系统发布于2015年7月29日。预计win12尝鲜版可能在2025年下半年或明年。 尽管win12还…

在虚拟宇宙中低语——进程间通信,Linux命名管道的前世今生

文章目录 🌌 序章🌠 一、命名管道的宿命与哲学1.1、创建及简单使用1.2、命名管道的工作原理1.3、命名管道与匿名管道的区别 2、命名管道的特点及特殊场景2.1、特点2.2、四种特殊场景 3、命名管道实操3.1、实现文件拷贝3.2、实现进程控制 小结 &#x1f3…

STM32的ADC简介

一、ADC简介 STM32的ADC是一种12位逐次逼近型模拟数字转换器。它具备18个通道,能够测量16个外部信号源以及2个内部信号源。各通道的A/D转换可以执行单次、连续、扫描或间断模式。转换结果可采用左对齐或右对齐的方式(12位)存储于16位数据寄存…

Bash shell四则运算

文章目录 四则运算1. ‌expr 命令‌2. ‌$(( )) 表达式(推荐)‌3. ‌$[ ] 表达式(已弃用)‌4. ‌let 命令‌小数运算i 和 i 区别 四则运算 算术运算: - * / %(取模,求余数) Bash sh…

(javaSE)Java数组进阶:数组初始化 数组访问 数组中的jvm 空指针异常

数组的基础 什么是数组呢? 数组指的是一种容器,可以用来存储同种数据类型的多个值 数组的初始化 初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程。 数组初始化的两种方式:静态初始化,动态初始化 数组的静态初始化 初始化…

力扣刷题Day 70:在排序数组中查找元素的第一个和最后一个位置(34)

1.题目描述 2.思路 方法1(自己写的):一次二分查找找到等于target的一个元素索引axis,然后向左右延伸找边界。 方法2(灵茶山艾府佬的闭区间二分查找写法):定义一个lower_bound()函数找到第一个…

图片压缩工具 | 图片属性详解及读取解析元数据

ℹ️ 图片信息及属性 基本属性 格式类型:JPEG、PNG、GIF、WEBP、BMP、TIFF等文件大小:以KB、MB等为单位的存储空间占用创建/修改日期:文件的元数据时间戳 视觉属性 尺寸/分辨率 宽度(像素)高度(像素&…

C# Onnx 动漫人物人脸检测

目录 效果 模型信息 项目 代码 下载 参考 效果 模型信息 Model Properties ------------------------- stride:32 names:{0: face} --------------------------------------------------------------- Inputs ------------------------- name&am…

C++内存列传之RAII宇宙:智能指针

文章目录 1.为什么需要智能指针?2.智能指针原理2.1 RAll2.2 像指针一样使用 3.C11的智能指针3.1 auto_ptr3.2 unique_ptr3.3 shared_ptr3.4 weak_ptr 4.删除器希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 智能指针是 C 中用于自动…

PVE 虚拟机安装 Ubuntu Server V24 系统 —— 一步一步安装配置基于 Ubuntu Server 的 NodeJS 服务器详细实录1

前言 最近在基于 NodeJS V22 写一个全栈的项目,写好了,当然需要配置服务器部署啦。这个过程对于熟手来说,还是不复杂的,但是对于很多新手来说,可能稍微有点困难。所以,我把整个过程全部记录一下。 熟悉我…

TDengine 开发指南——高效写入

高效写入 本章内容将介绍如何发挥 TDengine 最大写入性能,通过原理解析到参数如何配置再到实际示例演示,完整描述如何达到高效写入。 为帮助用户轻松构建百万级吞吐量的数据写入管道,TDengine 连接器提供高效写入的特性。 启动高效写入特性…

Linux kill 暂停命令

暂停进程 kill -19 在一台服务器上部署了360Pika服务,先用RedisClient连接一下,可以连接 现在暂停进程 暂停后发现再次连接无法连接 恢复进程 kill -18 恢复后可连接

2.0 阅读方法论与知识总结

引言 本文将详细分析考研英语阅读做题步骤,并对方法论进行总结,最后通过真题练习巩固方法。 一、做题步骤 所有技巧都建立在精读真题的基础上!建议按以下节奏复习: 1️⃣ 做题 先看题干了解文章大致主旨(看看有没有…

5. Qt中.pro文件(1)

本节主要讲.pro文件的作用和一些相关基础知识与操作。 本文部分ppt、视频截图原链接:[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1 PRO文件 1.1 pro文件作用 添加需要用到的QT模块,如通过QT module_name来添加需要用到的Qt模块。指定生…

简数采集技巧之快速获取特殊链接网址URL方法

简数采集器列表页提取器的默认配置规则:获取a标签的href属性值作为采集的链接网址,对于大部分网站都是适用的; 但有些网站不使用a标签作为链接跳转,而用javascript的onclick事件替代,那列表页提取器的默认规则将无法获…

AI 如何改变软件文档生产方式?

现代软件工程中的文档革命:从附属品到核心组件的范式升级 在数字化转型浪潮席卷全球的当下,软件系统的复杂度与规模呈现指数级增长。据Gartner最新研究显示,超过67%的企业软件项目延期或超预算的根本原因可追溯至文档系统的缺陷。这一现象在…

激光干涉仪:解锁协作机器人DD马达的精度密码

在工业4.0的浪潮中,协作机器人正以惊人的灵活性重塑生产线——它们与工人并肩作业,精准搬运零件,完成精密装配。还能协同医生完成手术,甚至制作咖啡。 标准的协作机器人关节模组由角度编码器、直驱电机(DD马达)、驱动器、谐波减速…