【问题标题】:Prepopulating in memory SQLite database for Nhibernate testing在内存中预填充 SQLite 数据库以进行 Nhibernate 测试
【发布时间】:2012-10-25 13:37:32
【问题描述】:

目前,我有一个单元测试框架,我在内存中使用 SQLite 数据库和 NHibernate 进行单元测试。每个单元测试都在自己的会话中运行以确保独立性。在大多数情况下,这很棒,但是当我接近 150 次测试时,它开始运行有点慢。这样做的主要原因是,在每次测试之前,我必须在数据库中插入大量数据。

基本上我的应用程序是一个工作流应用程序,我们在数据库中存储了大量有关工作流的信息(步骤数、每个步骤的字段等)。除非有这些东西,否则应用程序无法运行,因此我的测试需要它。

此时,我的总测试时间中大约有 4 分钟用于在每次单元测试之前填充数据库。我很想在每次测试执行时让这个人口发生一次,但由于在会话关闭时内存数据库被破坏,我不确定如何。有什么建议吗?

【问题讨论】:

  • 模拟您的存储库。获取存储库以返回测试所需的实体对象。这非常快。我有一个包含 900 多个测试的项目,不到一分钟就可以运行。
  • 这是可能的,但需要大量额外的代码。我现在直接使用数据库的优势是我的部署脚本和我的测试设置代码是相同的。我也没有为严格的存储库设置而烦恼,而是在ayende.com/blog/3955/repository-is-the-new-singleton 遵循ayende 的指导。结果,我在许多情况下直接与 ISession 交互。当然,在一个可以模拟的简单抽象层中并不会太难,但我希望有更简单的东西。

标签: sqlite unit-testing nhibernate


【解决方案1】:

您可以将预填充的数据库文件复制到临时目录(如果可能,在 RAM 磁盘上)。

或者,您可以使用SQLite backup API 将数据库的内容复制到内存数据库中。

【讨论】:

  • 这将需要使用基于文件的 sqlite 数据库,虽然潜在的解决方案并不理想。即使它在 ramdisk 上,我仍然需要做一些工作来确保测试对于团队中没有使用 ramdisk 设置运行的其他人来说运行良好。我查看了 SQLite 备份 api,但据我所知,这不是您可以通过 SQLite 的 C# 库操作的东西。如果您有任何相反的信息,那就太好了。
  • System.Data.SQLite does support the backup API.
  • 太棒了,我一定一直在查看过时的文档。我会在周末对此进行测试,如果我能正常工作,我会接受。感谢您的帮助。
  • 这非常有效。我的测试从 3-5 分钟运行到大约 20 秒。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2015-01-18
  • 2014-06-19
  • 2011-08-05
  • 2017-07-15
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多