You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pytest类作用域fixture引用函数级session报ScopeMismatch的解决方法

可行实现方案(无需修改原有function级session作用域)

以下3种方案均符合pytest fixture作用域依赖规则,同时不影响原有单测用例的事务隔离逻辑:

方案1:改造类级数据准备fixture,直接依赖module级connection

原有connection fixture为module级作用域,生命周期长于class级,符合依赖规则,你可以在数据准备逻辑中临时创建会话完成操作:

# test_feature.py
from sqlalchemy.orm import Session

@pytest.fixture(scope='class')
def prepare_test_data(connection):
    session = Session(bind=connection)
    rs = session.execute("select user from user limit 10")
    # 此处编写你的测试数据更新逻辑
    session.commit()
    session.close()

@pytest.mark.usefixtures('prepare_test_data')
class TestNodeListResource:
    # 测试用例仍可正常使用原有function级session,事务隔离逻辑不变
    def test_sample_case(self, session):
        # 测试逻辑

方案2:新增专用class级session fixture

如果当前测试类的所有用例需要共享同一个会话,可单独定义class作用域的session,和原有function级session互不冲突:

# test_feature.py
@pytest.fixture(scope='class')
def class_session(connection):
    transaction = connection.begin()
    session = Session(bind=connection)
    yield session
    session.close()
    transaction.commit()

@pytest.fixture(scope='class')
def prepare_test_data(class_session):
    rs = class_session.execute("select user from user limit 10")
    # 测试数据准备逻辑

@pytest.mark.usefixtures('prepare_test_data')
class TestNodeListResource:
    # 测试用例可按需选择class_session或原有function级session

方案3:直接用connection执行原生SQL

如果数据准备不需要ORM能力,可直接调用connection执行SQL,逻辑更轻量:

@pytest.fixture(scope='class')
def prepare_test_data(connection):
    rs = connection.execute("select user from user limit 10")
    # 直接执行数据更新SQL
    connection.commit()

所有方案均不会改动原有function级session的逻辑,单测用例的自动提交、事务回滚能力保持不变。

内容的提问来源于stack exchange,提问作者Arul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:06:03