2012-05-22 50 views
5

我正在为现有项目设置一些测试脚手架。这包括一些集成测试,使用JUnit和DbUnit。我还为持续集成建立了Jenkins安装。JUnit + DbUnit:在开发和测试环境之间切换数据库连接

我的问题涉及更改开发和测试环境之间的数据库连接。我在本地安装了自己的产品堆栈,用于快速临时测试和调查。正如我正在开发的那样,我对我的私人数据库运行测试,因为它速度更快,而且我不会因为错误的正在运行的代码而毁掉其他人的一天。

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

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


编辑更多信息:

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

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

回答

5

假设您可以将测试的数据库连接参数外化为.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> 

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

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

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

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> 
+0

当谈到Spring时,我很尴尬,但是我知道的很少让我相信它可能是一个有用的解决方案。我的印象是你在xml中配置了数据源,并注释你的类用于运行时依赖注入。 Spring能够根据环境更改注入哪个数据库(开发与测试)? –

+0

对于使用XML配置数据库连接是正确的。但是,对于你想要完成的任务,我认为你应该专注于Maven将为你做什么,以及如何利用你的构建的Maven属性和配置文件来定制你的构建并运行你的测试。 Maven可以运行你的单元测试,它的资源只在测试阶段使用,然后它可以为你的主构建使用另一组资源,这些资源适用于任何环境。 Jenkins运行maven构建,因此您可以在您的机器上模拟Jenkins将要做的完全相同的事情。 – BenSchro10

1

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

一种方法是在每个环境中单独配置一个数据库,并将其包含在您的部署中。这样你就不必复杂化你的代码,只需要担心你的环境是什么。

另一种方式是将环境传递给你的程序,让你的代码找出使用哪个配置。

+0

我编辑了我的帖子以包含更多信息。我很好奇你提到的“独立数据库配置”的格式。那是一个.properties文件(使用ResourceBundle)还是一个XML(使用其他工具),或者其他的东西?我可以将jdbc连接字符串放在一个文件中并读取该文件,但这感觉很糟糕。我的假设是,存在一种工具/练习/格式可以以更标准的方式来实现。我只是不知道标准是什么。 –

+0

.propreties文件或XML。我会自己使用.properties文件,我非常鄙视XML。 –

相关问题