我们使用H2数据库来执行测试。要将每个测试与另一个测试隔离,将在每次测试之前删除并重新创建数据库模式和基本数据设置。
是否可以在首次设置数据库后创建还原点,并在每次测试之前还原此点的数据?
SCRIPT只创建一个包含所有表和数据的sql文件。与我们自己的初始化没什么大不同。
问题database restore to particular state for testing是相同的,仅适用于Oracle和Postgres。
答案 0 :(得分:1)
一个老问题,但我发现它仍然相关。 AFAIK没有恢复点支持。
这是一种简单而快速的备份/恢复方法。
在运行第一个测试之前创建一个备份:
def fill_filled()
每次测试后恢复:
Connection conn = DriverManager.getConnection("jdbc:h2:mem:myDatabase;DB_CLOSE_DELAY=-1;LOG=0");
Statement stat = conn.createStatement();
stat.execute("SCRIPT TO 'memFS:myDatabase.sql'");
stat.close();
conn.close();
请注意,Connection conn = DriverManager.getConnection("jdbc:h2:mem:myDatabase;DB_CLOSE_DELAY=-1;LOG=0");
Statement stat = conn.createStatement();
stat.execute("DROP ALL OBJECTS");
stat.close();
conn.close();
conn = DriverManager.getConnection("jdbc:h2:mem:myDatabase;DB_CLOSE_DELAY=-1;INIT=runscript from 'memFS:myDatabase.sql';LOG=0");
conn.close();
命令比SHUTDOWN
更快,但它导致了一些问题(连接池无法重新建立连接)。
我不会说上述方法很慢,远非如此。但是,由于上述方法需要一些时间,因此使用大型数据库和数千个测试仍有改进的余地。我设法实现了几倍快的备份/恢复(对于一个包含~350个表的数据库大约15ms),手动编写执行DROP ALL OBJECTS
,TRUNCATE TABLE
的脚本并执行所有初始数据的ALTER SEQUENCE
(需要INSERT
清理/恢复过程真的很快)。代码很麻烦但值得付出努力。