---
topic: pytest_fixtures
title: Pytest Fixtures 使用
when_to_use: 需要设置测试夹具和共享测试数据时
keywords:
- fixtures
- pytest
- 测试数据
- setUp
---
# Pytest Fixtures 使用
## 基本 Fixtures
```python
# tests/conftest.py
import pytest
from my_project.database import Database
from my_project.users.models import User
@pytest.fixture
def database():
"""创建测试数据库。"""
db = Database(":memory:") # SQLite 内存数据库
db.create_tables()
yield db
db.close()
@pytest.fixture
def sample_user():
"""创建示例用户。"""
return User(name="Alice", email="alice@example.com")
@pytest.fixture
def sample_users():
"""创建多个示例用户。"""
return [
User(name="Alice", email="alice@example.com"),
User(name="Bob", email="bob@example.com"),
User(name="Charlie", email="charlie@example.com"),
]
# 使用 fixtures
def test_user_in_database(database, sample_user):
"""测试用户可以保存到数据库。"""
database.save(sample_user)
retrieved = database.get_user(sample_user.id)
assert retrieved.name == sample_user.name
assert retrieved.email == sample_user.email
```
## Fixture 作用域
```python
@pytest.fixture(scope="function") # 默认:每个测试
def function_fixture():
return "function"
@pytest.fixture(scope="class") # 每个测试类
def class_fixture():
return "class"
@pytest.fixture(scope="module") # 每个模块
def module_fixture():
return "module"
@pytest.fixture(scope="session") # 每个测试会话
def session_fixture():
return "session"
```
## 参数化 Fixtures
```python
@pytest.fixture(params=["chrome", "firefox", "safari"])
def browser(request):
return request.param
def test_browser_compatibility(browser):
# 测试将对每个浏览器运行
assert browser in ["chrome", "firefox", "safari"]
```
## 相关链接
- [Pytest Fixtures 文档](https://docs.pytest.org/en/latest/how-to/fixtures.html)