【发布时间】:2021-12-11 01:42:59
【问题描述】:
我想知道如何使用flask-sqlalchemy 和unittest 编写快速集成测试,而无需在每个测试中创建和删除表。我使用 Postgres 作为我的数据库。
现在,表分别在setUpClass 和tearDownClass 中创建和删除,从性能的角度来看这很好。我需要的是一种在每个单独的测试中删除所有数据并“重置”数据库的方法,而无需重新创建所有表。
我得到的最接近的是这段代码,但由于外键限制,它引发了IntegrityError。
def tearDown(self):
meta = db.metadata
for table in reversed(meta.sorted_tables):
db.session.execute(table.delete())
db.session.commit()
重要提示:由于我正在进行集成测试,我不可避免地会在我的应用程序代码中点击db.session.commit,这会使任何会话事务无效,因此我无法将其用作解决方案。
【问题讨论】:
-
您能否使用内存数据库,例如 H2 (h2database.com/html/main.html) 进行测试?它不一定与 postgres 完全兼容,但如果您只使用基本功能,它就足够了。如果没有,那么我建议您以确保没有冲突的方式编写测试。您可以在每次运行测试套件时生成唯一密钥,也可以在所有测试运行后清除数据库一次
标签: python sqlalchemy flask-sqlalchemy python-unittest