一个通用的单元测试框架的思考和设计06-实现篇-自动管理测试数据-如何临时关闭数据外键约束

第4节中提出了通过dbunit插件来自动管理测试数据,但是在实际操作时发现了一些问题,在设计数据库表时各个表之间可能存在外键关联,在我们准备测试数据库时经常会遇到因外测试数据外键问题导致无法插入数据或者是在清理测试数据的时候因为测试数据的顺序问题导致测试数据无法删除成功,如何解决这个问题?

这里使用了一种比较傻瓜但是也比较直接的方式--临时将数据库的外键约束删除,测试完成后将数据恢复到先前状态。

操作步骤

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掉的外键逐个启用外加约束功能

问题&小结

问题是解决掉了,但是还是存在一定的问题,如我们在实际的测试前将外键约束去掉了,如果在实际的业务类中出现的数据库操作也没有依照外键约束来操作数据,这个时候数据库是不会报错的,这样可能导致一种问题-在单元测试的时候结果是正确的(外键约束无效),但是在实际的环境下结果却出错了(数据违背了约束)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值