pytest的fixture速查手册
已于 2026年03月10日 10:04 修改
访问次数:0
1️⃣ 定义与作用
- 定义:用 @pytest.fixture 装饰的函数,用来 准备测试环境或数据。
- 作用:提供测试数据、对象或状态执行 setup(测试前)和 teardown(测试后)支持依赖和复用改善测试函数可读性(减少重复代码)
2️⃣ Fixture 的使用方式
a. 基本用法
import pytest
@pytest.fixture
def sample_data():
return [1, 2, 3]
def test_sum(sample_data):
assert sum(sample_data) == 6
- 通过参数名 sample_data 自动注入 fixture。
b. 使用 yield 进行 teardown
@pytest.fixture
def resource_yield():
print("Setup: 打开资源")
res = {"conn": "数据库连接"}
yield res # yield 前是 setup
print("Teardown: 关闭资源")
res["conn"] = None
c. 使用 request.addfinalizer 进行 teardown
@pytest.fixture
def resource_finalizer(request):
print("Setup: 打开资源")
res = {"conn": "数据库连接"}
# 注册清理函数
def teardown():
print("Teardown: 关闭资源")
res["conn"] = None
request.addfinalizer(teardown)
return res
- 区别:yield:fixture 函数写成“生成器”,yield 前是 setup,yield 后是 teardown。addfinalizer:注册一个函数,在测试结束后执行 teardown。
d. 使用 fixture 的测试函数
def test_yield_fixture(resource_yield):
print("使用资源(yield):", resource_yield)
def test_finalizer_fixture(resource_finalizer):
print("使用资源(finalizer):", resource_finalizer)
执行顺序示意:
Setup: 打开资源
使用资源(yield): {'conn': '数据库连接'}
Teardown: 关闭资源
Setup: 打开资源
使用资源(finalizer): {'conn': '数据库连接'}
Teardown: 关闭资源
3️⃣ Fixture 范围(Scope)
| scope | 生命周期 | 使用场景 |
|---|---|---|
| function | 每个测试函数调用一次 | 每次测试独立数据 |
| class | 每个测试类调用一次 | 类级别共享资源 |
| module | 每个模块调用一次 | 模块级别共享数据 |
| session | 整个 pytest 会话调用一次 | 全局资源,如数据库连接 |
4️⃣ Fixture 的依赖
@pytest.fixture
def user():
return {"name": "Alice"}
@pytest.fixture
def admin_user(user):
user["role"] = "admin"
return user
def test_admin(admin_user):
assert admin_user["role"] == "admin"
assert admin_user["name"] == "Alice"
5️⃣ 自动使用 fixture
@pytest.fixture(autouse=True)
def setup_env():
print("自动 setup 环境")
- 设置 autouse=True 后,所有测试函数自动使用。
6️⃣ Teardown 与资源释放总结
- yield:yield 后代码自动执行
- request.addfinalizer:注册函数,测试结束后自动调用
- 注意:pytest 不会自动调用对象的 close(),需要在 teardown 中显式调用
💡 记忆口诀:
Fixture = 准备 + 注入 + Teardown@pytest.fixture → 定义参数名 → 自动注入yield / addfinalizer → 自动清理
评论(0)