我正在设置一个持续集成服务器 (Hudson) 来构建一个 Java 项目并运行相关的单元/集成测试。大多数这些测试访问数据库,测试数据保存在 DbUnit XML 文件中。

我正在寻找一种方法来自动使测试数据库架构保持最新。当前,特定版本的 SQL 脚本存储在以发行版本命名的目录中:

└───scripts
    ├───0.1.0
    ├───0.1.1
    ├───0.1.2
    ├───0.1.4

例如,0.1.4 版本的 SQL 脚本是
scripts\0.1.4\script-0.1.4.sql

问题是这些脚本包含模式更改(例如 ALTER TABLE ...)和静态表更改(例如向 USER_TYPE 表添加新角色)的混合。

在单元测试的情况下,我只想应用架构更改,因为如上所述,单元测试的所有数据都保存在 DbUnit XML 文件中。虽然我可以将这两种类型的数据库更改分离到不同的文件中,但架构更改和数据更改之间通常会存在依赖关系,当发布应用于 QA、生产等时,需要以某种方式强制执行。

无论如何,这只是一种非常冗长的方式来询问是否有人提出了一种强大的方法来自动保持他们的测试模式最新?我知道 Unitils 对保持测试模式最新有一些支持,但我不确定它是否可以“忽略”SQL delta 脚本中的数据更新语句。

最佳答案

之前的一张海报将 Liquibase 列为一个选项,但他们没有提到 Liquibase 定义在特定上下文中运行的规则的能力 (Contexts in Liquibase)。这允许您将架构更新标记为未标记任何特定上下文,并将单元测试的装置标记为 test 的上下文。这样,夹具只会在您运行单元测试时插入。

以下是包含架构和装置的 Liquibase 更改集示例:

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.9 http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd">
  <changeSet author="avalade" id="1">
    <createTable tableName="users">
      <column autoIncrement="true" name="id" type="long">
        <constraints nullable="false" primaryKey="true" />
      </column>
      <column name="email" type="varchar(255)" />
    </createTable>
  </changeSet>
  <changeSet author="avalade" id="2" context="test">
    <insert tableName="user">
      <column name="id" value="1" />
      <column name="email" value="[email protected]" />
    </insert>
  </changeSet>
</databaseChangeLog>

然后,如果您使用 Spring 来管理您的 DAO,您可以将以下内容放入您正在部署的应用程序上下文文件中:
<bean id="liquibase" class="liquibase.spring.SpringLiquibase">
  <property name="dataSource" ref="dataSource" />
  <property name="changeLog" value="classpath:dbChangelog.xml" />
</bean>

对于您在单元测试中使用的应用程序上下文文件,请使用附加上下文属性配置 Liquibase:
<bean id="liquibase" class="liquibase.spring.SpringLiquibase">
  <property name="dataSource" ref="dataSource" />
  <property name="changeLog" value="classpath:dbChangelog.xml" />
  <property name="contexts" value="test" />
</bean>

这样,您可以将所有数据库定义放在一个地方,并且仅在运行测试代码时插入您的设备。

关于java - 持续集成 : keeping the test DB schema up-to-date,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/461581/

10-16 12:22