数据库恢复到特定状态以进行测试

时间:2011-02-18 10:48:14

标签: oracle postgresql integration-testing dbunit

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

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

(似乎DBUnit可以做到这一点,我还没有尝试过。)

单个测试涉及:

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

我们有5000多个测试,需要700个小时左右。 (我们在网格环境中进行,一夜之间完成)

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

6 个答案:

答案 0 :(得分:4)

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

我不知道Postgre是否有类似的功能。

答案 1 :(得分:4)

什么版本的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

这应该足以让你入门。如果您需要其他详细信息,请与我们联系。

答案 2 :(得分:2)

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

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

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

DROP DATABASE my_test_db;
CREATE DATABASE my_test_db WITH TEMPLATE my_template_db;

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

答案 3 :(得分:2)

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

我们有500个表,每次测试后都会恢复30个表,平均需要500毫秒。

用法非常简单:

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

问题

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

建议

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