2011-10-16 112 views
3

我想知道人們發現他們的最佳實踐是測試Hibernate映射和查詢嗎?測試Hibernate映射的最佳實踐

這不能用單元測試完成,所以我的經驗是編寫集成測試,它只向下測試DAO層。通過這種方式,我可以完全測試每個插入/更新/刪除/ ReadQueries,而無需測試完整的端到端解決方案。

每當集成測試套件運行它會: -

  1. 刪除並重新創建數據庫。
  2. 運行包含數據子集的導入SQL腳本。
  3. 在回滾事務的事務性上下文中運行每個測試。因此,它可以作爲獨立測試運行多次,或作爲套件的一部分運行,並且由於數據庫始終處於已知狀態,因此會返回相同的結果。

我從不測試一個不同的「內存」數據庫,因爲總是有一個等效的開發數據庫來測試。

我從來沒有必要使用DBUnit。

回答

4

不要爲此使用DbUnit。這種測試水平的開銷太大了。

尤其是如果您在您的應用中使用Spring,請查看Spring Test Framework以幫助管理您的數據訪問測試,特別是transaction management features

「等效開發數據庫」沒有問題,但內存中的內存將爲其他任何東西帶來速度。這很重要,因爲儘管這些測試的單元/集成狀態可能會受到爭議,但它們是您想要運行很多的測試,因此它們需要儘可能快。

所以我的DAO的測試看起來像這樣:

  1. 春季管理SessionFactoryTransactionManager
  2. Spring處理測試方法的所有事務。
  3. Hibernate在內存中的H2數據庫中創建當前模式。
  4. 測試所有保存,加載,刪除和查找方法,在對象之前和之後進行字段之間的比較。 (例如創建對象foo1,將其保存,將其加載作爲foo2,驗證foo1foo2包含相同的值。)

非常輕便,爲快速反饋有用。

+0

感謝您的反饋(和其他人!!)。知道別人做什麼非常有用。你能澄清,如果你的測試回滾插入/更新/刪除?我的想法是數據庫應該處於相同的狀態,因爲如果你想重新運行一個單獨的測試或者測試類。如果測試改變數據庫,理論上你可以改變每次運行測試的行爲。 – Alex

+0

是的。 Spring測試框架處理這個問題。 –

+0

那麼對於那些不使用彈簧的人來說最好的解決方案。 – monksy

3

如果您不依賴於專有的rdbms功能(觸發器,存儲過程等),那麼您可以使用JUnit和內存數據庫(如HSQLDB)輕鬆並全面地測試DAO。您需要通過一個類來初始化hibernate.cfg.xml仿真(用HSQLDB初始化hibernate,加載所需的hbm.xml文件),然後將提供的數據源傳遞給您的daos。

工作良好,爲開發生命週期提供了真正的價值。

+0

非常感謝您的反饋。 :) – Alex

1

我這樣做的方式與您自己的方式非常相似,除了實際使用內存數據庫(如HSQLDB)之外。它比配置真正的數據庫(在獨立服務器上運行的數據庫)更快,更便於攜帶。確實,對於某些更高級的特性,HSQLDB不起作用,因爲它不支持它們,但我注意到,當我只是集成測試我的數據訪問層時,我幾乎遇到了這些問題。但是,如果是這種情況,我喜歡使用「jar」版本的mysql,它允許我從java啓動一個功能齊全的MYSQL服務器,並在完成後關閉它。這是不是很實用的jar文件是相當大的:

http://dev.mysql.com/doc/refman/5.0/en/connector-mxj-configuration-java-object.html

,但它仍然在某些情況下是有用的。

+0

非常感謝您的反饋。 :) – Alex