DAO(aka存储库)应该进行单元测试吗?

时间:2010-02-14 13:45:59

标签: unit-testing dao

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

鉴于以上事实,单元测试DAO /存储库是否有意义?如果是,最佳做法是什么?

3 个答案:

答案 0 :(得分:2)

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

This blogpost of mine讨论了类似的主题。

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

另一种选择可能是专用测试数据库服务器+连续集成引擎,并仅在引擎内运行测试(以便多台机器的多次测试执行不会相互混淆)

答案 1 :(得分:2)

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

如果你使用像NHibernate这样的ORM,这实际上可以非常轻松。

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

它唯一没有捕获的是db provider特定情况,但是当使用类似NHibernate的东西时,这些通常是例外。

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

如果您正在测试的数据库软件的“快速”版本可用,我仍然建议您在运行中本地设置数据库,以便始终确保您的测试运行的数据库具有他们期望的架构。我会更改设置和拆卸的一部分。我只会在整个测试运行的开始和结束时设置和拆除数据库。然后每个测试设置和拆卸应该开始一个事务,然后在结束时回滚。这是在测试之间保持分隔的快速方法。您想要的最后一件事是来自一个测试的数据影响另一个测试。

答案 2 :(得分:0)

是的,必须对DAO层进行单元测试。在java中有像dbUnit这样的框架可以帮助你做到这一点。使用一些引导数据在数据库中保存单独的模式/实例将有助于您进行正确的单元测试,并且您可以涵盖大多数情况。