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

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

        翻看之前的文章才发现,最近一次记录持续集成竟然是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

<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>
目录
相关文章
|
23天前
|
敏捷开发 测试技术 持续交付
探索软件测试中的自动化与持续集成
在快速迭代的软件开发环境中,自动化测试和持续集成(CI)已成为确保产品质量和加速交付的关键策略。本文将深入探讨自动化测试的基本原理、实施步骤以及它如何与持续集成流程相结合,以提高软件开发的效率和可靠性。我们将通过实际案例分析,展示自动化测试和CI的最佳实践,以及它们如何帮助企业实现更快的市场响应时间和更高的客户满意度。
56 16
|
24天前
|
jenkins 测试技术 持续交付
软件测试中的自动化与持续集成:提升效率与质量的关键
在快节奏的软件开发环境中,自动化测试和持续集成已经成为不可或缺的部分。本文将探讨自动化测试和持续集成的重要性,以及它们如何协同工作以提高软件开发的效率和质量。通过分析自动化测试的策略、工具选择以及持续集成的实践,我们将揭示这些技术如何帮助开发团队快速响应变化,减少错误,并加速产品上市时间。
|
24天前
|
机器学习/深度学习 人工智能 jenkins
软件测试中的自动化与持续集成实践
在快速迭代的软件开发过程中,自动化测试和持续集成(CI)是确保代码质量和加速产品上市的关键。本文探讨了自动化测试的重要性、常见的自动化测试工具以及如何将自动化测试整合到持续集成流程中,以提高软件测试的效率和可靠性。通过案例分析,展示了自动化测试和持续集成在实际项目中的应用效果,并提供了实施建议。
|
9天前
|
jenkins 测试技术 持续交付
软件测试中的自动化与持续集成
在现代软件开发过程中,自动化测试和持续集成已成为不可或缺的组成部分。本文将深入探讨自动化测试和持续集成的重要性、优势以及如何有效实施它们以提升软件质量和开发效率。通过具体案例分析,我们将展示这些技术如何在实际项目中发挥作用,并讨论其面临的挑战及应对策略。
28 3
|
23天前
|
jenkins 测试技术 持续交付
探索自动化测试在持续集成中的应用与挑战
本文深入探讨了自动化测试在现代软件开发流程,特别是持续集成(CI)环境中的关键作用。通过分析自动化测试的优势、实施策略以及面临的主要挑战,旨在为开发团队提供实用的指导和建议。文章不仅概述了自动化测试的基本原理和最佳实践,还详细讨论了如何克服实施过程中遇到的技术难题和管理障碍,以实现更高效、更可靠的软件交付。
|
15天前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
23 6
|
14天前
|
监控 jenkins 测试技术
探索软件测试中的自动化与持续集成####
本文旨在探讨软件测试中自动化测试与持续集成(CI)的融合实践,分析其对提升软件开发效率和质量的重要性。通过深入剖析自动化测试的优势、持续集成的核心概念以及两者结合的最佳实践案例,揭示这一技术趋势如何重塑现代软件开发流程。文章还将讨论实施过程中的挑战和应对策略,为读者提供一套实用的方法论指导。 ####
|
17天前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段。本文介绍了 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,强调了样本量、随机性和时间因素的重要性,并展示了 Python 在 A/B 测试中的具体应用实例。
24 1
|
27天前
|
敏捷开发 Devops 测试技术
自动化测试中的持续集成与持续部署
在现代软件开发实践中,自动化测试是确保软件质量和快速迭代的关键。本文将探讨自动化测试如何与持续集成(CI)和持续部署(CD)流程相结合,以提高开发效率和软件质量。我们将分析CI/CD管道中自动化测试的最佳实践,以及如何克服实施过程中的挑战。
37 6