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

时间:2014-09-02 12:34:39

标签: unit-testing h2

我们使用H2数据库来执行测试。要将每个测试与另一个测试隔离,将在每次测试之前删除并重新创建数据库模式和基本数据设置。

是否可以在首次设置数据库后创建还原点,并在每次测试之前还原此点的数据?

SCRIPT只创建一个包含所有表和数据的sql文件。与我们自己的初始化没什么大不同。

问题database restore to particular state for testing是相同的,仅适用于Oracle和Postgres。

1 个答案:

答案 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 OBJECTSTRUNCATE TABLE的脚本并执行所有初始数据的ALTER SEQUENCE (需要INSERT清理/恢复过程真的很快)。代码很麻烦但值得付出努力。