目录
✅ 基本 fixture 示例:数据库连接模拟
? 运行测试
? fixture 作用域(scope)
? conftest.py:共享 fixture
✅ 总结关键点
首页 后端开发 Python教程 Python Pytest夹具示例

Python Pytest夹具示例

Jul 31, 2025 am 09:35 AM
java 编程

fixture 是用于为测试提供预设环境或数据的函数,1. 使用 @pytest.fixture 装饰器定义 fixture;2. 在测试函数中以参数形式注入 fixture;3. yield 之前执行 setup,之后执行 teardown;4. 通过 scope 参数控制作用域,如 function、module 等;5. 将共用 fixture 放在 conftest.py 中实现跨文件共享,从而提升测试的可维护性和复用性。

python pytest fixture example

在使用 pytest 进行测试时,fixture 是一个非常强大的功能,用于为测试函数提供预设的测试环境或数据。下面是一个简单但完整的 pytest fixture 示例,帮助你理解如何定义和使用 fixture。

python pytest fixture example

✅ 基本 fixture 示例:数据库连接模拟

假设我们要测试一个操作“用户数据”的模块,需要一个数据库连接对象。

# test_user.py

import pytest

# 模拟数据库
class Database:
    def __init__(self):
        self.users = {}

    def add_user(self, user_id, name):
        self.users[user_id] = name

    def get_user(self, user_id):
        return self.users.get(user_id)

    def clear(self):
        self.users.clear()

# 定义 fixture:提供一个干净的数据库实例
@pytest.fixture
def db():
    print("\n[Setup] 创建数据库实例")  # 可以看到执行顺序
    database = Database()
    yield database  # 返回给测试函数使用
    print("[Teardown] 清理数据库")
    database.clear()

# 测试用例使用 fixture
def test_add_user(db):
    db.add_user(1, "Alice")
    assert db.get_user(1) == "Alice"

def test_get_user_not_exists(db):
    assert db.get_user(99) is None

def test_add_multiple_users(db):
    db.add_user(1, "Alice")
    db.add_user(2, "Bob")
    assert len(db.users) == 2
    assert db.get_user(2) == "Bob"

? 运行测试

确保你已经安装 pytest:

python pytest fixture example
pip install pytest

运行测试:

pytest test_user.py -v

输出类似:

python pytest fixture example
test_user.py::test_add_user[Setup] 创建数据库实例
PASSED[Teardown] 清理数据库

test_user.py::test_get_user_not_exists[Setup] 创建数据库实例
PASSED[Teardown] 清理数据库

test_user.py::test_add_multiple_users[Setup] 创建数据库实例
PASSED[Teardown] 清理数据库

每个测试函数都会获得一个独立的 db 实例,因为 fixture 函数在每次测试前重新执行。


? fixture 作用域(scope)

你可以控制 fixture 的复用范围,比如让多个测试共享同一个实例:

@pytest.fixture(scope="module")
def db():
    print("\n[Module Setup] 创建数据库一次")
    database = Database()
    yield database
    print("[Module Teardown] 清理数据库一次")
    database.clear()
  • scope="function":默认,每个测试函数调用一次(最常见)
  • scope="class":每个测试类调用一次
  • scope="module":每个 .py 文件调用一次
  • scope="session":整个测试会话只执行一次

? conftest.py:共享 fixture

如果你有多个测试文件需要使用同一个 fixture,可以把它放在 conftest.py 中:

# conftest.py

import pytest

@pytest.fixture
def db():
    database = Database()
    yield database
    database.clear()

这样,所有同目录或子目录下的测试文件都可以直接使用 db,无需导入。


✅ 总结关键点

  • @pytest.fixture 装饰器定义可重用的测试资源
  • yield 之前是 setup,之后是 teardown
  • fixture 函数名作为参数传入测试函数,自动注入
  • 使用 conftest.py 实现跨文件共享 fixture
  • 可通过 scope 控制生命周期,提升性能

基本上就这些。fixture 让测试更干净、可复用、易维护。

以上是Python Pytest夹具示例的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Stock Market GPT

Stock Market GPT

人工智能驱动投资研究,做出更明智的决策

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

解决可选的常见Java NullPoInterException问题 解决可选的常见Java NullPoInterException问题 Aug 31, 2025 am 07:11 AM

Optional是Java8引入的容器类,用于明确表示一个值可能为空,从而避免NullPointerException;2.它通过提供map、orElse等方法简化嵌套null检查、防止方法返回null以及规范集合返回值;3.最佳实践包括仅用于返回值、避免字段或参数使用、区分orElse与orElseGet、不直接调用get();4.不应滥用Optional,如非空方法无需包装,流中应避免不必要的Optional操作;正确使用Optional能显着提升代码安全性与可读性,但需配合良好的编程习惯。

编辑Chrome的书签 编辑Chrome的书签 Aug 27, 2025 am 12:03 AM

Chrome书签编辑简单且实用,用户可通过快捷键Ctrl Shift O(Windows)或Cmd Shift O(Mac)进入书签管理器,也可通过浏览器菜单进入;1.编辑单个书签时,右键点击选择“编辑”,修改标题或网址后点击“完成”保存;2.批量整理书签时,可在书签管理器中按住Ctrl(或Cmd)多选书签,右键选择“移至”或“复制到”目标文件夹;3.导出和导入书签时,点击“整理”按钮选择“导出书签”保存为HTML文件,需要时再通过“导入书签”功能恢复。

输入键无法在我的键盘上工作 输入键无法在我的键盘上工作 Aug 30, 2025 am 08:36 AM

首先,checkforphysicalissueslikedebrisordamageandcleanthekeyboardestestesternone; 2.TestTheEnterKeyIndi​​fferentAppStoDeTermineIftheissueSueIssoftware; 3.RestyourComputerComputerComputerComputerComputorToreSolvetEmporaryGlitches; 4.disablestickykeys; 4.disablestickykeys,calter filtergleglekeys,ortogglek

Java中的内存泄漏是什么? Java中的内存泄漏是什么? Aug 28, 2025 am 05:37 AM

AmemoryleakinJavaoccurswhenunreachableobjectsarenotgarbagecollectedduetolingeringreferences,leadingtoexcessivememoryusageandpotentialOutOfMemoryError.Commoncausesincludestaticcollectionsretainingobjectsindefinitely,unclosedresourceslikestreamsorconne

什么是包装类课程,为什么在Java中使用它们? 什么是包装类课程,为什么在Java中使用它们? Sep 01, 2025 am 05:58 AM

Wrapperclassesareusedtoconvertprimitivedatatypesintoobjects,enablingtheiruseincollections,allowingnullvalues,providingutilitymethods,andsupportingautoboxing/unboxing.1.TheyallowprimitivestobeusedincollectionslikeArrayList,whichonlyacceptobjects.2.The

如何在Java中的流中找到最大或最小值 如何在Java中的流中找到最大或最小值 Aug 27, 2025 am 04:14 AM

使用max()和min()方法结合Comparator可找到流中的最大值和最小值,例如通过Comparator.naturalOrder()或Integer::compareTo比较基本类型;2.对于自定义对象,使用Comparator.comparing()基于特定字段比较,如Person::getAge;3.由于结果是Optional,必须处理空流情况,可使用isPresent()检查或orElse()提供默认值,推荐对基本类型使用IntStream等以避免装箱开销并提升性能,最终应始终妥善

CVE-2024-20674|Windows Kerberos安全功能绕过漏洞 CVE-2024-20674|Windows Kerberos安全功能绕过漏洞 Sep 02, 2025 pm 05:18 PM

0x00前言Kerberos由麻省理工学院创建,作为解决这些网络安全问题的解决方案。是一种通过网络提供安全验证处理的客户机/服务器体系结构。通过验证,可保证网络事务的发送者和接收者的身份真实。该服务还可以检验来回传递的数据的有效性(完整性),并在传输过程中对数据进行加密(保密性)。0x01漏洞描述拥有受害网络访问权限的攻击者可以通过建立中间(MITM)攻击或其他本地网络欺骗技术来利用此漏洞,然后向客户端受害者电脑发送恶意Kerberos消息,并假冒是Kerberos身份验证服务器。0x02CVE

如何使用DemalFormat在Java中格式化数字 如何使用DemalFormat在Java中格式化数字 Aug 30, 2025 am 03:09 AM

使用DecimalFormat可以精确控制数字格式。1.使用模式字符串如"#,###.##"进行基本格式化,其中#表示可选数字,0表示必显数字,,为千位分隔符,.为小数点;2.常见模式包括"0.00"保留两位小数、"0,000.000"补零对齐等;3.避免科学计数法可通过设置setScientificNotation(false)或使用足够位数的模式;4.可通过setRoundingMode()设置舍入模式,如HALF_UP、DOWN等

See all articles