這可能已經問了很多次,但這裏有雲:如何單元測試數據庫類
我有一類完全DB連接
開放連接
查詢數據庫
讀值
收盤連接
我應該如何測試這個東西?
我是否需要創建一個假數據庫? 我想我可以模擬MySql類(用於C#),但這也是很多工作。
一些陳述是「INSERT INTO」,我應該怎麼做呢?
這可能已經問了很多次,但這裏有雲:如何單元測試數據庫類
我有一類完全DB連接
開放連接
查詢數據庫
讀值
收盤連接
我應該如何測試這個東西?
我是否需要創建一個假數據庫? 我想我可以模擬MySql類(用於C#),但這也是很多工作。
一些陳述是「INSERT INTO」,我應該怎麼做呢?
難以測試的東西通常是tightly coupled或不在Single Responsibility principle之後。
首先。拆分你的數據層。看看repository pattern。每個實體(表或視圖)應該有它自己的類獲取數據。
使用數據接口而不是特定的驅動程序實現:IDbConnection
而不是SqlConnection
。使用DbProviderFactory
來獲得正確的連接實現。然後使用connection.CreateCommand()
來獲取命令等。
這樣做會使測試數據層變得容易很多。請記住,datalyer不應該有任何邏輯。它的唯一目的是從數據源加載數據。
但是,如果你不想改變的東西:對數據庫的工作是最簡單的方法。刪除所有數據並在每次測試之前插入新的測試數據(以刪除先前測試期間的任何更改)。
好,但要小心這些單元測試是否並行運行 - 在這一點上,第二次測試將擦除第一次測試所需的數據。如果測試框架發生了變化,或者新版本更改了測試執行順序,則會發生這種情況。我最近調試了這個確切的問題。 – 2011-11-21 11:27:24
最簡單的做法是創建一個新的測試數據庫並製作一些插入查詢,然後將結果集存儲在一個列表或其他東西中,然後使用調試器運行它,以查看它是否將結果集存儲在列表中創建。
不要在源代碼中插入任何插入內容,請使用sql管理工作室並在其中插入內容,直到您知道連接和一切正常。現在就列出所有這些值。
您可以使用在本機上運行的實時MySql數據庫。
我已經做了NuGet包用於此目的,可以添加到您的項目:https://github.com/stumpdk/MySql.Server
它每次運行測試時啓動一個本地MySQL服務器。它很快,爲您的團隊提供了可共享的解決方案,而且您不必花費時間安裝服務器。
如果您認爲某個問題可能已經被詢問bofore,您應該[搜索它](http://stackoverflow.com/search?q=unit+test+database+class)。 – meagar 2010-10-26 20:38:12