2012-05-22 59 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。 –

相關問題