持续集成之路——数据访问层的单元测试

本文探讨了持续集成中的测试挑战,特别是在数据访问层方面。作者选择HSQLDB内存数据库替代MySQL,解决了测试环境搭建问题,并利用Hibernate自动更新数据库结构。文章还讨论了如何有效地管理测试数据及验证测试结果。

翻看之前的文章才发现,最近一次记录持续集成竟然是3年前,并且只记录了两篇,实在是惭愧。不过,持续集成的这团火焰却始终在心中燃烧,希望这次的开始可以有些突破。

测试是持续集成的基石,没有测试的集成基本上是毫无意义的。如何写好测试就是横亘在我面前的第一个问题。那就从数据访问层开始吧。说起来可笑,从3年前第一次准备做持续集成式,就开始考虑测试数据访问层的一些问题:

  1. 难道我要在测试服务器上装一个MySQL?
  2. 数据库结构发生了变化怎么办?
  3. 怎么样才能消除测试间的依赖?
  4. 测试数据怎么管理?何况测试数据间还有那么多的逻辑?
  5. 结果如何验证?
  6. ……

这些问题在我脑海萦绕很久,《一代宗师》里说“宁在一思进,莫在一思停”,及时想破脑袋,不如直接实践。那就一个个问题来。

在继续之前,先交代一下当前程序的架构,很经典的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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值