2009-07-08 25 views
9

在較大的項目中,我的單元測試通常需要運行一些「虛擬」(樣本)數據。一些默認的客戶,用戶等。我想知道你的設置是怎樣的。如何將樣本(虛擬)數據添加到單元測試中?

  1. 如何組織/維護這些數據?
  2. 你如何將它應用到你的單元測試(任何自動化工具)?
  3. 您確實需要測試數據嗎?或者您認爲它沒用?

我目前的解決方案:

主數據的樣本數據其中前者將可區分當系統進入生產(安裝了第一次),而後者是我測試運行所需的典型用例(並且在開發過程中)。

我店所有這一切在一個Excel文件(因爲它是如此該死的易維護),其中每個工作表中包含特定實體(例如用戶,客戶等),並標記主或樣品。

我有2個測試案例,我(小姐)用來導入所需的數據:

  1. InitForDevelopment(創建模式,導入主數據,導入示例數據)
  2. InitForProduction(創建模式,導入主數據)

回答

12

我使用的存儲庫的圖案和具有真實由所討論的單元測試實例化的虛擬庫,它提供了一個已知的數據集,它包括一個例子是內和超出範圍的各種字段。

這意味着,我可以測試我的代碼通過從測試單元提供實例化的儲存庫進行測試或在運行時產生存儲庫(經由依賴注入(城堡))不變。

我不知道這一個良好的網絡參考,但我從Apress出版出版的史蒂芬·桑德森的專業ASP.NET MVC 1.0書中學到了很多。 MVC方法自然提供了讓您的測試在較少依賴性下運行所需的關注點分離。

的基本要素是,你儲存庫實現了數據訪問的接口,即同一個接口,然後通過您在測試項目中構建一個假的庫來實現。

在我目前的項目中,我有這樣的接口:

namespace myProject.Abstract 
{ 
    public interface ISeriesRepository 
    { 
     IQueryable<Series> Series { get; } 
    } 
} 

這是作爲我的兩個實時數據倉庫(使用LINQ to SQL),也是一個假的存儲庫這樣的:

namespace myProject.Tests.Respository 
{ 
    class FakeRepository : ISeriesRepository 
    { 
     private static IQueryable<Series> fakeSeries = new List<Series> { 
      new Series { id = 1, name = "Series1", openingDate = new DateTime(2001,1,1) }, 
      new Series { id = 2, name = "Series2", openingDate = new DateTime(2002,1,30), 
      ... 
      new Series { id = 10, name = "Series10", openingDate = new DateTime(2001,5,5) 
     }.AsQueryable(); 

     public IQueryable<Series> Series 
     { 
      get { return fakeSeries; } 
     } 
    } 
} 

然後,消耗數據的類將實例化,並將庫引用傳遞給構造函數:

namespace myProject 
{ 
    public class SeriesProcessor 
    { 
     private ISeriesRepository seriesRepository; 

     public void SeriesProcessor(ISeriesRepository seriesRepository) 
     { 
      this.seriesRepository = seriesRepository; 
     } 

     public IQueryable<Series> GetCurrentSeries() 
     { 
      return from s in seriesRepository.Series 
        where s.openingDate.Date <= DateTime.Now.Date 
        select s; 
     } 
    } 
} 

然後在我的測試中,我可以這樣來解決:

namespace myProject.Tests 
{ 
    [TestClass] 
    public class SeriesTests 
    { 
     [TestMethod] 
     public void Meaningful_Test_Name() 
     { 
      // Arrange 
      SeriesProcessor processor = new SeriesProcessor(new FakeRepository()); 

      // Act 
      IQueryable<Series> currentSeries = processor.GetCurrentSeries(); 

      // Assert 
      Assert.AreEqual(currentSeries.Count(), 10); 
     } 

    } 
} 

然後看CastleWindsor的控制方法反轉爲您直播的項目,讓你的產品代碼,通過依賴注入自動實例化的活動資料庫。這應該讓你更接近你需要的地方。

+0

聽起來像一個有趣的方法,但不知何故,我不完全理解它。你有沒有在網上提供這種方法的參考? – Michal 2009-07-09 03:02:59

1

在我們公司,我們會討論幾個星期和幾個月以來的這些問題。

要遵循單元測試的指導原則:

每個測試必須是atomar,不允許相互關係(沒有數據共享),這意味着,每一個tust必須在一開始,有自己的數據並在最後清除數據。

出的產品是如此複雜(5年的發展,在數據庫中的100個表),這幾乎是不可能在一個可以接受的方式,以保持這一點。

我們嘗試了數據庫腳本,創建和前/後測試(也有它稱之爲自動方法)刪除數據。

我會說你是在用Excel文件的好方法。從我

理念,使其一點點好:

  • 如果你有你的軟件谷歌爲「NDBUnit」背後的數據庫。這是一個插入和刪除數據庫中的數據進行單元測試的框架。
  • 如果你沒有數據庫,那麼對於像excel這樣的系統來說,XML可能更靈活一些。
1

沒有直接回答這個問題,但限制的測試需要使用虛擬數據是使用一個嘲弄的框架來創建嘲笑的對象,你可以使用你有任何依賴性假冒行爲的量的一種方式一類。

我發現,使用嘲笑的對象而不是一個特定的具體實現可以大大減少真實數據,您需要使用的模擬考試不處理你傳遞到他們的數據量。他們只是執行你想要的。

我還是相信你,如果你已經使用或瞭解嘲諷框架可能需要在很多情況下,這樣的道歉虛擬數據。

1

只是要清楚,你需要單元測試(測試與其他模塊沒有隱含的依賴關係模塊)和應用程序測試(應用程序的測試部件)之間者區分。對於前者,你需要一個模擬框架(我只熟悉Perl的,但我確定它們存在於Java/C#中)。一個好框架的標誌就是能夠運行一個正在運行的應用程序,記錄所有的方法調用/返回,然後使用記錄的數據模擬所選擇的方法(例如,您未在此特定單元測試中測試的方法)。 對於良好的單元測試,您必須模擬每個外部依賴 - 例如,不需要調用文件系統,不需要調用DB或其他數據訪問層,除非您正在測試的內容等...

對於後者,嘲笑框架是有用的,加上創建測試數據集的能力(可以爲每個測試重置)。要爲測試加載的數據可以駐留在任何可以從其加載的脫機存儲中 - 用於Sybase DB數據的BCP文件,XML,您喜歡的任何動作。我們同時使用BCP和XML。

請注意,如果您的整體公司框架允許(或者說強制執行)「此表別名」API的真實數據庫表名稱,那麼這種「將測試數據加載到數據庫」測試顯着更容易。這樣,您可以讓應用程序在測試過程中查看克隆的「測試」數據庫表,而不是真正的數據庫表,除此之外,還可以讓數據庫表從一個數據庫移動到另一個數據庫。

相關問題