2011-07-19 30 views
2

我們目前正在使用針對數據庫運行的測試來練習測試驅動開發。此數據庫在開發人員計算機上本地運行,但在架構或數據更改時它們都會同步到主數據庫。如何在單元測試中管理陳舊的數據庫數據?

這已經持​​續了幾年,現在我們發現,數據變得非常陳舊的新功能被添加到該產品。

將數據添加到測試數據庫已經通過GUI成爲「不可能」,因爲簡單的變化可以打破上百次試驗 - 我們已經變得更好。在寫那麼脆弱測試,但現在爲時已。

我們可以用什麼樣的策略來管理這個問題?

我們考慮過複製生產數據庫,並開始編寫任何新的測試。我可以看到問題隨着時間的推移而重複出現,這會給我們的代碼庫添加混亂。

回答

0

我不確定這是否適合您...當我遇到這個問題時,我開發了一個「確保...」庫,檢查數據庫中特定對象的狀態,以及如果沒有,就迫使它處於該狀態。每個測試都負責設置「確保」它所需的一切都在那裏。

此外,還有一些不被每次測試查了一些全球性問題,因爲它們需要很長的時間,而不是通過測試修改 - 他們通常會設置在自動套件運行的開始,並且通常不用於單獨的測試運行。如果單個測試因爲看起來可能是此設置的一部分的問題而中斷,那麼我只需手動運行它。

這不是東西,我就決定做一天,然後做了這一切。我慢慢地修復了測試,因爲我不得不對它們進行測試 - 通常是因爲它們因爲你描述的那種問題而崩潰。 「確保......」圖書館也是逐漸發展起來的 - 在需要之前什麼也不放過。

希望這會有所幫助!

1

我個人不認爲需要外部資源的測試,如數據庫,JMS隊列等服務,...等是單元測試。我把它們稱爲「集成測試」。

話雖這麼說,有必要建立一個圍繞自己的一套單元測試或有時層。當數據庫包含表示不同場景的數據時,您可能想要測試代碼的行爲方式,其中一些場景可能無法在您的開發數據庫中隨時獲得。我發現最有用的是讓我的單元測試構建一個內存數據庫(例如使用H2)並將其加載到不同測試所需的不同數據集中。 Hibernate相當容易,您可以根據關係映射文件來創建模式。然後,您只需在其中插入測試用例所需的數據。這很好,因爲:

  1. 數據在內存中創建,因此不會影響其他任何使用數據庫的人。
  2. 不希望有任何外部資源可用(例如,如果數據庫不可用,您的單元測試會失敗,因爲運行它的開發人員花了一天的時間?可能不是!)
  3. 我可以測試不同的數據場景這可能不會在一個數據庫中同時共存。