一个通用的单元测试框架的思考和设计06-实现篇-自动管理测试数据-如何临时关闭数据外键约束
2011-08-15 15:34
1391 查看
第4节中提出了通过dbunit插件来自动管理测试数据,但是在实际操作时发现了一些问题,在设计数据库表时各个表之间可能存在外键关联,在我们准备测试数据库时经常会遇到因外测试数据外键问题导致无法插入数据或者是在清理测试数据的时候因为测试数据的顺序问题导致测试数据无法删除成功,如何解决这个问题?
这里使用了一种比较傻瓜但是也比较直接的方式--临时将数据库的外键约束删除,测试完成后将数据恢复到先前状态。
操作步骤
1.在AbstractDatasetProviderListener类的beforeTest方法之前将外键约束去除
2.在AbstractDatasetProviderListener类德afterTest方法执行后添加外键约束
问题&小结
问题是解决掉了,但是还是存在一定的问题,如我们在实际的测试前将外键约束去掉了,如果在实际的业务类中出现的数据库操作也没有依照外键约束来操作数据,这个时候数据库是不会报错的,这样可能导致一种问题-在单元测试的时候结果是正确的(外键约束无效),但是在实际的环境下结果却出错了(数据违背了约束)
这里使用了一种比较傻瓜但是也比较直接的方式--临时将数据库的外键约束删除,测试完成后将数据恢复到先前状态。
操作步骤
1.在AbstractDatasetProviderListener类的beforeTest方法之前将外键约束去除
String[] tables = dataSet.getTableNames(); if(tables != null){ for(String table : tables){ databaseTester.getConnection().getConnection().prepareStatement("ALTER TABLE "+table+" NOCHECK CONSTRAINT all").execute(); } } databaseTester.onSetup();获取当前的数据集中所操作的表,让后对每个表执行disable外键约束操作,再执行onSetup操作
2.在AbstractDatasetProviderListener类德afterTest方法执行后添加外键约束
databaseTester.setTearDownOperation(InsertIdentityOperation.DELETE); databaseTester.onTearDown(); String[] tables = databaseTester.getDataSet().getTableNames(); if(tables != null){ for(String table : tables){ databaseTester.getConnection().getConnection().prepareStatement("ALTER TABLE "+table+" CHECK CONSTRAINT ALL").execute(); } }是步骤1的反步骤,在将测试数据情理完毕后对先前disable掉的外键逐个启用外加约束功能
问题&小结
问题是解决掉了,但是还是存在一定的问题,如我们在实际的测试前将外键约束去掉了,如果在实际的业务类中出现的数据库操作也没有依照外键约束来操作数据,这个时候数据库是不会报错的,这样可能导致一种问题-在单元测试的时候结果是正确的(外键约束无效),但是在实际的环境下结果却出错了(数据违背了约束)
相关文章推荐
- 一个通用的单元测试框架的思考和设计06-实现篇-自动管理测试数据-如何临时关闭数据外键约束
- 一个通用的单元测试框架的思考和设计07-实现篇-自动管理测试数据-如何为自增长主键id赋值
- 一个通用的单元测试框架的思考和设计07-实现篇-自动管理测试数据-如何为自增长主键id赋值
- 一个通用的单元测试框架的思考和设计04-实现篇-自动管理测试数据
- 一个通用的单元测试框架的思考和设计04-实现篇-自动管理测试数据
- 一个通用的单元测试框架的思考和设计05-实现篇-Guice框架启动与自动注入
- 一个通用的单元测试框架的思考和设计05-实现篇-Guice框架启动与自动注入
- 一个通用的单元测试框架的思考和设计03-实现篇-核心类源码
- 一个通用的单元测试框架的思考和设计03-实现篇-核心类源码
- 一个通用的单元测试框架的思考和设计08-实现篇-在testcase代码中执行sql语句
- 一个通用的单元测试框架的思考和设计08-实现篇-在testcase代码中执行sql语句
- 一个通用的单元测试框架的思考和设计09-实现篇-视图操作
- 一个通用的单元测试框架的思考和设计09-实现篇-视图操作
- 一个通用的单元测试框架的思考和设计02-设计篇
- 一个通用的单元测试框架的思考和设计02-设计篇
- 建立一个Point类,包含数据成员x,y,实现需要的成员函数,并设计main函数完成测试
- WF+WCF+WPF第三天-WF实现一个软件自动测试框架
- 【远程调用框架】如何实现一个简单的RPC框架(一)想法与设计
- java在线支付---06,07,08_在线支付_编写将数据提交给易宝支付的JSP页面,集成和测试向易宝发送支付请求,实现浏览器自动向易宝发送支付请求
- 采用一个自创的"验证框架"实现对数据实体的验证[设计篇]