【问题标题】:database restore to particular state for testing数据库恢复到特定状态进行测试
【发布时间】:2011-02-18 10:48:13
【问题描述】:

我们使用 Oracle(或 postgres)数据库和应用服务器来执行集成测试。为了将每个测试与另一个测试隔离开,在每个测试之前删除并重新创建数据库模式。

如您所见,这是一个耗时的过程。该应用程序使用 100 多个表。我们正在考虑编写自定义 sql 以从每个表中删除不需要的数据。有没有更好的方法来保存和恢复数据库状态?

(看来DBUnit可以做到,我还没试过。)

单个测试涉及:

  • 创建数据库架构。
  • 启动应用服务器。
  • 启动多个客户端应用程序。
  • 执行并验证。

我们有 5000 次奇怪的测试,需要 700 小时左右。 (我们在网格环境中完成,一夜之间完成)

大多数测试使用较小的数据大小,例如最多 10 MB。

【问题讨论】:

    标签: oracle postgresql integration-testing dbunit


    【解决方案1】:

    Oracle Flashback 允许您使用简单的 SQL 查询在指定时间点恢复表。 该文档在here 可用。

    不知道Postgre有没有类似的功能。

    【讨论】:

    • 您从使用 Oracle 闪回中看到了什么样的性能?
    【解决方案2】:

    什么版本的 Oracle(企业 10g+ 或标准)?假设您使用的是 Enterprise,则可以使用 Flashback 数据库。你建立你的基线数据库。那么

    create a guaranteed restore point
    run your test
    capture results somewhere outside the database
    flashback database to restore point
    start over
    

    这应该足以让您入门。如果您想了解更多详细信息,请告诉我。

    【讨论】:

      【解决方案3】:

      对于 PostgreSQL,我认为使用模板数据库比单独重新创建所有表要快。

      只需创建一个名称与您通常使用的名称不同的新数据库(例如 my_template_db),但包含您需要的所有表。您也可以将 testdata 放在那里。

      运行测试时,删除要测试的数据库。然后使用模板重新创建测试。

      删除数据库 my_test_db; 使用模板创建数据库 my_test_db;

      9.0 中有一些优化可以加快这一速度。所以也许这种方法比通过 SQL 重新创建所有表更快。

      【讨论】:

        【解决方案4】:

        对于 Oracle,您可以使用这个 pl/sql 包: snapshot.sql

        我们有 500 个表,其中 30 个在每次测试后恢复,平均需要约 500 毫秒。

        使用极其简单:

        EXECUTE SNAPSHOT.TAKE_SNAPSHOT('snapshot name');
        EXECUTE SNAPSHOT.RESTORE_SCHEMA('snapshot name');
        

        【讨论】:

          【解决方案5】:

          如果每个测试都适合单个事务,您可以简单地回滚。这是一个选项吗?

          【讨论】:

          • 这取决于。一般来说,我不建议这样做。某些操作仅在尝试提交事务时发生。进行自动回滚可能会监控当时发生的问题。
          • 我们使用延迟约束等特性,这使得调用提交变得很重要。是的,测试可以使用您的方法
          【解决方案6】:

          问题

          • 我们在谈论什么样的数据库?
          • 是 Multi-T 大小还是只有几个 G?
          • 里面有多少数据?
          • 如何定义约束?
          • 这应该多快完成?
          • 您的测试需要多长时间? (几天或几周)
          • 有多少可用存储空间?
          • 测试期间进行了多少更新?
          • 你有什么版本的数据库?

          建议

          • 如果您有足够的存储空间但更新不多,请尝试使用闪回数据库。
          • 如果您在 prod 数据库的副本上进行测试,请使用克隆(当然还有数据屏蔽)(对于 prod 备份也是一个很好的测试)。
          • 如果您有一个不错的测试数据库,其中包含有价值的测试数据,请使用备份/恢复。
          • 如果您有一个 11g 版本的数据库,并配置了物理备用数据库,您可以尝试在快照数据库上进行测试。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-12-18
            • 1970-01-01
            • 1970-01-01
            • 2013-05-19
            • 1970-01-01
            • 2016-01-12
            相关资源
            最近更新 更多