Unit testing DAO(又名存储库)应该进行单元测试吗?

Unit testing DAO(又名存储库)应该进行单元测试吗?,unit-testing,dao,Unit Testing,Dao,任何值得测试的存储库/DAO实现的部分都是查询。 为了确保这些查询是正确的,您必须在 实际数据库 鉴于上述事实,单元测试DAO/职责有意义吗?如果是,最佳做法是什么?是-使用内存数据库(例如) 讨论一个类似的话题 更新:关于您的评论-在我链接的帖子中,使用ORM来确保数据库不一致不会成为问题。首先,使用原始SQL不是一个好主意(如果使用OOP)。然后,您可以尝试尽可能使用ANSI SQL(而不是测试不一致性) 另一种选择可能是专门使用一个测试数据库服务器+一个持续集成引擎,并且只在引擎内运行测试

任何值得测试的存储库/DAO实现的部分都是查询。 为了确保这些查询是正确的,您必须在 实际数据库


鉴于上述事实,单元测试DAO/职责有意义吗?如果是,最佳做法是什么?

是-使用内存数据库(例如)

讨论一个类似的话题

更新:关于您的评论-在我链接的帖子中,使用ORM来确保数据库不一致不会成为问题。首先,使用原始SQL不是一个好主意(如果使用OOP)。然后,您可以尝试尽可能使用ANSI SQL(而不是测试不一致性)


另一种选择可能是专门使用一个测试数据库服务器+一个持续集成引擎,并且只在引擎内运行测试(这样来自多台机器的多个测试执行不会相互干扰)

我非常虔诚地对我的存储库进行单元测试。实际上,它们可能是我最重要的单元测试

如果您使用诸如NHibernate之类的ORM,这实际上是非常无痛的

我使用一个包含setup和teardown的基本fixture来创建内存中的sqlite db,然后在每个测试结束时销毁它。这速度惊人地快。然后,对于每个存储库,我都有一个为测试注入测试数据的设置。这是非常独立的,可以捕获我的存储库查询中的所有逻辑问题

它唯一没有捕捉到的是db提供程序特定的情况,但是当使用类似NHibernate的东西时,这些通常是例外

对于测试特定于数据库的查询的特殊情况,可能需要一套使用不同设置和拆卸方法的测试。不幸的是,这些测试会比其他单元测试慢,而且可能更脆弱(这就是为什么它们应该组合在一起)


如果您正在测试的数据库软件的“express”版本可用,我仍然建议您动态地在本地设置数据库,以便始终确保您的测试所针对的数据库具有他们期望的模式。我会改变一部分的设置和拆卸这个虽然。我只会在整个测试运行的开始和结束时设置和拆除数据库。然后,每个测试设置和拆卸都应该启动一个事务,然后在最后回滚它。这是一种在测试之间保持划分的快速方法。您最不希望一个测试中的数据影响另一个测试。

是的,必须对DAO层进行单元测试。在java中,有这样的框架可以帮助您做到这一点。在数据库中保留一个单独的模式/实例和一些引导数据将有助于您进行正确的单元测试,您可以覆盖大多数场景。

由于大多数RDBMS服务器在处理SQL的方式上各不相同,我们如何确保它在生产服务器上工作,仅仅因为它在内存数据库上工作,反之亦然?如果您想确保一切正常,那么您还需要进行集成测试,以获得有用的答案。但是,不能单独使用ANSI SQL:(我确实使用Hibernate(Java)但我的应用程序使用了一堆本机SQL来使用一些其他服务器上无法使用的Oracle特定语句。我添加了一些关于我过去在需要使用特定sb而不仅仅是内存测试时所做的工作的信息。我不希望这样做,因为这需要更多的工作,但仍然可以相对轻松地完成。