6

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

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

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

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


编辑以获取更多信息:

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

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

4

3 回答 3

5

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

例如,假设在测试期间,您设法将数据库连接参数外部化到一个名为datasource.propertiesin的文件中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 使用不同的数据库:

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

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

于 2012-05-23T19:07:35.137 回答
1

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

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

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

于 2012-05-22T16:38:26.753 回答
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>
于 2012-05-22T16:34:52.803 回答