pytest fixture 使用指南

pytest 的 fixture 是用于提供测试所需资源的核心机制,支持资源初始化、共享和清理。以下是详细使用方法:


目录

  1. 什么是 fixture?
  2. 定义 fixture
  3. fixture 作用域
  4. 测试函数使用 fixture
  5. fixture 参数化
  6. fixture 依赖注入
  7. 自动使用 fixture
  8. teardown 清理
  9. 共享 fixture
  10. 最佳实践

1. 什么是 fixture?

  • 用于准备测试环境(如数据库连接、临时文件)
  • 支持复用代码和资源管理
  • 通过依赖注入实现

2. 定义 fixture

使用 @pytest.fixture 装饰器定义:

import pytest

@pytest.fixture
def database_connection():
    conn = create_db_connection()  # 初始化资源
    yield conn                      # 返回资源
    conn.close()                    # 清理资源

3. fixture 作用域

通过 scope 参数控制生命周期:

作用域描述
function每个测试函数执行一次(默认)
class每个测试类执行一次
module每个模块执行一次
session整个测试会话执行一次
@pytest.fixture(scope="module")
def shared_resource():
    return expensive_initialization()

4. 测试函数使用 fixture

通过函数参数注入:

def test_query(database_connection):
    result = database_connection.query("SELECT 1")
    assert result == 1

5. fixture 参数化

使用 params 和 request.param:

@pytest.fixture(params=["sqlite", "postgresql"])
def db_type(request):
    return request.param

def test_db(db_type):
    print(f"Testing with {db_type}")

6. fixture 依赖注入

fixture 可以依赖其他 fixture :

@pytest.fixture
def user_session(database_connection):  # 依赖 database_connection
    return database_connection.login()

7. 自动使用 fixture

通过 autouse=True 自动执行:

@pytest.fixture(autouse=True)
def setup_logging():
    logging.basicConfig(level=logging.DEBUG)

8. teardown 清理

使用 yield 或 addfinalizer:

# 方法 1: yield
@pytest.fixture
def temp_dir():
    dir = create_temp_dir()
    yield dir
    remove_temp_dir(dir)

# 方法 2: addfinalizer
@pytest.fixture
def temp_dir(request):
    dir = create_temp_dir()
    request.addfinalizer(lambda: remove_temp_dir(dir))
    return dir

9. 共享 fixture

通过 conftest.py 文件共享:

  1. 创建conftest.py文件
  2. 在其中定义 fixture
  3. 同一目录及子目录的测试均可使用

10. 最佳实践

  1. 保持简洁:一个 fixture 只做一件事
  2. 合理命名:如 db_conn 优于 fixture1
  3. 优先小作用域:默认用 function,按需扩大
  4. 避免副作用:确保测试间隔离
  5. 谨慎参数化:避免组合爆炸

总结

fixture 是 pytest 的核心功能,通过合理使用可以:
✅ 减少重复代码
✅ 提升测试可维护性
✅ 优化测试执行效率

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐