模拟与测试数据库?

Ray*_*Ray 28 unit-testing data-access-layer mocking

之前我问过这个问题如何正确单元测试我的DAL?,有一件事对我来说没有答案是,如果真的测试我的DAL是有一个测试数据库,那么模拟与测试数据库的作用是什么?

另外,另一个人建议"在单元测试结束时使用事务和回滚,因此db是干净的",测试db就是.你们怎么看待这个测试+测试DB +事务回滚(所以db不是真正编写的)测试DAL的方法?

为了完整,我的DAL是使用Entity Framework构建的,DB中没有存储过程.由于EF是如此新颖,我真的需要测试DAL以确保它们正常工作.

tva*_*son 15

我想您可能想要进行一些集成测试来检查由数据库结构强制执行的逻辑,例如约束,触发器,自动增量列等.但是,您应该对单元测试模拟出您的DAL的任何框架组件依赖于你想要的(在你的单元测试中)只测试你编码的那些组件.您实际上不需要在SqlCommand或SqlConnection上测试方法(例如).您应该假设您使用的框架组件工作并为它们创建存根或模拟,以便为您的方法返回已知数据(好的,坏的,例外),以确保您的方法正常工作.没有嘲笑,你负责在数据库中生成数据并确保它是正确的.您还要在网络上保留开放依赖关系,即数据库本身,

此外,单元测试不会消除对其他类型测试的需要.集成测试和验收测试仍然有效,需要完成.它们可能不需要以与单元测试相同的频率完成,并且可能不需要像单元测试那样提高代码质量,但单元测试不是一个神奇的子弹.

  • +1集成测试仍然有它的位置.@ ray247请记住,而不是模拟只是为了测试较低层这样的业务层,因为在测试中你只是有兴趣知道你的业务层是否工作..而不是数据库所以你的模拟将"像一个返回某些东西的数据库". (2认同)

Dan*_* C. 8

在测试数据访问代码时,我没有发现mocking非常有用.单元测试的目的是验证与数据库相关的代码是否有效,并且模拟数据库会妨碍测试.

在测试业务代码时,Mocking确实很有用.您可以模拟数据库调用以返回测试数据,并在这些情况下验证业务逻辑的行为.

关于事务的使用 - 只要您的体系结构有足够的空间在测试开始时启动事务,然后在该事务中执行单元测试的所有数据库相关调用,这当然是可能的.但是从未尝试过.


Cra*_*her 5

将单元测试放入可回滚的事务中听起来很老套。相反,我有代码在测试运行之前(即在我的测试类的构造函数中)清除数据库中的任何 CRUD(即不是静态/引用数据的任何内容)。当测试失败时,将数据保留在数据库中有助于检查失败的原因。