【问题标题】:factoryboy pytest session managementfactoryboy pytest 会话管理
【发布时间】:2017-11-07 18:46:02
【问题描述】:

我正在使用 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 做到这一点?

【问题讨论】:

    标签: python unit-testing pytest factory-boy


    【解决方案1】:

    刚刚尝试了一个找到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
    

    【讨论】:

      猜你喜欢
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 2011-04-29
      • 2011-10-22
      • 2011-08-01
      • 2012-11-12
      • 2014-06-19
      相关资源
      最近更新 更多