當談到TDD時,我仍然遇到了一個小問題。我將如何測試數據庫邏輯?
我需要一種方法,將從數據層(linq2SQL)獲得過濾數據的某個記錄集。請注意,我正在使用從DBML生成的linq生成的類。現在問題是我想爲此寫一個測試。
做我:
一)首先插入測試記錄,然後執行方法和測試結果
B)使用,可能是數據庫中的數據。不要熱衷於這種邏輯原因,它可能會導致事情中斷。
c)你有什麼建議?
當談到TDD時,我仍然遇到了一個小問題。我將如何測試數據庫邏輯?
我需要一種方法,將從數據層(linq2SQL)獲得過濾數據的某個記錄集。請注意,我正在使用從DBML生成的linq生成的類。現在問題是我想爲此寫一個測試。
做我:
一)首先插入測試記錄,然後執行方法和測試結果
B)使用,可能是數據庫中的數據。不要熱衷於這種邏輯原因,它可能會導致事情中斷。
c)你有什麼建議?
您應該選擇選項a)。
單元測試應該是可重複的,並且必須完全在您的控制之下。因此,爲了使測試具有意義,測試本身爲執行準備數據是絕對必要的 - 只有這樣您才能依賴測試結果。
使用testdatabase並在每次運行測試時清理它。或者你可以嘗試創建一個模擬對象。
因爲您正在使用Linq,所以您可以選擇用'IQueryable <>'替換'ObjectSet <>'(當使用EF時),並用模擬/測試對象列表替換'IQueryable <>'您在執行測試時運行Linq查詢。 – 2010-10-25 08:20:45
當我使用數據庫運行測試時,通常使用內存中的SQLite數據庫。 在內存中使用db通常會使測試更快。 而且它很容易維護,因爲在關閉連接後數據庫「已經消失」。
在測試設置中,我設置了數據庫連接並創建了數據庫模式。 在測試中,我插入測試所需的數據。 (你的選項a)) 在測試拆解中,我關閉了與db的連接。
我成功地將這種方法用於我的NHibernate應用程序(howto 1 | howto 2 + nice summary),但我並不熟悉Linq2SQL。
運行SQLite和Linq2SQL的一些指針位於SO上(link 1 | link 2)。
有人認爲使用數據庫進行測試不是單元測試。使用ActiveRecord的模式時
我已經做了過去:
ŧ他的作品很好地提供了你的數據庫沒有太多數據,否則它很慢。所以你會希望使用測試數據庫。如果您有一個控制良好的測試數據庫,則可以在事務中運行測試,而無需先刪除所有數據。
嘗試設計您的系統,因此您可以模擬大部分測試的數據訪問層。 單元測試數據庫代碼是有效的(而且通常很有用),但是您的其他代碼的單元測試不需要觸摸數據庫。
您應該考慮是否可以從「端到端」系統測試中獲得更多好處,僅針對您的「邏輯」代碼進行單元測試。這在很大程度上取決於項目中的其他因素。
我在這裏有一個問題,我現在正在編寫代碼插入記錄以及編寫代碼返回記錄。這使得代碼基礎翻番。有些東西可能會改變我如何插入記錄。 – Neale 2010-10-25 08:26:43
代碼庫「雙打」 - 但它是值得的,相信我!正如托馬斯指出的那樣,重複性至關重要。 – Marijn 2010-10-25 08:42:08
插入數據的代碼可以通過使用helper API(如dbUnit)來簡化。這將爲您將XML文檔轉換爲數據庫。 – 2010-10-25 12:36:37