我正在观看this视频帖子(Jon Galloway和Jesse Liberty)关于构建测试存储库的问题,他们提到拥有数据库并不是一个好主意,而应该使用假存储库。他们给出的两个理由是:
1.数据库可能不可用,并且
2.单元测试应该集中在代码级别。
关于第一个,我从未遇到过我想要处理任何事情并测试环境的场景。数据库不可用,他们提出的第二点我没有得到。
在单元测试中使用数据库是不好的做法?有什么潜在危害?
感谢。
答案 0 :(得分:5)
在单元测试中使用数据库是不是很糟糕?
在单元测试中使用数据库是不好的,但在集成测试中却没有。单元测试的想法是测试应用程序的不同层隔离。将它们绑定到数据库使它们不再是单元测试,因为它们依赖于数据库,因此它们与单元测试的最基本规则之一相矛盾。
因此,当需要测试您的实际数据访问层(正在访问数据库的那个)时,您应该使用集成测试。在这些测试中,您应该设置一个测试数据库。理想情况下,此数据库应该处于每个集成测试的已知状态。为了实现这一点,您可以使用在测试夹具设置中创建数据库的脚本,并将整个集成测试执行到单个原子事务中,该事务将在测试夹具中拆除,以便数据库再次处于已知状态。下一次集成测试。
另一种方法(如果您使用的是ORM)是在集成测试中设置您的数据访问层,以使用内存数据库(例如SQLite),该数据库将被创建并针对每个测试进行下降
答案 1 :(得分:3)
单元测试应测试一件事并且没有外部依赖性(即单独测试)。
只要涉及文件系统或数据库或任何外部文件,它就是一个集成测试。
如果单元测试依赖于外部依赖,则它需要一个已知状态,因此容易破坏(脆弱)。
正如@Darin所提到的,您可以通过恢复已知的数据库状态,在事务中运行测试并在测试结束时回滚事务来确保已知状态,从而在集成测试中包含数据库。