4

我的Play應用程序使用postgres。它包含一些特定於postgres的進化,這使得我無法使用內存中的h2數據庫進行測試。例如,下面的進化是在Postgres的罰款,但在H2(甚至MODE=PostgreSQL)失敗:在Play中,我可以根據數據庫類型應用不同的Evolution嗎?

alter table ac_host rename column base_url to baseurl; 

的H2相當於是:

alter table ac_host alter column base_url rename to baseurl; 

我想在一些用H2我測試,但嘗試這樣做是因爲h2不兼容的演變而在應用程序初始化時失敗。有沒有辦法解決這個問題通過指定取決於數據庫類型的替代演變?

回答

3

測試純粹主義者和蛋糕圖案的球迷可能不會喜歡這個答案,但我們遇到了同樣的問題,因爲你已經和正在做以下幾點:

我們正在使用的數據庫default用於運行應用(上測試生產系統),但對於自動化測試(使用play test),我們使用單獨的test數據庫配置,它有自己的發展,並且運行在H2而不是PostgreSQL上。

在玩,你可以檢查,如果您當前運行的測試模式,並可以相應地切換數據庫:

lazy val default = Database.forDataSource { 
    val defaultSource = current.configuration.getString("db.test.url").fold("default")(_ => "test") 
    new play.api.db.DB.getDataSource(defaultSource) 
} 

具有單獨的變陣爲自動化測試還有其他一些優點也:你可以用一些基本的填充數據庫測試數據可能與您的其他測試系統不同。

希望有所幫助。

1

不久之後:只有您的解決方案是git和幾個分支。

順便說一句,雖然Play支持很多數據庫引擎,但它並不是假設,相同的產品具有如此的靈活性。你自己向我們展示了原因 - 數據庫有很大差異,寫一個適用於不同數據庫的進化常常是失敗的(許多引擎甚至沒有像compatibility mode這樣的東西

在現實生活中它可以被描述爲: 梅賽德斯 - 奔馳生產的汽車用汽油發動機,並柴油,我買的是最後的選擇,但要與汽油使用它。

從我們(一般webdevs)的經驗,我們發現,工作在不同的引擎,甚至相同引擎的不同版本可能帶來意想不到的錯誤,因此拇指的規則是項目中的所有開發人員都使用相同的版本在生產上。這樣可行。

+0

根據我的經驗,如果您爲單元測試使用不同的內存數據庫,它可能是一個非常好的設置。 Liquibase對此非常有用,因爲它可以定製它發出的針對多個數據庫供應商的SQL。 –

相關問題