Nhibernate Nunit - 在测试用例之间清除数据库

时间:2010-11-16 10:57:56

标签: performance nhibernate nunit

我们有一个相当广泛的测试套件,需要永远执行。 每次测试完成后,需要清空数据库(MSSQL),以便下一个测试用例是新鲜的。 我们这样做的方法是暂时删除所有外键,TRUNCATE'ing所有表,然后重新添加FK。

根据NHProfiler的说法,这一步骤需要2-3秒。似乎所有的时间都花在了FK的运作上。

我们目前的方法显然不是最佳方法,但我们应该采用哪种方式来改善性能?与FK删除/添加的操作数相比,实际从DB中删除的元素数量完全无关紧要。

使用内存中的SQLite数据库不是一种选择,因为测试中的代码使用MSSQL特定的操作。

4 个答案:

答案 0 :(得分:0)

您可以在事务中包装所有内容,最后只需回滚所有内容。我就是这样做的。它还允许并行运行测试。

答案 1 :(得分:0)

如何使用SQL Server Compact,使用nhibernate schema从映射文件创建数据库创建并加载每个测试的数据。如果你在谈论一些微不足道的数据。

查看此博客文章 - Using SQL Server Compact Edition for Unit testing

另外,您可以使用Fluent Migrator创建数据库架构并为每个测试加载数据。

答案 2 :(得分:0)

为什么在测试中甚至使用数据库?当然你应该嘲笑持久性机制?除非你真的试图测试那部分功能,否则你会浪费时间和资源来实际插入/更新/删除数据。

您的测试依赖于ms sql细节并返回数据提示,这可能是您的架构需要查看的。

我并不认为这里听起来很粗鲁 - 我很惊讶没有其他人接过你这个。

瓦特://

答案 3 :(得分:0)

我过去曾做过一些事情来帮助加快数据库集成测试。我做的第一件事是我最终得到一个sql脚本,实际上从头开始创建整个数据库。使用像Red-Gate SQL Compare这样的工具可以很容易地实现这一点。

其次,我创建了一个从现有数据库中删除所有数据库对象的脚本。

然后我需要一个用测试数据填充数据库的脚本。同样,使用Red-Gate工具创建起来很简单。您不需要/想要大量数据,足以覆盖您的测试用例。

有了这些项目,我创建了一个包含所有只读操作的测试类。在该类的init中,我清除了本地sql server express实例,运行了create script然后运行了populate脚本。这确保了数据库已针对所有只读测试进行了正确初始化。

对于实际操作数据库的测试,我们只是做了与上面相同的路由,除了我们在测试init而不是类init上完成它。

显然,您拥有的数据库操作测试越多,运行所有测试所需的时间就越长。如果它变得难以驾驭,您应该考虑对测试进行分类,只在本地运行必要的内容并在持续集成服务器上运行整个套件。