加速LocalSessionFactoryBean dropDatabaseSchema,createDatabaseSchema

时间:2011-12-16 19:40:46

标签: hibernate spring junit hsqldb

我想知道如何加速我的单元测试。我正在使用JUnit,在每次测试之前,我正在删除数据库模式,然后重新创建它。由于我的架构有点大,考虑到我有超过1000次测试,这可能需要很长时间。

为了让您了解我的设置:   Spring 3 hibernate3.LocalSessionFactoryBean正在使用HSQL方言。   我正在使用JUnit的Suite运行器来运行类列表。

我注意到Spring有一个SpringJunit4ClassRunner,它理解Transaction注释,但不是套件注释。我解决了这个问题,现在正在尝试回滚,但它们似乎会导致无限递归,从而导致StackOverflow。

我对Spring来说相对较新,而且它很神奇,但我只是想知道是否有人对StackOverflow有任何想法,或者其他任何加速测试的想法?

也许我可以将文件写入DB的干净状态,并在每次测试后不断重新加载,但我不确定这是否可行。

提前致谢。

2 个答案:

答案 0 :(得分:3)

HSQLDB 2.2.6支持清除数据库模式中数据的语句。

   TRUNCATE SCHEMA PUBLIC AND COMMIT

请参阅此处的指南:

http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement

2.2.7及更高版本支持TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT

答案 1 :(得分:1)

如果花时间创建架构,请使用fredt提出的建议。

如果创建数据花费时间(而不是模式),那么我会寻求你的最终建议,创建一个用于所有测试的“标准”数据库,至少作为基础。这就是我在一些项目中所做的。

我的源代码树中有一个database.script文件。在我的测试设置@Before中,我将文件复制到临时目录中。我的弹簧配置指向此副本。该副本避免更改标准数据库。然后在@After中,我关闭,并删除文件[*]。如果您在任何地方都使用相同的代码,那么使用@Before@After会很痛苦,所以请查看ExternalResource,这是TestRule,允许您在之前/之后实施逻辑但是以一种很好的,有因素的方式。

如果我正在使用maven,则副本的目标通常是target / temp / something。这样,所有副本都会被mvn clean删除。

[*]这在linux下运行良好,但在windows下,文件有时无法删除,所以我要么将文件移动到临时名称,要么每次测试使用一个文件。您可以使用TestName规则获取名称。