为Java项目的单元测试自动更新数据库模式

为Java项目的单元测试自动更新数据库模式,java,database,unit-testing,schema,Java,Database,Unit Testing,Schema,我有一个Java项目,需要在执行单元测试之前用新模式填充数据库。Maven用于构建项目。Unitils用于单元测试。 我的计划是按以下顺序执行以下脚本: 删除/创建数据库脚本dropcreate.sql 模式脚本Schema.sql 引用数据脚本Reference.sql 另一个好处是,如果引用数据脚本无法执行,我可以看到它是否不再与模式匹配。 我已经使用Maven的hibernate3插件在构建时生成了模式脚本。我还使用maven antrun插件将这些脚本按执行顺序复制到同一目录

我有一个Java项目,需要在执行单元测试之前用新模式填充数据库。Maven用于构建项目。Unitils用于单元测试。

我的计划是按以下顺序执行以下脚本: 删除/创建数据库脚本dropcreate.sql 模式脚本Schema.sql 引用数据脚本Reference.sql

另一个好处是,如果引用数据脚本无法执行,我可以看到它是否不再与模式匹配。

我已经使用Maven的hibernate3插件在构建时生成了模式脚本。我还使用maven antrun插件将这些脚本按执行顺序复制到同一目录target/dbscripts中,如下所示: 001_dropcreate.sql 002_schema.sql 003_reference.sql

计划是让unitils的dbMainer部分通过使用src/test/resources中的以下经过消毒的unitils.properties文件来运行脚本,如中所述: database.driverClassName=com.sybase.jdbc3.jdbc.SybDriver database.url=jdbc:sybase:Tds:mydatabase.server.example.com:9000/my_database database.userName=myusername database.password=mypassword database.dialect=org.hibernate.dialect.SybaseDialect database.schemaNames=dbo DatabaseModule.Transactional.value.default=disabled org.unitils.core.dbsupport.DbSupport.implClassName=org.unitils.core.dbsupport.MsSqlDbSupport DbUnitModule.DataSet.loadStrategy.default=com.example.dao.SybaseCleanInsertLoadStrategy updateDataBaseSchema.enabled=true dbMaintainer.script.locations=target/dbscripts dbMaintainer.cleanDb.enabled=true dataSetStructureGenerator.xsd.dirName=target/xsd

Unitils可以很好地加载数据集并执行单元测试,但它似乎从未运行过脚本。我肯定我忽略了一些简单的事情。

另一种选择是使用SQLMaven插件,但我无法在流程测试资源期间执行它,所以我现在提出了这个想法。

我如何让Unitils实际执行SQL,如果可能的话,如果SQL无法执行,如何让Unitils失败?

你能提供更多的信息吗? 日志里有什么东西吗?它应该提到如下内容: 检查是否必须更新数据库

您确定在测试执行时目标/dbscripts中有脚本吗

是否加载了任何unitils-local.properties,其中updateDataBaseSchema属性设置为false

现在unitils仍然使用自己版本的DBMainer。在下一个版本中,将完全集成DBMain本身,下周将发布一个alpha

请注意,dbmaintain还有maven任务来运行数据库脚本。更多信息请访问www.dbmaintain.org

brgds,
蒂姆

使用类似的东西会让生活更轻松吗?它负责创建和填充用于测试的表。

该项目目前有90多个测试类已经在使用Unitils。在这一点上进行更改将是一项巨大的工作。对开发机器的文件搜索没有发现unitils-local.properties。检查是否必须更新数据库的消息。在database.DatabaseModule之后存在,但在database.DatabaseModule之后没有。数据库以前从未使用unitils进行过更新,我是否需要从空白数据库开始?您是否会收到诸如“数据库是最新的”或“已找到数据库更新脚本并将在数据库上执行”之类的日志记录,我怀疑有一个异常,例如dbmaintain_scripts表不存在。考试失败了吗?您可以从IDE运行测试吗?如果缺少的是dbmaintain_scripts表,并且它是一个单元测试数据库,则可以通过设置dbMainer.autoCreateExecutedScriptsTable=True自动创建它。感谢您的帮助,但开发团队已确定Sybase可能是原因。我们已经尝试过使用unitils、Maven SQL插件、sqsh和其他一些工具,但是运行这些脚本的唯一方法是使用本机ISQL。我们有最终离开Sybase的计划,希望这将允许我们以这种方式使用Unitils。再次感谢所有的帮助。