【问题标题】:How do I prepare a rollback-friendly test datebase?如何准备回滚友好的测试数据库?
【发布时间】:2021-02-18 09:10:39
【问题描述】:

我有一个 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,一旦COMMIT; 执行,INSERT 操作就会持续​​到数据库中,从而使最终的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;

我当然可以对测试数据库进行完整备份,并在每次测试时恢复一次,但这会非常耗时,并且会大大减慢我们的开发周期。如何拥有一个易于回滚的测试数据库?

【问题讨论】:

    标签: postgresql testing transactions pytest rollback


    【解决方案1】:

    要么设计您的测试以便它们自行清理,要么创建一个模板数据库test_template 并在测试之间运行:

    DROP DATABASE testdb;
    CREATE DATABASE testdb TEMPLATE test_template;
    

    【讨论】:

      猜你喜欢
      • 2012-07-17
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多