如何解决如何准备回滚友好的测试数据库?
我有一个 PostgreSQL 数据库,里面装满了假数据,用于使用 pytest 进行自动化测试。基本上,我将针对测试数据库运行每个测试,检查结果,回滚所有内容以便测试环境不会改变,然后运行下一个测试,依此类推。出于显而易见的原因,被测应用程序代码(它是 Flask 应用程序 FWIW)涉及许多对 BEGIN
/COMMIT
,我不想改变这一点。
目前,我的灯具看起来像
@pytest.fixture
def app():
app = create_app(TestConfig)
app.config["TESTING"] = True
cur = app.db_postgres.cursor()
cur.execute("BEGIN")
with app.app_context():
yield app
cur.execute("ROLLBACK")
我试图解决事务的问题,但 PostgreSQL 13 似乎不支持自治事务。更具体地说,第二个 COMMIT;
给了我一个 WARNING: there is already a transaction in progress
,一旦 INSERT
被执行,COMMIT;
操作就会持久化到数据库,呈现最终的 ROLLBACK;
没用。
-- Setup
BEGIN;
-- Application code can do whatever they want
BEGIN;
INSERT INTO test_foo(bar) VALUES (42);
COMMIT;
SELECT bar FROM test_foo; -- assert the result is 42
-- Teardown
ROLLBACK;
我当然可以对测试数据库进行完整备份并为每个测试恢复一次,但这会很耗时,并且会大大减慢我们的开发周期。如何拥有一个易于回滚的测试数据库?
解决方法
设计您的测试以便它们自行清理,或者创建模板数据库 test_template
并在测试之间运行:
DROP DATABASE testdb;
CREATE DATABASE testdb TEMPLATE test_template;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。