【发布时间】:2011-01-16 16:52:32
【问题描述】:
任何存储库/DAO 实现中值得测试的部分是查询。 为确保这些查询正确,您必须在 实际数据库。
鉴于上述事实,对 DAO/存储库进行单元测试是否有意义?如果是,最佳做法是什么?
【问题讨论】:
标签: unit-testing dao
任何存储库/DAO 实现中值得测试的部分是查询。 为确保这些查询正确,您必须在 实际数据库。
鉴于上述事实,对 DAO/存储库进行单元测试是否有意义?如果是,最佳做法是什么?
【问题讨论】:
标签: unit-testing dao
我非常虔诚地对我的存储库进行单元测试。实际上,它们可能是我最重要的单元测试。
如果您使用诸如 NHibernate 之类的 ORM,这实际上会非常轻松。
我使用包含 setup 和 teardown 的基本夹具来创建内存中的 sqlite db,然后在每次测试结束时将其销毁。这出奇的快。然后对于每个存储库,我都有一个为我的测试注入测试数据的设置。这是非常独立的,可以捕获我的存储库查询中的所有逻辑问题。
它唯一没有捕捉到的是数据库提供者特定的情况,但是当使用像 NHibernate 这样的东西时,这些通常是例外。
对于测试数据库特定查询的特殊情况,您可能需要一套使用不同设置和拆卸方法的测试。不幸的是,这些测试会比您的其他单元测试更慢并且可能更脆弱(这就是为什么它们应该组合在一起)。
如果您正在测试的数据库软件的“快速”版本可用,我仍然建议您在本地即时设置数据库,以便您始终确保运行测试的数据库具有他们期望的架构。不过,我会更改其中的一部分设置和拆卸。我只会在整个测试运行的开始和结束时设置和拆除数据库。然后每个测试设置和拆卸都应该启动一个事务,然后在最后回滚。这是在测试之间进行划分的一种快速方法。您最不想要的就是让一个测试中的数据影响另一个测试。
【讨论】:
是的 - 使用内存数据库(例如HSQLDBL)
This blogpost of mine 讨论了一个类似的话题。
更新:关于您的评论 - 在我链接的帖子中,ORM 用于确保数据库不一致不是问题。首先使用原始 SQL 并不是一个好主意(如果使用 OOP)。然后,您总是可以尝试尽可能使用 ANSI SQL(而不是测试不一致之处)。
另一种选择可能是专用一个测试数据库服务器 + 一个持续集成引擎,并且只在引擎内运行测试(这样来自多台机器的多个测试执行不会相互混淆)
【讨论】:
是的,必须对 DAO 层进行单元测试。在 java 中有像 dbUnit 这样的框架可以帮助你做到这一点。使用一些引导数据在数据库中保留一个单独的架构/实例将有助于您进行正确的单元测试,并且您可以涵盖大多数场景。
【讨论】: