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。"

相关推荐
zh1570233 小时前
JavaScript中WorkerThreads解决服务端计算瓶颈
jvm·数据库·python
代码AI弗森3 小时前
一文理清楚“算力申请 / 成本测算 / 并发评估”
java·服务器·数据库
一只幸运猫.3 小时前
2026Java 后端面试完整版|八股简答 + AI 大模型集成技术(最新趋势)
人工智能·面试·职场和发展
摇滚侠4 小时前
expdp 查看帮助
java·数据库·oracle
流年似水~4 小时前
MCP协议实战:从零搭建一个让Claude能“看见“数据库的工具服务
数据库·人工智能·程序人生·ai·ai编程
2401_871492854 小时前
Vue.js监听器watch利用回调函数处理级联下拉框数据联动
jvm·数据库·python
志栋智能5 小时前
超自动化安全:构建智能安全运营的核心引擎
大数据·运维·服务器·数据库·安全·自动化·产品运营
zhoutongsheng6 小时前
C#怎么实现Swagger文档 C#如何在ASP.NET Core中集成Swagger自动生成API文档【框架】
jvm·数据库·python
WinterKay6 小时前
【开源】我写了一个轻量级本地数据库浏览工具,支持 MySQL/Redis 只读查询
数据库·mysql·开源
拾贰_C7 小时前
【Agent | openai | Streaming | 】流式输出Streaming
ubuntu·面试·prompt