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

pytest后置处理方式

在 pytest 中,确保后置清理代码一定会执行(无论测试通过、失败还是发生异常),推荐使用以下两种最稳健的方式:


1. 使用yield的 fixture(推荐)

在 fixture 的yield之后编写清理代码,pytest 会在测试结束后自动运行这些代码,即使测试断言失败或抛出异常。

import pytest @pytest.fixture def db_connection(): # 前置:建立连接 conn = create_connection() yield conn # 后置:一定会执行(除非 fixture 前置阶段就挂了) conn.close() def test_query(db_connection): assert db_connection.query("SELECT 1") == 1

⚠️ 注意:如果yield之前的代码(建立连接)抛出了异常,那么yield之后的清理代码不会执行,因为 fixture 本身没有成功初始化。这是合理的——资源从未被成功获取,自然无需释放。


2. 使用request.addfinalizer

功能与yield类似,但以注册回调函数的方式显式声明清理逻辑。

import pytest @pytest.fixture def db_connection(request): conn = create_connection() def cleanup(): conn.close() request.addfinalizer(cleanup) # 注册后置函数 return conn

同样,addfinalizer注册成功后的清理函数一定会执行。


3. 在测试类或模块中使用传统teardown方法

适用于经典的 xUnit 风格,pytest 完全支持:

  • 方法级def teardown_method(self, method):

  • 类级def teardown_class(cls):

  • 模块级def teardown_module(module):

class TestDatabase: def setup_method(self): self.conn = create_connection() def teardown_method(self): self.conn.close() # 每个测试方法结束后一定会执行 def test_query(self): assert self.conn.query("SELECT 1") == 1

4. 如果需要“无论如何(即使 fixture 设置失败)都执行清理”

如果存在必须执行的全局资源回收(例如临时文件、进程等),可以在 fixture 中使用try/finally

@pytest.fixture def temp_file(): f = None try: f = open("/tmp/test.txt", "w") yield f finally: if f: f.close() # 或者无条件删除文件

但这种情况较少见,因为通常设置失败时资源尚未分配,无需清理。

方式是否保证后置执行备注
yieldfixture✅(前置成功时)最推荐,代码简洁
request.addfinalizer✅(前置成功时)与 yield 等价
teardown_*方法✅(对应作用域)适用于传统风格
try/finally✅(无条件)适合必须清理的场景
http://www.jsqmd.com/news/651848/

相关文章:

  • Blaster防作弊思路
  • 西安 GEO 优化收费标准解析与实施方案
  • 不止于初始化:在Vue3 + Cesium项目中配置ArcGIS底图、透明背景与交互事件的完整流程
  • 微信小程序 H5 预加载进阶:从原理到性能调优的完整实践
  • 2026年3月专业的焊接加工供应商推荐,机加工/焊接加工/大车床加工/大件加工/精密零件加工,焊接加工实力厂家口碑推荐 - 品牌推荐师
  • 深度学习异常检测Anomalib算法训练+推理+转化+onnx
  • 图像处理小白必看:低通、高通、带通、带阻滤波器到底怎么选?
  • 基于SQLite消息队列的微信机器人架构设计与实现
  • 终极指南:如何让Zotero在Word中引用更简单清晰
  • 2026摩擦电触觉传感器行业发展分析:技术迭代与市场新机遇
  • AI电商详情页生成落地指南(SITS2026内部验证版):5类高危失效场景+4个不可绕过的合规校验点
  • Prompt-Tuning不只是省参数:它在领域迁移和模型集成上居然这么强?
  • Vivado卸载程序不见了?别慌,用这个隐藏参数5分钟搞定(附SDK/HLS清理)
  • Vue3 + Element Plus 项目里,用 ECharts 5 画一个动态更新的班级数据看板
  • 10分钟极速语音克隆:RVC变声器完全指南
  • 【Cesium开发指南】Vue3 + Vite + TypeScript 一站式三维地球应用脚手架构建
  • Visual Studio+NXOpen避坑指南:UG二次开发中DLL生成与集成的5个关键步骤
  • 2026年3月树坑石厂商推荐,路沿石/火烧板/路牙石/树坑石/道牙石/花岗岩石材/蘑菇石/石材,树坑石厂家哪家靠谱 - 品牌推荐师
  • Python自动化:调用企业微信API高效发送邮件通知
  • 非遗文化|基于springboot + vue非遗传承文化管理系统(源码+数据库+文档)
  • 如何用高中物理知识理解质能方程E=mc²?一个通俗易懂的推导过程
  • 别再只会用GAN生成假脸了!CycleGAN实战:用Python把照片一键变成梵高画风
  • 华为项目管理实战指南:从理念到落地的79页精华解析
  • 又一个新项目开源,让 AI 帮你盯全网热点!
  • 备份(手机改成平板)
  • 终极指南:如何配置Jellyfin MetaShark插件实现完美中文影视元数据刮削
  • 微电网系列之PQ控制在并网与孤岛模式下的应用差异
  • SAP vs Oracle EBS:差旅费科目核算逻辑深度对比
  • Android开发者必备:5分钟搞懂fastboot刷机原理与实战命令
  • 鲁渝能源集成式无线充电:为AGV/AMR/RGV打造“隐形”能量枢纽