使用 pytest 和 sqlalchemy 进行会话处理

问题描述 投票:0回答:1

对于每个单元测试,我想使用

pytest.fixture
scoped_session
回滚已经提交的语句。

设置

  • python 3.11
  • sqlalchemy==2.0.3
  • pytest==7.2.1
  • 工厂男孩==3.2.1
  • fastapi==0.91.0

实施

conftest.py

  • 引擎只需使用
    engine = create_engine(DATABASE_URL)
  • 创建即可 如果数据库不存在,则使用
  • init_database
     创建数据库
    
    sqlalchemy
工厂.py

import pytest from sqlalchemy_utils import drop_database from database_test_setup.manage import Session @pytest.fixture(scope="session") def db_engine(): from settings import settings from database import engine, init_database, DATABASE_URL init_database(user=settings.DB_USER, pwd=settings.DB_PWD, host=settings.DB_HOST, port=settings.DB_PORT, db_name=settings.DB_NAME) Session.configure(bind=engine) yield engine drop_database(DATABASE_URL) engine.dispose() @pytest.fixture(scope="function", autouse=True) def db_session(db_engine): session_ = Session() session_.begin_nested() yield session_ session_.rollback()
    是一个简单的SQLAlchemy模型
  • Order
管理.py
from factory import Sequence
from factory.alchemy import SQLAlchemyModelFactory

from database_test_setup.manage import Session
from order.models import Order


class BaseFactory(SQLAlchemyModelFactory):
    """Base Factory."""

    class Meta:
        """Factory configuration."""
        abstract = True
        sqlalchemy_session = Session
        sqlalchemy_session_persistence = "flush"


class OrderFactory(BaseFactory):
    id = Sequence(lambda n: n)
    quality = "X"
    start_date = "2021-09-15T17:53:00"
    end_date = "2021-09-15T15:53:00"

    class Meta:
        model = Order

问题
当我在测试中使用 

from sqlalchemy.orm import scoped_session, sessionmaker Session = scoped_session(sessionmaker())

夹具提交语句时,该语句不会受到

db_session

 的影响。
如果我在我的 
session_.rollback
 中设置 
sqlalchemy_session_persistence = "commit"
,情况也是如此。
我知道这个问题之前已经被
回答过

,但建议的解决方案似乎对我不起作用,即使我使用相同的设置,除了使用单独的模块来创建

SQLAlchemyModelFactory而不是要使用的固定装置另外在我的scoped_session


我也有同样的问题。看起来,
python unit-testing sqlalchemy pytest
1个回答
0
投票
。您必须添加一个事务子层并将其回滚。 我的固定装置看起来像这样:

SQLAlchemyModelFactory


© www.soinside.com 2019 - 2024. All rights reserved.