我们使用Oracle(或postgres)数据库和应用程序服务器来执行集成测试。要将每个测试与另一个测试隔离,将在每次测试之前删除并重新创建数据库模式。
如您所见,这是一个耗时的过程。该应用程序使用100多个表。我们正在考虑编写自定义sql来从每个表中删除不需要的数据。有没有更好的方法来保存和恢复数据库状态?
(似乎DBUnit可以做到这一点,我还没有尝试过。)
单个测试涉及:
我们有5000多个测试,需要700个小时左右。 (我们在网格环境中进行,一夜之间完成)
大多数测试都使用较小的数据大小,例如最多10 MB。
答案 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)