2010-05-03 63 views
4

我在JUnit中編寫了一些集成測試。這裏發生的事情是,當我在一行(而不是單獨)中一起運行所有測試時,數據庫中保存的數據總是會更改,測試在執行期間會發現意外數據(由以前的測試插入)。我想使用DbUnit,但我不知道它是否重置每次執行之間的自動遞增索引(因爲測試還檢查持久化實體的ID)。集成測試 - 休眠和DbUnit

感謝

M.

回答

9

這是一個最好的做法是把你的數據庫中已知的狀態前的測試執行和DBUnit的提供所需的一切。但不要依賴於自動遞增的列,也可以將它們放在DBUnit數據集中。優點:您可以在執行失敗的測試後手動驗證數據庫狀態。缺點:您需要設置和維護數據集。

另一種方法是在事務內部運行每個測試方法(並在執行結束時回滾事務)。優點:數據更容易設置和維護(在數據庫中)。缺點:修復失敗的測試不太方便。

1

本質上那朵問題可以從兩個方面來解決。

  1. 在交易中包裝與數據庫相關的測試。在測試之前開始交易。測試運行結束後,中止交易將中止交易。這樣,測試中所做的任何更改都不會被保留。

  2. 使用類似DBUnit等的東西來模擬DB操作相關的類,以便數據不會傳到DB,並且您的類像DB操作一樣返回結果。

如果您運行測試時訪問DB我更喜歡接近1

3

您可以將單個測試或適用的測試組作爲單個事務運行,然後在最後回滾。 (如果測試本身包含多個事務並且您的db不支持嵌套事務或保存點,則這可能很困難。)

或者,讓您的測試數據庫由腳本創建。與其他數據庫生成器一樣,DbUnit也可以提供幫助,例如LiquiBase,dbmaintain,dbmigrate然後,您可以刪除整個數據庫併爲每個測試或測試組重新創建。隨着測試數據集變大並且開銷增加,這種方法的有用性會降低。

最後一個選項是不讓你的測試依賴於生成的id,因爲根據生成的值會產生脆弱的測試。測試生成的id很有用,因此爲某些測試測試這些值,但我不確定在測試所有測試的Id時是否有價值。

編輯:OP詢問有關使用休眠來重新創建架構。這可以通過爲每個測試創建一個新的SessionFactory並在構建SessionFactory時將「hibernate.hbm2ddl.auto」設置爲「true」來安排。我提到drop-create的效用越來越小 - 它也適用於這種情況。

+0

如何強制Hibernate手動重置模式?也許在我的基礎測試類的@After方法。 – Mark 2010-05-03 19:19:39

+0

當然,如果你的模式目前已經被hibernate管理,那麼這是一種可能性。我在回答中增加了一些額外的內容。 – mdma 2010-05-03 20:32:04

+0

請注意儘管可能的話,爲每個測試重新創建模式並不會擴展,而且確實很慢。這不是一個好主意IMO。 – 2010-05-04 08:05:10

2

在測試中依靠id值是不好的,因爲自動增量只是數據庫特定的。所以我永遠不會檢查ID的,因爲如果你這樣做,你的測試取決於實體充滿特殊的ID值,這不是一個真實的例子。測試應該獨立於自動增量ID。