0

我想知道其他人可能用什麼方法測試數據庫的域服務?我已經有了一系列模擬存儲庫,可以在域服務中使用它們來測試域服務本身。這些模擬存儲庫的部分構建是,他們創建樣本聚合和關聯實體,並根據模型中使用的相同業務規則進行驗證。這也提供了一個很好且簡單的方法來檢測實體本身內的潛在影響點,如果它們的界面發生變化。針對真實數據庫的單元測試域服務

我對SQL支持存儲庫的實時測試看到的主要問題是數據庫一致性。例如,一旦運行測試,「創建」方面就已經運行。由於數據庫不再是原始的,所以再次運行它們顯然會導致失敗。我正在考慮創建一個僅用於此類測試的鏡像數據庫。這將是最小的,包含結構,可編程性,約束等。我還會爲某些已建立的測試提供最小的一組數據。我的思路是,我可以調用一個存儲過程,在測試運行開始之前,使用基礎數據將數據庫重置爲「pristine」狀態。

儘管在功能初步驗證後,這對開發人員機器來說並不重要,但我更多地關注在夜間構建中運行這些測試的重要性;以便在測試失敗的情況下,構建可以被阻止以免污染目標部署環境(具體而言,在這種情況下,測試團隊將使用環境)。

我並不認爲,平臺的問題,但如果任何人有實施的具體問題,我的環境如下所示:

的Windows 7(開發)/在Windows Server 2008 R2(服務器) 的Visual Studio 2008團隊版(C#) Microsoft SQL Server 2008標準版(開發/服務器)

我正在使用Team Build來運行我的構建,但這很可能不是問題範圍中的一個因素。

回答

2

例如,一旦測試運行,「創建」方面已經運行。由於數據庫不再是原始的,所以再次運行它們顯然會導致失敗。

也許你可以讓你的單元測試交易。運行你的測試,將它們回滾,並且數據庫不變。

Spring具有事務性單元測試類,使得這很容易做到。你只需要一個事務管理器。

+0

這是一個好主意。我的存儲庫已經有一個「工作單元」模式實現,我正在使用它自動創建一個TransactionScope()。我沒有想過要添加一個Rollback()方法來處理我的Commit(),但這可能只是這種情況下最簡單的方法。 – 2009-09-12 22:41:36

+0

這工作得很好。再次感謝!比我考慮的其他方法要容易得多! – 2009-09-13 01:57:41

1

您可以使用SQL Server Express(我已經在2005年完成了這項工作,但沒有在2008年嘗試過)設置存儲爲文件的「測試套件」數據庫。這些可以簽入到源代碼控制,然後測試助手類可以(a)將它們複製到臨時文件夾,(b)寫入它們,並(c)連接到它們。要恢復原始狀態,請刪除臨時副本並重復a-c。

This is a huge pain.如果你可以通過交易(如duffymo建議),我會去那。交易的難點在於嵌套交易和分佈式交易 - 注意代碼中的交易。

+0

你是對的,它絕對看起來很痛苦!正如我在duffymo的回答中所提到的,我已通過工作單元實現在我的存儲庫中自動生成TransactionScope()。我可能會嘗試使用事務方法,因爲我真的只是想看看實現中是否存在潛在的失敗,而不是將測試鏈接在一起(即不會創建「A」,更新「A」,然後刪除「 A「作爲單獨測試。) – 2009-09-12 22:44:27

1

您可以在測試代碼中創建一堆數據工廠,這些代碼最初在測試運行啓動時運行。然後使用事務回滾方法保持原始狀態。 爲了更容易,子類化所有測試類,並將事務訪問器和回滾代碼放在那裏。回滾代碼可以設置爲在每種測試方法完成時自動運行。

0

如果你的代碼與數據庫無關,使用SQLite等內存數據庫進行單元測試(不是集成測試)會給你速度和易用性的好處(你的測試設置初始化數據庫)。

1

如果您實際上正在爲您的存儲庫執行單元測試,而這些單元測試正在擊中數據庫,那麼您並未進行單元測試。這可能是一個有用的測試,但它不是一個單元測試。這是一個綜合測試。如果你想這樣做,並將其稱爲集成測試,那就完全沒問題。但是,如果您在存儲庫中遵循了良好的設計原則,則不需要在單元測試中測試數據庫EVER。

很簡單,您的存儲庫單元測試不是根據存儲庫的輸入來測試數據庫中發生的廣泛影響;這是爲了確認對存儲庫的輸入導致對具有這樣和那樣的一組值的協作者的調用。

您會發現,與其他代碼一樣,存儲庫應該遵循單一可重置性原則。基本上,您的respoitory具有ONE和ONLY ONE可重置性,並且是將域模型API關注調解到底層數據訪問技術層(通常是ADO.Net,但可以是Entity Framework或L2S或其他)。以ADO.Net調用爲例,您的存儲庫不應承擔作爲數據層工廠的責任,而應該從ADO.Net數據接口(特別是IDbConnection/IDbCommand/IDbParameter等等)。只需將IDbConnection作爲構造函數參數,並稱之爲一天。這意味着您可以根據接口編寫儲存庫單元測試並提供模擬(或假貨或存根或任何您需要的),並確認所需的方法按預期的輸入順序進行。去看看我的MS博客這個確切的主題 - >http://blogs.msdn.com/b/schlepticons/archive/2010/07/20/unit-testing-repositories-a-rebuttal.aspx

這樣可以幫助你在未來的測試和設計中犯錯誤。

順便說一句:如果你想單元測試數據庫,你可以。只需使用Visual Studio數據庫測試。它的內置INTO vs和自VS2005以來一直存在。這並不是什麼新鮮事。但我需要告誡你,他們需要完全獨立的單元測試。