我正在使用sqlite db编写一些Pytest代码,以测试一些逻辑。我设置了一个根级夹具来实例化数据库引擎:
class TestRbac:
@pytest.fixture(scope="class")
def setup_rbac_tables(self, sqlite_engine):
conn_engine = sqlite_engine.get_engine()
conn_engine.execute("attach ':memory:' as rbac")
Application.__table__.create(conn_engine)
Client.__table__.create(conn_engine)
Role.__table__.create(conn_engine)
session = sqlite_engine.get_session()
application = Application(id=1, name="test-application")
session.add(application)
session.flush()
client = Client(id=0, name="Test", email_pattern="")
session.add(client)
session.flush()
然后在我的测试课中,我有
def test_query_config_data_default(self, sqlite_engine, setup_rbac_tables, rbac):
conn_engine = sqlite_engine.get_engine()
session = sqlite_engine.get_session()
client = Client(id=1, name=factory.Faker("name").generate(), email_pattern="")
session.add(client)
session.flush()
clients = sqlite_engine.get_session().query(Client).all()
for client in clients:
print(client.id, client.name)
最后在那个班的测试中,我尝试了
Application
但是,仅打印一个客户端(如果我尝试使用period_to_seconds
,则不打印),我也不知道为什么。夹具范围是否有问题?还是引擎?还是sqlite在pytest中如何工作?
答案 0 :(得分:0)
我不是这方面的专家,但是我认为您需要以一种共享会话的方式定义固定装置,除非您打算在每个固定装置中提交。在setup_rbac_tables
中,使用函数作用域销毁了会话。当再次调用get_session时,将创建一个新的会话。
在我的pytest sqlalchemy测试中,我做这样的事情,其中db夹具是一个在夹具之间和测试中重复使用的db会话:
@pytest.fixture
def customer_user(db):
from ..model.user import User
from ..model.auth import Group
group = db.query(Group).filter(
Group.name == 'customer').first()
if not group:
group = Group(name='customer', label='customer')
user = User(email=test_email_fmt.format(uuid4().hex), group=group)
db.add(user)
return user