cleanpy 0.1.3

Python 3.12+ 最佳实践知识库 - MCP 服务器
Documentation
---
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