Unit testing 我应该费心对我的存储库层进行单元测试吗

Unit testing 我应该费心对我的存储库层进行单元测试吗,unit-testing,Unit Testing,只是把这件事提出来讨论而已 我接受单元测试。有时感觉很费时,但我完全赞成这样做的好处 我使用IoC建立了一个包含存储库层和服务层的应用程序,并对这些方法进行了单元测试 现在我知道了为单元测试隔离方法的好处,这样就很少或根本不依赖于其他方法 我的问题是这个。如果我只通过我的服务层方法访问我的存储库方法,那么测试服务层还不够好吗?我正在测试一个测试数据库 你只需要测试你的公共方法,这难道不能被认为是一种想法的延伸吗?也许我只是想跳过一些测试;) 这不取决于存储库访问层的智能程度吗?如果您的存储库采用

只是把这件事提出来讨论而已

我接受单元测试。有时感觉很费时,但我完全赞成这样做的好处

我使用IoC建立了一个包含存储库层和服务层的应用程序,并对这些方法进行了单元测试

现在我知道了为单元测试隔离方法的好处,这样就很少或根本不依赖于其他方法

我的问题是这个。如果我只通过我的服务层方法访问我的存储库方法,那么测试服务层还不够好吗?我正在测试一个测试数据库


你只需要测试你的公共方法,这难道不能被认为是一种想法的延伸吗?也许我只是想跳过一些测试;)

这不取决于存储库访问层的智能程度吗?如果您的存储库采用参数进行筛选(例如Linq到SQL),那么给定的结果集肯定需要测试此逻辑。

您应该测试存储库层。但是,如果您有涵盖它的集成、故事或系统测试,那么您也可以不进行单元测试

单元测试对于复杂的独立对象非常有用,但是花很长时间为“更高级别”测试所涵盖的简单方法编写单元测试是没有意义的

我接受单元测试


下一步是测试驱动开发(TDD)。它将回答您的问题。

是的,您应该测试存储库层。尽管这些测试的大多数属于不同的测试分类。我通常将它们称为集成测试,以区别于我的单元测试。不同之处在于,对资源(数据库)存在外部依赖,并且这些测试可能需要更长的时间才能运行

单独测试存储库的主要原因是,您将测试不同的东西。存储库负责处理与您正在使用的任何持久性存储的转换和交互。另一方面,服务层负责将各种职责和其他依赖项协调到表示业务逻辑的功能中,这可能不仅仅涉及到存储库方法的中继,在某些情况下还可能涉及到对多个存储库的多个调用

首先,为了澄清服务层测试——在测试服务层时,应该模拟存储库,以便它们与您在服务层中测试的内容隔离。正如您在评论中指出的,这为您提供了更细粒度的测试,并隔离了测试中的代码。您的单元测试现在也将运行得更快,因为没有数据库连接会减慢它们的速度

现在,这里有一些将集成测试添加到存储库的优点

  • 它允许您在编写代码时测试这些代码片段,一个la TDD
  • 它确保您正在使用的任何持久性语言(SQL、HQL、序列化对象等)都针对您试图执行的操作进行了正确的公式化
  • 如果您使用的是对象关系映射器,它可以确保正确定义映射
  • 将来,您可能会发现需要支持另一种类型的持久性。根据存储库测试的结构,您可能能够重用大量测试来验证新数据库模式是否正常工作。对于实现数据库特定逻辑的存储库方法,显然必须创建单独的测试
  • 当与持续集成相结合时,将存储库测试分离是一件好事。本质上,集成测试比单元测试运行时间更长。因此,它们通常以较少的频率运行,这样运行单元测试的即时反馈就不会延迟
  • 这些都是我在参与的各种项目中看到的优势。可能还有更多


    话虽如此,我承认我对存储库集成测试不如对单元测试那么彻底。例如,在测试特定对象上的更新时,我通常会测试一个数据库列是否已成功更新,而不是为每个单独的列创建单独的测试或验证一个测试中的每个列的更大测试。对我来说,这取决于respository方法执行的操作的复杂性以及是否有任何需要隔离的特殊情况。

    单元测试:测试单个逻辑(方法),而不必担心该逻辑的依赖性。大部分属于白盒类

    集成测试:可以同时测试端到端的流或多个层,以确保其正确性。大部分属于黑盒类别

    在Dao中,大多数时候没有业务逻辑,它只是为特定的数据库实现形成一个查询。因此,如果我们已经在集成测试中介绍了单元测试,那么就不需要单元测试。尽管如此,如果Dao中有一些逻辑,我们仍然可以为它编写单元测试

    由于dao层与数据库实现紧密耦合,大多数情况下,dao的junit测试已经成为底层数据库测试的同义词。 我们构建的查询只能由底层数据库引擎验证


    我曾经使用实际的数据库或用兼容的数据库模拟数据库(遵循相同的sql标准,例如mysql引擎可以被sqlite或内存中的H2数据库取代),为dao编写单元测试(可以调用集成测试)并将该数据库注入dao中,以测试dao层和该dao层中的查询构建。

    这听起来像是在同时测试服务层和存储库层。我说的对吗?如果是这样,您应该模拟存储库层,然后独立测试它。@Kim R我是