2010-06-26 211 views
3

This question about unit tests引發了另一件困擾着我的事情。我有三種方式來回敲擊數據庫時進行單元測試。單元測試和數據庫

  1. 創建模擬對象並將它們插入。這具有不需要數據庫的優點,但這很耗時,而且我不確定我得到的投資有多少回報。我一直在進入國際奧委會和moq一點點,但它似乎仍然很痛苦。
  2. 創建一個setup和teardown數據庫腳本來創建已知的案例,並對這些案例進行測試。再次,可以是時間密集型的,但大多數時候仍然比模擬對象更容易創建。而其他人在工作時仍然可以運行它,假設他們在本地主機上有SQL服務器。
  3. 手動檢查開發數據庫並修改單元測試。大量手動工作,但如果我有一個「測試集」不改變,它似乎工作正常。在我的機器上,至少:-)。

我知道選項1是「正確」的方式做單元測試,而是三個,這可能是我用的最少的(儘管最新的項目已經與國際奧委會的選項,使門對我開放)。我意識到這很大程度上取決於究竟是什麼被嘲笑和什麼被測試,但我在這裏錯過了什麼?

如果上下文有幫助,我在C#商店,編寫內部應用程序,只有少數開發人員。

+0

技術#3(自動執行SUT,但手動驗證結果)對於測試不能自動驗證的事情很有用,如UI的外觀和外觀,HTML在不同瀏覽器中的外觀或確保你的遊戲具有良好的圖形。但是,對於數據庫,我認爲您將花更少的時間來使用前兩種技術進行全面測試。 – apollodude217 2010-06-26 14:35:47

+0

這不是一個dup嗎? http://stackoverflow.com/questions/3111645/mock-objects-vs-test-database – 2010-06-26 15:45:33

回答

3

如果你有一個數據訪問層只公開少數幾個方法,第一個應該不會那麼難。有一個很好的技巧可以用來僞造數據:只需將實體對象存儲在List<T>中,並使用AsQueryable即可。我發現這比數據部分的moq容易。

關於國際奧委會,我認爲它目前被過度使用(請注意我的意見在這方面代表了少數程序員)。您可以在測試過程中使用像Moles這樣的工具來模擬,而不必濫用程序的設計。我不使用國際奧委會,除非設計真的需要它。

1

這裏有一整套答案。首先要做的是清楚地表達你正在測試的內容。它是一個API背後有一個數據庫,DAO對象,你的數據庫結構?

到此爲止也將幫助您決定測試事物的最佳方式。從我所看到的還有你所列舉的另一種選擇。這是在內存數據庫如hsql中啓動並運行你的類和測試。這意味着您可以在測試開始時創建數據庫結構。因爲它在內存中,所以您不必擔心擁有數據庫服務器,它的速度很快,並且可以使用特定於測試的數據加載它。

我使用嘲笑相當多,雖然他們偉大的單元測試一個類,在某些情況下,他們不是。他們也很容易錯過鉛。與mock一起工作的東西並不罕見,在集成時不起作用。原因在於你正在加載模擬的某些期望和迴應,你可能從模擬代表的東西中錯誤地解釋了這些。

不要誤解我的意思,我喜歡嘲笑並且使用它們很多。但是在這樣做的時候,你絕不能認爲因爲某些東西是單元測試的,所以這是正確的。它確實增加了機會,但在集成測試中實際上給了你100%的保證。

2

我肯定會繼續使用真正的單元測試(選項1)。我喜歡Stephen對此的建議。

您也可以使用實際數據庫(選項2)必需的(選項2)找到集成測試。爲什麼?因爲您需要測試的部分內容(O/R映射,與實際數據庫模式的兼容性等)不在真正的單元測試中。

至於建立和拆除的邏輯,從這個通常就足夠了(使用.NET,NUnit的,和SQLServer數據庫)繼承:

using System.Transactions; 
using NUnit.Framework; 
namespace Crown.Util.TestUtil 
{ 
    [TestFixture] 
    public class PersistenceTestFixture 
    { 
     public TransactionScope TxScope { get; private set; } 

     [SetUp] 
     public void SetUp() 
     { 
      TxScope = new TransactionScope(); 
     } 

     [TearDown] 
     public void TearDown() 
     { 
      if (TxScope != null) 
      { 
       TxScope.Dispose(); 
       TxScope = null; 
      } 
     } 
    } 
} 

容易餡餅。

0

你真的測試了什麼,這讓你覺得這很難嗎?

如果您將業務層和服務層邏輯與持久性代碼分離開來,那麼您應該可以輕鬆地隔離要進行單元測試的代碼,而無需使用數據庫。

單元測試最重要的原理之一是單獨解耦和測試。當你清楚瞭解如何做到這一點時,單元測試很容易。當你不這樣做時,單元測試變得很難。