首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Pytest Fixture:我 teardown 呢?—— 被我用猴子补丁 "藏起来" 了

Pytest Fixture:我 teardown 呢?—— 被我用猴子补丁 "藏起来" 了

作者头像
小田测测看
发布2026-06-17 17:56:26
发布2026-06-17 17:56:26
590
举报

分享一个在实际测试过程中遇到的一个问题,想保留已有 Fixture 的setup逻辑,但临时跳过其teardown部分(且不修改原 Fixture 代码,为啥不修改呢,哎,别提了要修改那可是一大堆呀),可通过一个叫猴子补丁(Monkey Patching)结合 Pytest 的pytest_configure钩子实现

原理

Pytest 的 Fixture 执行过程中,teardown逻辑(即yield之后的代码)由_pytest.fixtures.FixtureDef类的finish方法触发。我的核心思路是:在 Pytest 初始化阶段(通过pytest_configure钩子),用自定义的patched_finish方法 “替换” 原始的finish方法。当检测到目标 Fixture 时,直接返回不执行原始finish(跳过teardown);非目标 Fixture 则正常执行原逻辑,确保不能影响其它用例。

实现如下:

如图所示有一个myfixture的fixture

代码语言:javascript
复制
@pytest.fixture(autouse=True)
def my_fixture():
    print("setup fixture")
    yield
    print("teardown fixture")

正常跑用例,这货每次都要喊 "teardown fixture",现在想让它关键时刻装哑巴。孙行者,快收了神通吧!下面直接上神秘的咒语

代码语言:javascript
复制
# conftest.py
import pytest

@pytest.fixture(autouse=True)
def my_fixture():
    print("setup fixture")
    yield
    print("teardown fixture")

# 保存原始方法
_original_fixture_finalizer = None

def patch_pytest_fixtures():
    """猴子补丁 pytest 的 fixture 执行逻辑"""
    global _original_fixture_finalizer
    from _pytest import fixtures
    _original_fixture_finalizer = fixtures.FixtureDef.finish
    
    def patched_finish(self, request):
        fixture_name = getattr(self, 'func', None)
        if fixture_name andhasattr(fixture_name, '__name__'):
            if fixture_name.__name__ in ("my_fixture",):
                print(f"跳过 fixture '{fixture_name.__name__}' 的 teardown")
                return
        return _original_fixture_finalizer(self, request)
    fixtures.FixtureDef.finish = patched_finish

def pytest_configure(config):
    patch_pytest_fixtures()

实际执行结果如下

可以发现teardown部分没有被打印想恢复也是如此简单,注释掉pytest_configure即可

要了解更多猴子补丁用法的,查阅 MonkeyPatch 类的文档即可

#Pytest

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程拾光 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原理
  • 实现如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档