factoryboy pytest会话管理

时间:2017-11-07 18:46:03

标签: python unit-testing pytest factory-boy

我使用pytest作为测试我的应用程序的框架,我也想使用pytest factoryboy。因此,我的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)

我有这样的多个工厂。问题是,当我以这种方式使用工厂时,每次单元测试都不会拆除会话。我基本上使用一个大会话来进行我所进行的大量单元测试。不是很理想。使用灯具我可以在每个单元测试中刷新会话。有没有办法使用factoryboy pytest来做到这一点?

1 个答案:

答案 0 :(得分:0)

刚刚尝试了一个找到here的解决方案,它可以很好地完成工作而不会太复杂或太脏:将每个工厂包装到一个夹具中,该夹具具有另一个功能范围的session夹具。

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

@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