在 SQLAlchemy 应用程序的单元测试中使用 Alembic?

plu*_*mPy 7 python integration-testing unit-testing sqlalchemy alembic

我有一个 ORM 应用程序,它使用 SQLAlchemy、Alembic 进行迁移,使用 Pytest 进行测试。在我的测试中,我有一个数据库作为固定装置。在使用迁移之前,我曾经删除所有表并为每个测试会话重新创建它们。

现在我正在使用迁移,我也想使用 Alembic 来创建我的装置,因为我相信它可以更接近地模拟生产环境。(这是一个很好的理由吗?)

一种方法是每次downgrade()都从上到下upgrade()。我真的不喜欢这个。我可能错了。

另一种方法是进行drop_all()单元create_all()测试,只需编写另一个测试,用 head 标记数据库并测试upgradeand downgrade

是否有另一种好的/标准方法将迁移与固定装置集成,这样我就不必使用drop_tables

或者有没有办法在drop_tables将数据库标记为“尾部”或空之后?如果没有明确使用修订版 0 的迁移哈希,则会导致创建依赖项,类似的事情alembic downgrade -1会使其返回到第 0 年。谢谢。

uni*_*rio 5

我建议每次启动一个临时数据库实例,例如使用testing.mysqldtesting.postgresql。这种方法的优点是保证您每次都能重新开始;测试的成功不取决于外部因素。缺点是启动实例需要额外的几秒钟时间。

如果您坚持使用现有的数据库实例,您可以像您所说的那样使用create_all()+ alembic stamp head。但是,不必执行 操作drop_all(),只需删除整个数据库(或模式,对于 PostgreSQL 而言)并重新创建它。

如果你坚持使用drop_all(),你可以删除该alembic_version表来告诉alembic当前版本是“tail”。

  • 只是路过而已。test.postgresql 自 2016 年以来一直没有更新。https://pypi.org/project/pytest-postgresql/ 仍然维护。 (3认同)
  • 供将来参考:“alembic 降级基础”http://alembic.zzzcomputing.com/en/latest/tutorial.html#downgrading (2认同)