我正在测试使用SQL Server数据库的应用程序。出于测试目的,我真的希望能够使用内存数据库,如HSQL。我实际上已经运行了我的测试,但我仍然有一个难点 - 我很难生成一个可以用来构建我的HSQL数据库的SQL脚本。由于该系统仍处于开发阶段,因此可以并且确实发生了数据库更改,因此我不想将所有时间都花在手动更新SQL脚本上。
在SQL Server Management Studio中,我可以生成一个脚本来构建该数据库。但是,该脚本包含许多SQL Server特定的“内容”。因此,我不能将该脚本带到HSQL并让它执行。相反,我需要花费大量时间来撕掉那些在HSQL中无效的东西。
一位同事建议使用PowerBuilder来生成脚本,虽然它生成的脚本有点干净,但它仍然不会在HSQL中“按原样”运行。
任何人都可以建议一种方法(工具,流程等),我可以用它来指向SQL Server数据库,并自己生成一个脚本,在HSQL中构建完全相同的数据库吗?
谢谢!
答案 0 :(得分:2)
假设您正在使用Hibernate,您可以在测试用例中配置Hibernate,以便在创建sessionFactory
时创建表。
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>...hbm file...</value>
...
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
...
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
</bean>
此方法的唯一缺点是,如果您的HBM文件没有与物理SQL Server数据库匹配的设置(例如,您省略了HBM文件中的某些约束或列),那么HSQL中创建的表是会有所不同。
答案 1 :(得分:2)
正如limc给出的答案的后续行动一样,这就是我能够做到的。
我正在使用Spring和Hibernate,所以我能够获取Spring数据配置文件并将其转换为:
<bean id="sessionFactory" name="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
...hbm files...
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${db.dialect}</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.use_sql_comments">false</prop>
<prop key="hibernate.hbm2ddl.auto">${ddl.create}</prop>
</props>
</property>
</bean>
有了这个,我能够通过propertyConfigurer配置来填充占位符,如下所示:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:test-messages.properties</value>
</property>
</bean>
</beans>
我有一个用于测试的文件,还有一个用于我的生产代码。上面显示的是我的测试版本,并引用文件test-messages.properties,如下所示:
db.dialect=org.hibernate.dialect.HSQLDialect
ddl.create=create
这实际上非常有效,因为我可以通过使用占位符和propertyConfigurer构造重用几乎所有的生产配置文件。我的测试环境需要的唯一额外文件是propertyConfigurer配置文件和它们指向的属性文件。
谢谢,limc!
顺便说一句,我确实看到了limc提到的问题。此系统旨在部署以连接到生产中的SQL Server数据库,该数据库不会通过hbm2ddl创建。因此,如果我的HBM文件中有错误,我的测试可能都可以正常工作,而我可能仍会在生产中出现故障。
一方面,我对此非常不满,但另一方面,我实际上可以以完全独立的方式对数据库运行测试用例。有了这个解决方案,有人可以从源代码控制中检查这个项目,并立即运行测试用例,而无需进行任何类型的数据库设置。我也喜欢那个。不幸的是,我还没有找到一个非常棒的方法来兼顾两者。
答案 2 :(得分:0)
有跨引擎数据库迁移的工具。可以完成这项工作的一个工具是http://liquibase.org/