Python factoryboy测试会话管理
我正在使用pytest作为测试我的应用程序的框架,我还想使用pytest factoryboy。Thusfar,我的conftest.py与示例非常相似: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
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)
返回示例工厂