2

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

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

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

单个测试涉及:

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

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

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

4

6 回答 6

4

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

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

于 2011-02-18T10:57:45.427 回答
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

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

于 2011-02-18T15:15:58.477 回答
2

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

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

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

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

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

于 2011-02-18T11:40:40.733 回答
2

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

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

用法非常简单:

EXECUTE SNAPSHOT.TAKE_SNAPSHOT('snapshot name');
EXECUTE SNAPSHOT.RESTORE_SCHEMA('snapshot name');
于 2015-04-07T11:35:22.273 回答
1

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

于 2011-02-18T11:00:49.303 回答
1

问题

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

建议

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