【问题标题】:Restoring default MySQL state, like transactions but global.恢复默认 MySQL 状态,如事务但全局。
【发布时间】:2013-02-12 18:09:05
【问题描述】:

我正在尝试为基于 API 的服务构建一个测试环境。理想情况下,我希望每个测试都从一个默认数据库开始。

有趣的是,我想通过 API 触发写入、读取和更新,这将像任何其他正常的日子一样访问数据库。我只是想确定回滚这些更改的最佳方法。我知道事务,但这些事务似乎依赖于连接,由于 Web 应用程序的性质,我不能保证每个操作都会使用相同的连接。

我对此的第一次尝试可能涉及每次都导入整个数据库。我知道这会起作用,但它可能会很慢。

事务似乎可以工作,但我对以这种方式使用它们相对较新。

【问题讨论】:

    标签: mysql testing transactions rollback


    【解决方案1】:

    如果您确实需要验证测试数据是否已写入数据库,则不是您要查找的事务。您将永远无法看到尚未提交的事务。

    如果您这样做是为了对代码进行单元测试,并且您实际上不需要验证写入数据库中的数据,那么您应该创建一个数据库模拟来使用而不是真正的数据库。如果您需要实际验证数据库写入,并且如果您知道每个测试只会更改数据库中的几个表,那么您可能想要做的一件事是让 SQL 可用于删除/创建/填充关注的表,以便您可以在每次测试执行之前执行此操作,而不必处理 mysqldump 的完整导入。

    我之前合作过的一位测试人员采取了类似的方法,在他的测试数据库中创建模板表,并在每次测试运行之前复制每个适用表(使用 CREATE TABLE test_table LIKE template_tableINSERT INTO test_table SELECT * FROM template_table),然后将测试表放入每个测试的拆卸阶段。

    【讨论】:

    • 不幸的是,我试图对实际代码尽可能地轻描淡写,因此对表名等进行更改是不可取的。您启发我尝试复制每个表的数据out,然后在测试完成后恢复它。也许我什至可以简单地拥有多个模式并以这种方式删除它。我希望它会比完全重新加载相对更快。
    • @omgz0r 在任何情况下,您都需要在测试设置和拆卸时执行一些 SQL 命令。就个人而言,我喜欢在测试本身中执行一个完整的表删除、表创建、表插入 SQL 命令,因为这样您可以将实际的测试表结构检入到您的代码存储库中,并且开发人员可以在测试中根据需要修改 SQL当他们对测试表进行任何架构更改时,套件。我不太喜欢复制模板表并使用 INSERT ... SELECT * 查询的想法,因为如果数据库中的数据发生更改,测试可能会中断。
    猜你喜欢
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多