一、结论先给你
👉 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。"