pytest fixture与conftest分层共享机制详解
请详细解释pytest中fixture的作用域(scope)、自动使用(autouse)、依赖注入及teardown机制,以及conftest.py的分层共享原理。
回答
屠龙少年
fixture基础:
import pytest
@pytest.fixture
def db_connection():
conn = create_connection() # setup
yield conn # 提供fixture值
conn.close() # teardown
作用域(scope):
function(默认):每个测试函数调用一次class:每个测试类调用一次module:每个模块调用一次session:整个测试会话仅调用一次
自动使用(autouse):@pytest.fixture(autouse=True)自动应用于所有测试,无需显式注入,适合环境准备、清理。
依赖注入:fixture可自动注入到测试函数的参数中,fixture也可依赖其他fixture:
@pytest.fixture
def user(db_connection):
return create_user(db_connection)
def test_login(user):
assert user.is_active
conftest.py分层共享:
- 放在测试目录中的
conftest.py定义的fixture对该目录及子目录所有测试可见 - 根目录的conftest定义全局fixture
- 子目录conftest可覆盖父级fixture
- 可用于注册pytest插件钩子(hooks)、配置自定义命令行参数
- 适合共享数据库连接、客户端实例、测试数据