2010-10-25 56 views
1

當談到TDD時,我仍然遇到了一個小問題。我將如何測試數據庫邏輯?

我需要一種方法,將從數據層(linq2SQL)獲得過濾數據的某個記錄集。請注意,我正在使用從DBML生成的linq生成的類。現在問題是我想爲此寫一個測試。

做我:

一)首先插入測試記錄,然後執行方法和測試結果

B)使用,可能是數據庫中的數據。不要熱衷於這種邏輯原因,它可能會導致事情中斷。

c)你有什麼建議?

回答

5

您應該選擇選項a)。

單元測試應該是可重複的,並且必須完全在您的控制之下。因此,爲了使測試具有意義,測試本身爲執行準備數據是絕對必要的 - 只有這樣您才能依賴測試結果。

+0

我在這裏有一個問題,我現在正在編寫代碼插入記錄以及編寫代碼返回記錄。這使得代碼基礎翻番。有些東西可能會改變我如何插入記錄。 – Neale 2010-10-25 08:26:43

+0

代碼庫「雙打」 - 但它是值得的,相信我!正如托馬斯指出的那樣,重複性至關重要。 – Marijn 2010-10-25 08:42:08

+1

插入數據的代碼可以通過使用helper API(如dbUnit)來簡化。這將爲您將XML文檔轉換爲數據庫。 – 2010-10-25 12:36:37

4

使用testdatabase並在每次運行測試時清理它。或者你可以嘗試創建一個模擬對象。

+2

因爲您正在使用Linq,所以您可以選擇用'IQueryable <>'替換'ObjectSet <>'(當使用EF時),並用模擬/測試對象列表替換'IQueryable <>'您在執行測試時運行Linq查詢。 – 2010-10-25 08:20:45

1

當我使用數據庫運行測試時,通常使用內存中的SQLite數據庫。 在內存中使用db通常會使測試更快。 而且它很容易維護,因爲在關閉連接後數據庫「已經消失」。

在測試設置中,我設置了數據庫連接並創建了數據庫模式。 在測試中,我插入測試所需的數據。 (你的選項a)) 在測試拆解中,我關閉了與db的連接。

我成功地將這種方法用於我的NHibernate應用程序(howto 1 | howto 2 + nice summary),但我並不熟悉Linq2SQL。

運行SQLite和Linq2SQL的一些指針位於SO上(link 1 | link 2)。

有人認爲使用數據庫進行測試不是單元測試。使用ActiveRecord的模式時

  • 你可以有一個建築/設計,其中數據庫是很難模擬出,例如,或者當:無論如何,我相信有,你使用一個數據庫,想自動化測試情況你使用LINQ2SQL(儘管在評論之一彼得回答一個有趣的解決方案)
  • 您要運行集成測試,與應用程序和數據庫的完整體系
+0

我嘗試過使用內存中的數據庫,但啓動和設置數據庫的時間長於測試對現有(遠程)Oracle實例運行的時間。第二個好處是可以手動檢查測試失敗的東西。 – 2010-10-25 12:41:32

+0

關於開始和設置時間:這可能確實是一個問題。使用NHibernate(Castle.ActiveRecord項目)我能夠部分創建模式,省略那些未經測試的部分。 – Marijn 2010-10-25 15:43:22

+0

關於手動檢查:我看到可能的優點,但在我看來,單元測試應該指出失敗的原因,而不需要手動檢查db。 – Marijn 2010-10-25 15:46:09

0

我已經做了過去:

  • 開始事務
  • 刪除數據庫中的所有表中的所有數據
  • 設置參考數據所有的測試需要
  • 設置你的數據庫表所需要的測試數據
  • 運行測試
  • 中止事務

ŧ他的作品很好地提供了你的數據庫沒有太多數據,否則它很慢。所以你會希望使用測試數據庫。如果您有一個控制良好的測試數據庫,則可以在事務中運行測試,而無需先刪除所有數據。


嘗試設計您的系統,因此您可以模擬大部分測試的數據訪問層。 單元測試數據庫代碼是有效的(而且通常很有用),但是您的其他代碼的單元測試不需要觸摸數據庫。

您應該考慮是否可以從「端到端」系統測試中獲得更多好處,僅針對您的「邏輯」代碼進行單元測試。這在很大程度上取決於項目中的其他因素。