簡體   English   中英

集成測試 - Hibernate和DbUnit

[英]Integration testing - Hibernate & DbUnit

我正在JUnit中編寫一些集成測試。 這里發生的是當我連續一起運行所有測試(而不是單獨)時,數據庫中持久存儲的數據總是會發生變化,測試會在執行期間發現意外數據(由前一個測試插入)。

我正在考慮使用DbUnit,但我想知道它是否重置每次執行之間的自動增量索引(因為測試還會檢查持久化實體的ID)。

謝謝

M.

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

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

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

或者,讓腳本創建測試數據庫。 DbUnit可以在這里提供幫助,其他數據庫生成器也可以提供幫助,例如LiquiBasedbmaintaindbmigrate然后您可以刪除整個數據庫並為每個測試或測試組重新創建。 隨着測試數據集變大和開銷增加,這種方法的有用性會降低。

最后一個選擇是不要讓測試依賴於生成的id,因為根據生成的值會產生脆弱的測試。 測試生成的id非常有用,所以測試一些測試的這些值,但我不確定測試所有測試的ID是否有價值。

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

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

從本質上講,問題可以通過兩種方式解決。

  1. 在事務中包裝與DB相關的測試。 在測試開始之前交易。 測試運行結束后,中止事務總是中止事務。 這樣就不會保留測試中的任何更改。

  2. 使用類似DBUnit等的東西來模擬與數據庫操作相關的類,這樣就不會有任何數據進入數據庫,並且您的類返回結果,就像數據庫操作已經完成一樣。

如果在運行測試時訪問DB,我更喜歡方法1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM