持续集成之路——数据访问层的单元测试
来源:互联网 发布:为什么雷姆受欢迎 知乎 编辑:程序博客网 时间:2024/04/19 09:17
翻看之前的文章才发现,最近一次记录持续集成竟然是3年前,并且只记录了两篇,实在是惭愧。不过,持续集成的这团火焰却始终在心中燃烧,希望这次的开始可以有些突破。
测试是持续集成的基石,没有测试的集成基本上是毫无意义的。如何写好测试就是横亘在我面前的第一个问题。那就从数据访问层开始吧。说起来可笑,从3年前第一次准备做持续集成式,就开始考虑测试数据访问层的一些问题:
- 难道我要在测试服务器上装一个MySQL?
- 数据库结构发生了变化怎么办?
- 怎么样才能消除测试间的依赖?
- 测试数据怎么管理?何况测试数据间还有那么多的逻辑?
- 结果如何验证?
- ……
这些问题在我脑海萦绕很久,《一代宗师》里说“宁在一思进,莫在一思停”,及时想破脑袋,不如直接实践。那就一个个问题来。
在继续之前,先交代一下当前程序的架构,很经典的Spring + Spring Data + Hibernate + MySQL,所以下面的解决方案都是基于这个架构。另外,程序是通过Maven构建。
一、用内存数据库替代MySQL
我选择了HSQLDB,官网上有很多示例可以参考。HSQLDB提供几种不同的使用模式,这里只选用内存模式。Spring通过<jdbc:embedded-database>标签提供对了嵌入式数据库的支持,在applicationContext-test.xml中对数据源的配置十分简单:
<jdbc:embedded-database id="dataSource" type="HSQL"/>
HSQL不需要安装,在pom.xml将jar包作为依赖引入即可:
<dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>2.2.8</version> <scope>test</scope> </dependency>
二、数据库结构的维护
在项目的开发过程中,一直使用flyway维护数据库结构变化。虽然Spring也通过<jdbc:initialize-database>提供了执行SQL的机会,但是经过测试发现并且不能完成flyway完成的任务。这个就开始思考:是否一定要选用flyway,并且通过SQL来控制结构改变?flyway主要是参考了ruby的db migration机制,每次修改都是上一次版本的基础进行的,从而不会影响正在运行的逻辑。可是在开发阶段并没有必要使用flyway来控制,并且对SQL的维护也是要花费精力。于是就把目光转向了Hibernate对DDL的支持,便有了下面的配置:
<!-- Jpa Entity Manager 配置 --><bean id="entityManagerFactory"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="dataSource" ref="dataSource" /><property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"></property><property name="packagesToScan" value="com.noyaxe.myapp" /><property name="jpaProperties"><props><!-- 命名规则 My_NAME->MyName --><prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop><prop key="hibernate.show.sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop></props></property></bean>
可是对于Hibernate的DDL支持,我还是心存疑虑:1. 如果数据库中已经存在数据,那么字段类型改变会如何处理?2. 如何才能更好维护DDL的变化?
(待续)
补记:
首先十分感谢csfreebird的指教,让我停下来思考为什么要选用HSQLDB背后的问题。下面几篇文章供大家参考,尤其是最后一篇文章值得仔细思考:
Testing Databases with JUnit and Hibernate Part 1: One to Rule them
Database unit testing with DBUnit, Spring and TestNG
Basic Mistakes in Database Testing
<script type="text/javascript">var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F94beed115f7adca9895daf1cc025ad4f' type='text/javascript'%3E%3C/script%3E"));</script>- 持续集成之路——数据访问层的单元测试
- 持续集成之路——数据访问层的单元测试(续)
- 持续集成之路——数据访问层单元测试遇到的问题
- 持续集成之路——数据访问层的单元测试
- 持续集成之路——服务层的单元测试
- 持续集成之路——使用SpringTestDbunit管理数据集的一个问题
- Jenkins持续集成测试之Android单元测试
- 持续集成之路——Maven
- 单元测试与持续集成
- 单元测试与持续集成
- 持续集成之路
- 持续集成之路
- 跌跌撞撞的持续集成之路
- 跌跌撞撞的持续集成之路
- 疯狂的持续集成之路
- Android项目持续集成之单元测试及代码覆盖率
- 持续集成之路——Maven(续)
- 持续集成之路——搭建Maven私服
- 统计学习方法——CART, Bagging, Random Forest, Boosting
- 07-html5游戏坦克大战第三战(坦克移动)
- CXF ws client, dynamic endpoint and loading WSDL from the classpath
- 如何成为一名游戏设计师
- Leetcode: Pascal's Triangle
- 持续集成之路——数据访问层的单元测试
- Leetcode: Pascal's Triangle II
- (转)C++中extern “C”含义深层探索
- Linux下的java,mongodb,opencv安装
- iOS:NSCoder的方法decodeValueOfObjCType:at:
- iOS:NSCoder的方法decodeValuesOfObjCTypes:
- [每日一题] OCP1z0-047 :2013-07-15 drop column.........................................................4
- iOS:NSCoder的方法encodeArrayOfObjCType: count: at:
- iOS:NSCoder的方法encodeBycopyObject: