2012-01-20 61 views
3

我正在測試一個非常簡單的Java應用程序使用JUnit 4.通過「簡單」我的意思是沒有春天,沒有休眠。我需要測試數據訪問層(JDBC,MySQL),我懷疑哪種方法更適合這種測試?在@Before上插入數據並在@After上刪除或在@Before上創建交易並在@After上回滾?JUnit:測試DAO - 回滾或刪除

謝謝!

+1

嘗試使用一些內存數據庫像HSQL DB? – Reddy

+0

@Reddy我想你應該寫作爲一個單獨的答案,因爲我認爲這是最有效的一個。 – bezmax

+0

如@布賴恩在他回答說,我想肯定的是,SQL querys是正確的,他們在MySQL的X平臺上工作。而且,在這種情況下,訪問MySQL服務器不成問題。 – Morvader

回答

4

我不同意使用MySQL以外的數據庫,因爲您可能會暴露於測試中的平臺差異,這些差異掩蓋了您的代碼與MySQL有關的問題。如果不進行大量的重構,某些代碼/ SQL可能無法在另一個平臺上工作。

但是,與其他人一致同意使用事務而不是刪除或更新來恢復狀態。一個告誡:如果你使用特效,函數等,那些可以在內部執行COMMIT,這可能會消除任何回滾JUnit更改的嘗試。也許對你來說不是一個問題,但也許是別人需要記住的問題,特別是在處理那些從未考慮過單元測試的遺留數據庫代碼時。

4

交易的原因有兩個:

  • 寫/刪除可能會更貴則回滾錯誤的
  • 餘量較小(你的代碼刪除數據可能有一個bug)
2

我還會在內存數據庫或MySQL中的臨時表中使用volatile,這些表中的連接是特定的,並在連接關閉時自動刪除。 我不會使用交易進行這種測試,因爲您可能想要實際測試交易本身。

0

無論我在哪裏工作,不同的開發人員喜歡不同的解決方案,這個問題都會一次又一次地出現。

首先,我真的不喜歡使用內存數據庫,原因如下

  1. 代碼似乎超過測試。我們發現了一個代碼庫,在內存中測試的表不存在於實際的數據庫中。
  2. 數據庫並不完全一樣,如果你在內存中使用hsql,但你的主數據庫是MySQL,那麼在語法上存在差異,日期只是名字而已。我知道你可以使用ASCII Sql,但你正在測試的東西不是你要運行的東西。會有分歧。

我更喜歡事務回滾的刪除,因爲它們在事務開始之前將數據庫保留在確切的狀態,但如果您有成千上萬的數據庫,它會顯着減慢測試速度。

我的確有時會質疑數據庫測試的價值,並且贊成在新的數據庫上運行集成測試的持續集成。這樣我們覆蓋了所有的數據訪問。 在單元測試中,我們只是用Mockito或類似的模擬工具來模擬數據訪問層。

1

事務回滾更安全,因爲測試數據庫保持不變,即使測試在測試方法和@After之前停止。

然而,提交和刪除測試中表現更好,因爲一些約束期間提交(遞延外鍵等)對新的數據來檢查,所以用回滾有一些事情你不會測試。

所以這是你的,但在大多數情況下,事務回滾是preferrable的choise(我喜歡它太)。