数据库单元测试的一点尝试
2015-09-16 15:35
399 查看
数据库单元测试的一点尝试
概要:数据库单元测试的策略
一般处理方式
遇到的问题以及处理思路
数据库单元测试的策略
毫无疑问,数据库数据模拟单元测试是有必要的,而且需要通过集成测试方式真正在数据库环境中做到数据在事务中控制,通过回滚,零污染,数据没有真正添加到数据库
通过数据测试父类或委托方法方式来封装事务相关代码
要考虑应对数据模型变化时的应对,我使用的是UnitOfWork设计模式封装的EntityFrameowrk,Code First方式处理数据访问层,所以数据模型会经常剧烈变化,之前就这里遇到了问题,后面会提及
一般处理方式
代码块
数据测试基类DBTestBase,网上也有类似的代码,关键代码例如:#`这里写代码片`region 成员变量区域 private TransactionScope _scope; #endregion #region 每个测试方法调用前初始化,均打开独立的事务作用域 [TestInitialize] public virtual void Setup() { _scope = new TransactionScope(); } #endregion #region 每个测试方法调用后触发,独立的事务销毁,回滚操作,不提交事务 [TestCleanup] public virtual void TearDown() { _scope.Dispose(); } #endregion #region 默认初始化IOC组件 /// <summary> /// 默认初始化IOC组件 /// 模型变化时处理方式 /// </summary> protected static void Init() { BootStrapper.InitMap(); //模型变化时处理 HandleIfModelChangeThenCreateOrDropDBThrowTransactionException(); }
遇到的问题以及处理思路
代码块
测试方法都包裹在外层事务中,模型变化时,EntityFramework都会根据数据库初始化设置,对已存在数据库进行删除,就会抛出SqlException,提示不能在事务中执行DropDataBase命令,那我就写了个不优美然而还真有用的方法HandleIfModelChangeThenCreateOrDropDBThrowTransactionException(),在里面就执行简单查询,就可以让数据库适应模型变化,然后再去执行包裹在事务控制中的测试方法,例如:C# /// <summary> /// 使用了一种取巧的做法处理因模型改变引发数据库创建或删除,因使用外层事务包裹,会发生异常的情形 /// </summary> private static void HandleIfModelChangeThenCreateOrDropDBThrowTransactionException() { using (GeneralDataContext ctx = new GeneralDataContext()) { ctx.Members.Count(); } } #endregion
相关文章推荐
- Oracle数据库异机升级
- JDBC连接MySQL例子
- MySQL日期时间函数大全
- Mysql的jdbc.properties模板
- SQL行转列汇总--通用方法
- IOS-sqlite3数据库: create table数据库表及对数据库表的增删改查(create/insert/delete)
- sql server数据库导入导出时总失败,错误
- oracle创建dblink问题
- Qlikview配置ODBC连接ORACLE/SQL SERVER
- 万网虚拟主机数据库无法CHARACTER_SET_SERVER 为gbk 96bf ,无法更改的设置方法
- 关于数据库用户sa修改密码
- 有关oracle的一些用户命令
- mysql -- 模糊查询的四种方法
- Redis学习8之predis错误显示
- sql语句占用内存查询
- Orlace 数据库连接的那些事儿:客户端(一)
- 动态sql语句基本语法
- mysql的 函数 group_concat , substring_index 的使用以及 分库分表操作
- SQL中Merge的用法
- 安装12c遇到 Error in invoking target 'irman ioracle' of makefile