pytest中fixture使用指南
·
pytest fixture 使用指南
pytest 的 fixture 是用于提供测试所需资源的核心机制,支持资源初始化、共享和清理。以下是详细使用方法:
目录
- 什么是 fixture?
- 定义 fixture
- fixture 作用域
- 测试函数使用 fixture
- fixture 参数化
- fixture 依赖注入
- 自动使用 fixture
- teardown 清理
- 共享 fixture
- 最佳实践
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 文件共享:
- 创建
conftest.py文件 - 在其中定义
fixture - 同一目录及子目录的测试均可使用
10. 最佳实践
- 保持简洁:一个
fixture只做一件事 - 合理命名:如
db_conn优于fixture1 - 优先小作用域:默认用
function,按需扩大 - 避免副作用:确保测试间隔离
- 谨慎参数化:避免组合爆炸
总结
fixture 是 pytest 的核心功能,通过合理使用可以:
✅ 减少重复代码
✅ 提升测试可维护性
✅ 优化测试执行效率
更多推荐
所有评论(0)