2013-03-11 102 views
2

可以說我有一個像下面這樣的類。如何寫數據庫集成測試

我不知道如何編寫一個單元/集成測試。它需要重構嗎?

它只是添加一個Add/Find方法(它實際上會有),在測試中調用Add,然後調用Delete,然後調用Find?

public class Repository 
{ 
    public void DeleteProduct(int id) 
    { 
     var connstring = ""; //Get from web.config 
     using(SqlConnection conn = new SqlConnection(connstring)) 
     { 
      conn.Open(); 
      SqlCommand command = new SqlCommand("DELETE FROM PRODUCTS WHERE ID = @ID") 
      command.Paramaters.Add("@ID", id) 
      command.ExecuteNonQuery(); 
     } 
    } 
} 
+0

我想指出你剛發佈的另一個問題分鐘前:http://stackoverflow.com/questions/15340569/tdd-100-coverage-for-methods-that-wrap-sql/15340652?noredirect=1 #comment21666041_15340652 – 2013-03-11 14:24:05

+0

作爲存儲庫的集成測試,您對我的建議似乎也可以。添加,然後刪除,然後檢查它是否仍然在數據庫中。但是,我更喜歡圍繞用例進行集成測試,而不是類。 – 2013-03-11 14:26:30

回答

1

我的建議 - 爲存儲庫編寫集成測試(因爲您使用的是用於數據訪問的框架),除非您在存儲庫中執行的CRUD超過了CRUD。

Add/Find是單獨的Repository方法,它們需要自己進行測試。

我會推薦使用Setup來設置種子數據,你知道你可以採取行動。在這種情況下,將記錄插入Products表中。

然後採取行動:呼叫Repository.Deleteproduct(<product id created in setup>)

斷言:在安裝時創建的產品將被刪除(再次查詢數據庫來檢查)。

如果您使用的是ORM,那麼此測試也會測試產品的映射。

2

黃金法則不是測試framewkrk的代碼。除非這種方法沒有定製邏輯,否則沒有什麼可測試的。 我認爲你想要實現的是分開Repository以簡化單元測試。做到這一點的最佳方式是爲您的存儲庫創建界面並對其進行模擬。 如果你真的想創建一些集成測試,那麼你必須創建一些測試數據庫,在那裏你可以做你的核炸彈實驗。

0

我從來沒有爲數據庫調用添加單元測試。這絕對是一個集成測試。沒有什麼可觀察的你檢查。

我知道Java有一些適用於JUnit的工具。 IT要求您編寫模仿前後模式的XML文件,然後將表格內容與XML文件進行比較。我相信.Net會有類似的東西。但我不確定這是否值得。我發現這些測試非常脆弱,價值很低。

我建議採取實用的方法,不要爲數據庫對象編寫測試。而是測試那些與數據庫對象交互的對象。