繁体   English   中英

数据测试层的单元测试

[英]Unit Testing a Data Access Layer

我知道这个问题已经被问过很多次了,但是我仍然没有找到一个好的答案,我对此问题的看法略有不同。

我正在寻找一种彻底测试数据访问层的好方法,但是如果可能的话,可以进行原子测试。 我不想使用真实的数据库(或克隆),因为这将是一个集成测试,并且我希望我的测试保持尽可能轻巧和简单。

DAL是使用NHibernate实现的,而DB是Microsoft SQL Server。 不幸的是,某些DAO必须使用普通的ADO.Net来实现。 甚至更糟的是,某些DAO必须是存储过程的包装。

基本上,我要测试的是NHibernate映射有意义,并且DAO从根本上起作用。 我想根据我的NHibernate映射在内存中创建一个数据库,模拟所有必需的存储过程,然后围绕该数据库运行我的单元测试。 使用我正在测试的DAO从内存数据库中的“模拟”插入和查询。

我的问题如下:

  1. 这是一个好方法吗?
  2. 是否有人有这种方法的经验并可以分享见解?
  3. 是否有一些框架或库可以帮助我创建内存中的模拟数据库?
  4. 如何建立这些测试以用于基于NHibernate的Dao和基于ADO.Net的Dao?
  5. 如何为存储过程创建模拟?

围绕DAO进行测试总是很棘手,但是如果您在这一层中有逻辑,那么它绝对是单元测试的理想选择。

过去我发现使用内存数据库进行这种类型的测试非常有效-涉及一定数量的设置成本(即,在测试中配置您自己的数据库模式的连接和部署)但是一旦完成,他们往往会表现得很好。 SQLite看起来可能是一个不错的选择,看起来与NHibernate一起使用非常简单,并且还有一个ADO.netSQLite提供程序

对于您的问题, SQLite一个问题是它不支持存储过程。 我认为,这里最好的选择是创建单独的类来封装存储过程调用,并将这些类型的对象依赖注入到DAO中。 这样,您可以使用标准对象模拟来模拟存储过程调用。

最后一点-如果您的应用程序中确实有包含任何非平凡逻辑的存储过程,那么围绕它们进行一些集成测试可能是值得的(也许每个存储proc进行一个测试,该测试将对DAO和部署在生产环境中的proc进行练习)数据库)。 尽管创建和维护它们有些痛苦,但我发现它们在过去非常值得-由于开发人员很少充分测试存储proc更改,因此对存储过程的更改通常是bug的来源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM