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
相关产品推荐
相关产品推荐

