2013-07-09 19 views
1

我一直在使用Derby(嵌入式)來測試我的應用程序。它工作正常,但最近它開始給我這樣的問題,如Derby Sequence Loop in junit test測試:使用最佳嵌入式數據庫

相同的測試可以很好地與其他數據庫(例如H2)一起運行。

我的技術堆棧是Java 1.6,Spring,Hibernate。

我見過類似數據庫(H2,HSQLDB,Derby,PostgreSQL和MySQL)的比較,但比較沒有提及問題(就像我遇到的那個問題)。

那麼,哪一個是測試目的的首選?

回答

4

最佳測試數據庫與您在生產環境中運行的相同類型的相同版本在同一主機操作系統和體系結構上。

這個問題真的傾向於「你在測試中有什麼要求,但沒有讓你考慮另一個數據庫的生產」?

例如,您可能希望一個嵌入式數據庫,你可以輕鬆地啓動,並在單元測試控制破壞,而不必指定路徑外部的二進制文件,啓動和停止數據庫服務器等作爲交換,你接受這是一種妥協,你的測試不像你將要運行的真實系統那麼好。

當我在Java應用程序服務器上構建軟件時,我就像生產機器一樣運行鍼對PostgreSQL的測試。這並不像initdbpg_ctl start一個DB;如果你真的覺得需要,你甚至可以從測試包裝中做到。我認爲人們過於關注完全在線嵌入式數據庫,並沒有正確考慮這些數據庫的成本。

2

我知道有些人認爲總是使用相同的數據庫會更好。但有一些缺點:

  • 單元測試可能會非常緩慢,因爲每個數據庫調用通過TCP/IP。
  • 運行測試可能會更復雜,因爲您需要安裝和運行在本地計算機上用於生產的相同數據庫。
  • 用於生產數據庫的數據庫可能需要大量內存,而開發人員可能不需要這些內存。
  • 您可能會無意中使用只能在一個數據庫上使用的功能,這會非常困難地切換到另一個數據庫(如果您將來考慮這樣做)。

使用不同的數據庫進行單元測試當然也有缺點。如果您使用數據庫特定的功能,則有可能無法運行某些測試,或者測試的行爲不完全相同。因此,我建議使用與生產相同的數據庫來運行每晚構建。

特別是如果您使用的是像Hibernate這樣的數據庫抽象層,切換數據庫應該非常容易。在這種情況下,考慮內存數據庫(如H2,HSQLDB或Derby)確實很有意義。特別是如果你考慮寫許多(或更長時間運行)的測試。

+0

謝謝,我明白這個優點。我想知道的是這些內存中的哪一個最適合或最廣泛地用於單元測試? – adi

+0

可能是HSQLDB和H2。請注意我在H2上工作,所以我很偏向:-) –