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

时间:2012-05-22 16:21:53

标签: java testing junit development-environment dbunit

我正在围绕现有项目设置一些测试脚手架。这包括使用JUnit和DbUnit的一些集成测试。我还设置了Jenkins安装以进行持续集成。

我的问题涉及更改开发和测试环境之间的数据库连接。我在本地安装了自己的产品堆栈,以便进行快速的临时测试和调查。在我正在开发的时候,我对我的私人数据库运行测试,因为它更快,我不会因为有问题的工作进程代码而毁掉任何其他人的日子。

签入代码后,Jenkins将运行我的测试。现在它仍然指向我的本地数据库。我更愿意让Jenkins针对不同的数据库运行测试,这个数据库位于测试环境中。

是否有最佳实践/策略/技术/等更改数据库连接以进行测试而无需更改代码?如果解决方案允许Jenkins针对多个DB运行相同的测试,那么奖励点(应该是可能的,因为DbUnit是不可知的)。


修改以获取更多信息:

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

我的组件和所有新组件都由maven管理。数据库连接当前在测试设置中是硬编码的。 DbUnit系统有效;我只是希望能够切换我的测试引用的数据库,具体取决于它们是在我的开发环境中运行,还是由Jenkins在测试环境中运行。

3 个答案:

答案 0 :(得分:5)

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

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

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>

然后,您可以通过各种方式定义test.datasource.driverClassName等属性,以告诉Maven使用不同的数据库:

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

如果您选择最后一个选项,那么您可以通过从一个Jenkins项目执行多个Maven构建来使Jenkins针对多个数据库运行,而不仅仅是通过配置文件。也就是说,为每个环境设置不同的Jenkins项目会更好。

答案 1 :(得分:1)

需要了解有关构建工具的更多信息。你在用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>

答案 2 :(得分:1)

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

这样做的一种方法是为每个环境分配一个单独的数据库,并在部署中包含该配置。这样,您就不必为代码复杂化而担心自己的环境。

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