Python factoryboy测试会话管理

Python factoryboy测试会话管理,python,unit-testing,pytest,factory-boy,Python,Unit Testing,Pytest,Factory Boy,我正在使用pytest作为测试我的应用程序的框架,我还想使用pytest factoryboy。Thusfar,我的conftest.py与示例非常相似: import factory from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker from model import model engine = create_engine('sqlite://') ses

我正在使用pytest作为测试我的应用程序的框架,我还想使用pytest factoryboy。Thusfar,我的conftest.py与示例非常相似:

import factory
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from model import model

engine = create_engine('sqlite://')
session = scoped_session(sessionmaker(bind=engine))

# Create tables
model.Base.metadata.create_all(engine)

class ExampleFactory(factory.alchemy.SQLAlchemyModelFactory):

    class Meta:
        model = model.ExampleClass
        sqlalchemy_session = session

    label = factory.Sequence(lambda n: u'object_%d' % n)

我有很多这样的工厂。问题是,当我以这种方式使用工厂时,会话不会在每个单元测试中被中断。我基本上使用了一个大型会话来进行大量的单元测试。不太理想。使用fixture,我可以在每次单元测试时刷新会话。有没有办法使用factoryboy pytest实现这一点?

刚刚尝试了一个解决方案,该解决方案可以很好地完成这项工作,而不会太复杂或太脏:将每个工厂包装到一个夹具中,该夹具提供了一个其他功能范围的
会话
夹具

这对您来说可能是这样的:

@pytest.fixture
def session():
    session = <session creation>
    yield session
    session.rollback()
    session.close()

@pytest.fixture
def exemple_factory(session):
    class ExampleFactory(factory.alchemy.SQLAlchemyModelFactory):

        class Meta:
            model = model.ExampleClass
            sqlalchemy_session = session

        label = factory.Sequence(lambda n: u'object_%d' % n)

    return ExampleFactory
@pytest.fixture
def会话():
会话=
收益期
会话。回滚()
session.close()
@pytest.fixture
def示例工厂(会话):
类示例工厂(factory.alchemy.SQLAlchemyModelFactory):
类元:
model=model.ExampleClass
sqlalchemy_会话=会话
label=factory.Sequence(lambda n:u'object\uud%n)
返回示例工厂