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

相关推荐
weedsfly4 分钟前
栈和堆:JavaScript 内存的“旅馆”和“仓库”
前端·javascript·面试
SamDeepThinking17 分钟前
函数式编程:用BiFunction消除多类型分支的代码重复
java·后端·面试
倔强的石头_14 小时前
《Kingbase护城河》——猎捕慢查询:执行计划的微观解析与索引调优实战
数据库
SelectDB16 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
Ruihong18 小时前
Vue withDefaults 转 React:VuReact 怎么处理?
vue.js·react.js·面试
kyriewen19 小时前
别再这样写 async/await 了:我在 Code Review 中见过最多的 8 个错误
前端·javascript·面试
烬羽1 天前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
云技纵横1 天前
一个 @Async,把 @Transactional 的事务边界打穿了
后端·面试
想要成为糕糕手1 天前
Harness Engineering:大模型时代的“马鞍”——从记忆层开始,让AI真正为你所用
面试·ai编程·claude
kyriewen2 天前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试