论坛首页 Java企业应用论坛

单元测试系列之4:使用Unitils测试DAO层

浏览 18932 次
该帖已经被评为精华帖
作者 正文
   发表时间:2012-04-12  
上周在东京买了,Spring 3.x企业应用开发实战 很好!不过有些错别字,哈
0 请登录后投票
   发表时间:2012-04-12  
dao测试确实不容易,dbunit虽然解决了一些问题,但还是不太方便,期待有更好的idea出现
0 请登录后投票
   发表时间:2012-04-13  
qinshiwang 写道
上周在东京买了,Spring 3.x企业应用开发实战 很好!不过有些错别字,哈

  不好意思 语文不好,如再次印刷,一定细心改过来。
0 请登录后投票
   发表时间:2012-04-13   最后修改:2012-04-13
在做DAO测试的时候,有一个问题不得不面对,那就是使用数据库的方式。
以oracle为例,多人开发时,如果大家都使用一个测试数据库实例。跑测试的时候,会导致数据之间的相互污染,比如表之间的关联关系,容易错乱。

如果每个人都用自己的数据库实例,比如使用H2之类替代oracle。基础数据准备工作又是一个很大的工作量,还有就是H2之类的与oracle真实环境毕竟有些差距。

请教楼主,在真正实践的时候,该如何解决这方面的问题?
0 请登录后投票
   发表时间:2012-04-13  
nighthawk 写道
在做DAO测试的时候,有一个问题不得不面对,那就是使用数据库的方式。
以oracle为例,多人开发时,如果大家都使用一个测试数据库实例。跑测试的时候,会导致数据之间的相互污染,比如表之间的关联关系,容易错乱。

如果每个人都用自己的数据库实例,比如使用H2之类替代oracle。基础数据准备工作又是一个很大的工作量,还有就是H2之类的与oracle真实环境毕竟有些差距。

请教楼主,在真正实践的时候,该如何解决这方面的问题?


1、采用数据前缀(这个写测试时就要注意),并通过random方式生成随机但不冲突的数据
2、采用数据库沙箱 即每个人一个数据库(这种方式可能在公用测试机不太可能) ---数据库的建立 通过执行脚本完成。
0 请登录后投票
   发表时间:2012-04-13   最后修改:2012-04-13
nighthawk 写道
在做DAO测试的时候,有一个问题不得不面对,那就是使用数据库的方式。
以oracle为例,多人开发时,如果大家都使用一个测试数据库实例。跑测试的时候,会导致数据之间的相互污染,比如表之间的关联关系,容易错乱。

如果每个人都用自己的数据库实例,比如使用H2之类替代oracle。基础数据准备工作又是一个很大的工作量,还有就是H2之类的与oracle真实环境毕竟有些差距。

请教楼主,在真正实践的时候,该如何解决这方面的问题?

 
    我的经验是:一定要做到团队中工作环境的标准化和独立化,切忌采用公用的数据库做测试,避免冲突。标准化,意味减少沟通成本,这也是Maven所极力提倡的。所谓标准化,是即团队成员的工作目录,安装的程序都做到一样,如果公司层面有这种标准化的内容当然最好,如果没有项目组也可以自己定义。
   独立化,就是开发机的环境不要依赖于外部的,也即要完备,如数据库,memcached等都要有,当然可以模拟的就不要安装真实的了。做过国外外包项目的朋友都会知道,一个外包项目的开发环境包含了所有需要的东西,以虚拟机文件的方式提供,打开什么都有了,用VMWare打开即可开发。
  简而言之,项目组每个开发者的工作机环境做到一致,包括目录结构,相关软件及版本。

  剩下来的问题是:代码同步通过SVN或GIT等版本控制工具完成,但如何保证开发机的数据库的同步性呢?其实unitils整合了dbmaintain框架专门干这个活,它可以在单元测试前执行数据库变更脚本,同步本地的数据库结构。
   也就是说,数据库一旦创建后,其后所有针对数据库的更改都必须脚本化,这样各开发终端下载数据库更改脚本,unitils的dbmaintain模块执行脚本以同步化本地数据库。可以通过http://www.dbmaintain.org/tutorial.html详细了解。
  
   以下是我真实项目中的数据库变更脚本的结构:
  


   由于我的项目采用数据库分库,每个库的变更脚本分开存放,如zhk,com等。我要求每个开发者对数据库的变更都必须写日志,以天为单元更新,写在根目录下的dbChangelog.txt,然后根据这个日常编写变更脚本及同步PowerDesigner的设计文档。

  
  • 大小: 28.1 KB
0 请登录后投票
   发表时间:2012-04-13  
stamen 写道
qinshiwang 写道
上周在东京买了,Spring 3.x企业应用开发实战 很好!不过有些错别字,哈

  不好意思 语文不好,如再次印刷,一定细心改过来。

都是输入法惹得祸 
0 请登录后投票
   发表时间:2012-04-13  
jinnianshilongnian 写道
stamen 写道
qinshiwang 写道
上周在东京买了,Spring 3.x企业应用开发实战 很好!不过有些错别字,哈

  不好意思 语文不好,如再次印刷,一定细心改过来。

都是输入法惹得祸 



   呵呵,我用五笔,所以会错得更离谱些 
0 请登录后投票
   发表时间:2012-04-13  
stamen 写道
nighthawk 写道
在做DAO测试的时候,有一个问题不得不面对,那就是使用数据库的方式。
以oracle为例,多人开发时,如果大家都使用一个测试数据库实例。跑测试的时候,会导致数据之间的相互污染,比如表之间的关联关系,容易错乱。

如果每个人都用自己的数据库实例,比如使用H2之类替代oracle。基础数据准备工作又是一个很大的工作量,还有就是H2之类的与oracle真实环境毕竟有些差距。

请教楼主,在真正实践的时候,该如何解决这方面的问题?

 
    我的经验是:一定要做到团队中工作环境的标准化和独立化,切忌采用公用的数据库做测试,避免冲突。标准化,意味减少沟通成本,这也是Maven所极力提倡的。所谓标准化,是即团队成员的工作目录,安装的程序都做到一样,如果公司层面有这种标准化的内容当然最好,如果没有项目组也可以自己定义。
   独立化,就是开发机的环境不要依赖于外部的,也即要完备,如数据库,memcached等都要有,当然可以模拟的就不要安装真实的了。做过国外外包项目的朋友都会知道,一个外包项目的开发环境包含了所有需要的东西,以虚拟机文件的方式提供,打开什么都有了,用VMWare打开即可开发。
  简而言之,项目组每个开发者的工作机环境做到一致,包括目录结构,相关软件及版本。

  剩下来的问题是:代码同步通过SVN或GIT等版本控制工具完成,但如何保证开发机的数据库的同步性呢?其实unitils整合了dbmaintain框架专门干这个活,它可以在单元测试前执行数据库变更脚本,同步本地的数据库结构。
   也就是说,数据库一旦创建后,其后所有针对数据库的更改都必须脚本化,这样各开发终端下载数据库更改脚本,unitils的dbmaintain模块执行脚本以同步化本地数据库。可以通过http://www.dbmaintain.org/tutorial.html详细了解。
  
   以下是我真实项目中的数据库变更脚本的结构:
  


   由于我的项目采用数据库分库,每个库的变更脚本分开存放,如zhk,com等。我要求每个开发者对数据库的变更都必须写日志,以天为单元更新,写在根目录下的dbChangelog.txt,然后根据这个日常编写变更脚本及同步PowerDesigner的设计文档。

  


非常感谢楼主的认真回复,受益匪浅,这就去看看dbmaintain。
0 请登录后投票
   发表时间:2012-04-13  
支持一下楼主,很少看到厦门的朋友这么给力...
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics