Pytest Fixture 到底该用 return 还是 yield?

一、结论先给你

👉 Pytest fixture 有两种写法:

✅ 方式 1:return

python 复制代码
@pytest.fixture(scope="session")
def test_data():
    with open(data_path, 'r', encoding='utf-8') as f:
        return yaml.safe_load(f)

含义:

"只提供数据,不需要清理资源。"

适合你的场景:

  • 读 YAML
  • 读 JSON
  • 读配置文件
  • 加载静态测试数据

这是最常见、最简洁的写法。


二、什么时候要用 yield

当你需要在测试结束后做清理工作(teardown)时,才用 yield

例子:打开数据库连接

python 复制代码
@pytest.fixture(scope="session")
def db_conn():
    conn = connect_to_db()
    yield conn          # 👉 提供给测试使用
    conn.close()        # 👉 所有测试跑完后执行清理

结构可以记成:

复制代码
【准备】 → yield → 【清理】

三、用你的场景对比一下

✅ 你现在:加载测试数据

  • 不需要关闭文件
  • 不需要回滚
  • 不需要释放资源

👉 完全没必要用 yield,return 反而更干净。


四、可以把你的夹具改成 yield 吗?

可以,但没必要。

如果硬改成 yield,会变成这样:

python 复制代码
@pytest.fixture(scope="session")
def test_data():
    with open(data_path, 'r', encoding='utf-8') as f:
        data = yaml.safe_load(f)
    yield data

功能和 return 完全一样,只是写法更复杂。


五、一句话帮你记住(面试可用)

你可以这样回答面试官:

"如果 fixture 只提供数据,我用 return;

如果需要资源清理(如数据库、文件句柄、临时目录、浏览器驱动等),我用 yield。"

相关推荐
触底反弹1 小时前
🔥 2026 大模型选择指南:别再只看 Benchmark 了,这些维度才是关键!
人工智能·面试
Database_Cool_2 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森2 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
Database_Cool_3 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
醇氧3 小时前
CountDownLatch / CyclicBarrier / Semaphore 面试高频问答清单
前端·面试·职场和发展
姜太小白3 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
窝子面4 小时前
手搓最简前后端协作-node
javascript·数据库
我的xiaodoujiao4 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
吳所畏惧4 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh