【问题标题】:How do I do TDD efficiently with NHibernate?如何使用 NHibernate 有效地进行 TDD?
【发布时间】:2008-12-01 22:30:18
【问题描述】:

在我看来,大多数人在使用 NHibernate 时都会针对内存中的进程内数据库(如 SQLite)编写测试。我已经启动并运行了它,但我的第一个测试(使用 NHibernate)总是需要 3-4 秒才能执行。下一个测试运行得更快。

我正在使用 FluentNhibernate 进行映射,但与 XML 映射文件的时间大致相同。对我来说,3-4 秒的延迟严重扰乱了我的流程。

使用 TDD 和 NHibernate 的推荐方式是什么?

是否可以模拟 ISession 以对实际查询进行单元测试,还是只能在内存数据库中完成?

【问题讨论】:

  • 当测试需要 3-4 分钟运行时,这变得更加相关。

标签: unit-testing nhibernate fluent-nhibernate tdd


【解决方案1】:

我正在使用存储库模式来执行数据库操作,并且每当我运行我的测试时,我只运行简单地模拟存储库(使用 RhinoMocks)的更高级别的测试。

我有一套单独的测试,明确测试存储库层和 NHibernate 映射。这些通常不会像它们上面的业务和gui逻辑那样改变。

这样我得到了非常快的单元测试,它永远不会碰到数据库,而且仍然是一个经过良好测试的数据库层

【讨论】:

  • 无论如何,这些单独的测试更多地属于集成测试领域。很高兴您可以将它们自动化,但最好将它们分开。 ^1
  • 是的,nhibernate 通过在您每次开始测试时重新创建数据库来使执行这些测试变得非常容易。这需要时间,我的 NHibernate 测试需要大约一分钟才能运行,但它们仍然运行,我知道什么时候出现问题。
  • 需要查询数据的测试方法或需要外键的保存操作等我可以想象加载数据进行测试需要做很多工作
【解决方案2】:

无法进行单元测试数据访问,但您可以对其进行集成测试。 我在与单元测试分开的项目中为我的数据访问创建集成测试。当我更改存储库、映射或数据库模式中的某些内容时,我只运行(慢)集成测试。 因为集成测试没有与单元测试混合,我仍然可以每天运行大约 100 次单元测试而不会感到烦恼。

【讨论】:

  • 我不确定你是否正确。这实际上取决于您如何编写测试。如果您的测试是原子的、顺序独立和孤立的、意图揭示、易于设置和快速。它们在任何意义上都是单元测试。见:codebetter.com/blogs/jeremy.miller/archive/2005/07/20/…
  • 一些与文件系统、数据库或任何其他系统交互的测试不是独立的,所以不是单元测试。我知道 J.Miller 同意这一点。快速意味着能够在 10 秒内运行数千个测试。无论您做什么,数据库集成测试都达不到这个速度。
  • 是的,我同意“......与文件系统、数据库或任何其他系统交互的测试不是独立的......”但我在这里谈论的是针对进程内,内存中的数据库。这与您今天在测试中可能拥有的任何其他内存对象没有什么不同。
【解决方案3】:

【讨论】:

  • 很酷的链接,它们确实与 nHibernate 有关系,但具体提供了什么来回答这个问题?
【解决方案4】:

您是否尝试过更改可选配置属性中的一些默认值?减速很可能与 nhibernate 对代码生成所做的某些优化有关。

http://nhibernate.info/doc/nh/en/index.html#configuration-optional

似乎内存数据库将是测试数据层的最快方法。一旦你开始测试你的数据层,你似乎也有点超出了单元测试的范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    相关资源
    最近更新 更多