Java JUnit+;DbUnit:在开发和测试环境之间切换数据库连接

Java JUnit+;DbUnit:在开发和测试环境之间切换数据库连接,java,testing,junit,development-environment,dbunit,Java,Testing,Junit,Development Environment,Dbunit,我正在一个现有项目周围搭建一些测试脚手架。这包括一些使用JUnit和DbUnit的集成测试。我还设置了一个Jenkins安装,用于持续集成 我的问题涉及更改开发和测试环境之间的DB连接。我在本地安装了自己的产品堆栈,以便进行快速的特别测试和调查。在我开发的过程中,我对我的私有数据库运行测试,因为它更快,而且我不会因为有缺陷的正在进行的工作代码而毁了别人的一天 一旦代码签入,Jenkins将运行我的测试。现在它仍然指向我的本地数据库。我更喜欢让Jenkins对不同的数据库运行测试,一个在测试环境中

我正在一个现有项目周围搭建一些测试脚手架。这包括一些使用JUnit和DbUnit的集成测试。我还设置了一个Jenkins安装,用于持续集成

我的问题涉及更改开发和测试环境之间的DB连接。我在本地安装了自己的产品堆栈,以便进行快速的特别测试和调查。在我开发的过程中,我对我的私有数据库运行测试,因为它更快,而且我不会因为有缺陷的正在进行的工作代码而毁了别人的一天

一旦代码签入,Jenkins将运行我的测试。现在它仍然指向我的本地数据库。我更喜欢让Jenkins对不同的数据库运行测试,一个在测试环境中的数据库

是否有一种最佳实践/策略/技术/等,用于在不必更改代码的情况下更改数据库连接以进行测试?如果该解决方案允许Jenkins对多个DBs运行相同的测试,则可以获得额外的积分(因为DbUnit是不可知的)


编辑以获取更多信息:

该产品是一个大型产品,有几十个不同的交互组件(通常在单独的VM/进程中)。在实时系统中,不同的进程通常通过数据库进行通信。也就是说,UI进程将更改写入表中,后端进程轮询该表中的更改。是的,太可怕了。对于集成测试,我使用UI配置系统,并使用DbUnit捕获该状态。然后,我可以对该“输入”运行测试


我的组件和所有新组件都由maven管理。DB连接目前在测试设置中是硬编码的。DbUnit系统工作正常;我只希望能够根据测试是由我在开发环境中运行还是由Jenkins在测试环境中运行来切换测试引用的数据库。

需要了解有关构建工具的更多信息。你在用Maven吗?数据库连接信息存储在哪里?你在用弹簧吗

我现在这样做了,我使用Maven和我的主数据库连接的属性,以及我的测试数据库连接的一组单独的属性

因为我使用Spring,所以在maven测试资源中有一个applicationContext文件,它保存我的数据源bean并引用测试属性

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-    method="close">
    <property name="driverClassName" value="${test.jdbc.driverClassName}"/>
    <property name="url" value="${test.jdbc.url}"/>
    <property name="username" value="${test.jdbc.username}"/>
    <property name="password" value="${test.jdbc.password}"/>
    <property name="maxActive" value="100"/>
    <property name="maxWait" value="1000"/>
    <property name="poolPreparedStatements" value="true"/>
    <property name="defaultAutoCommit" value="true"/>
</bean>

很大程度上取决于您的部署环境。如果要部署到容器(tomcat、jboss等),那么使用JNDI连接将使您与DB环境隔离。如果您正在构建一个独立的java程序,那么您必须自己确定环境,并选择要使用的db连接配置文件

实现这一点的一种方法是为每个环境提供单独的数据库配置,并将其包括在部署中。这样,您就不必担心您的环境是什么,从而使代码复杂化


另一种方法是将环境传递给程序,让代码确定要使用的配置。

假设您可以将测试的数据库连接参数外部化到
.properties
.xml
文件中,并且您正在使用Maven,那么一种方法是使用Maven属性(可选配置文件)定义每个环境,并使用资源筛选将这些属性配置到配置文件中

例如,假设在测试期间,您设法将数据库连接参数外部化到
src/test/resources
中名为
datasource.properties
的文件中,该文件如下所示:

datasource.driverClassName = ${test.datasource.driverClassName}
datasource.url = ${test.datasource.url}
datasource.username = ${test.datasource.username}
datasource.password = ${test.datasource.password}
您的POM中有以下内容:

<build>
  <testResources>
    <testResource>
      <directory>src/test/resources</directory>
      <filtering>true</filtering>
    </testResource>
  </testResources>
</build>

src/测试/资源
真的
然后,您可以以各种方式定义
test.datasource.driverClassName
等属性,告诉Maven使用不同的数据库:

  • 您可以在POM的
    部分定义默认值
  • 您可以在每个开发人员(和Jenkins')
    settings.xml的
    部分定义特定于用户的数据库
  • 您可以在POM中为不同的环境定义一些配置文件(例如,
    开发
    詹金斯
    其他数据库
    ),并使用不同的配置文件运行构建

如果您选择最后一个选项,那么您可以通过从一个Jenkins项目执行多个Maven构建来让Jenkins针对多个数据库运行,这只因配置文件不同。也就是说,对于每个环境,最好有不同的Jenkins项目。

我编辑了我的帖子,以包含更多信息。我对您提到的“独立数据库配置”是一个.properties文件(使用ResourceBundle)还是一个XML(使用其他工具)我可以把jdbc连接字符串放在一个文件中并读取该文件,但这感觉有点黑客味。我的假设是有一个工具/实践/格式可以以更标准的方式来实现这一点。我只是不知道什么是标准..propreties文件,或者XML。我自己也会使用.properties文件,我非常鄙视XML。我是emba对于Spring来说,这是一个不太可能的问题,但我所知甚少,这让我相信它可能是一个有用的解决方案。我的印象是您使用xml配置了数据源,并为运行时依赖项注入注释了类。Spring是否能够根据环境更改注入的DB(开发vs.测试)?关于XML中数据库连接的配置,您是正确的。但对于您试图实现的目标,我认为您真的应该关注Maven将为您做什么,以及如何利用Maven属性和构建的概要文件来定制您的构建和运行您的测试。Maven可以运行您的单元测试,并且它拥有足够的资源at仅在测试阶段t中使用