簡體   English   中英

如何將樣本(虛擬)數據添加到單元測試中?

[英]How do you add sample (dummy) data to your unit tests?

在較大的項目中,我的單元測試通常需要一些“虛擬”(樣本)數據來運行。 一些默認客戶,用戶等。我想知道你的設置是怎樣的。

  1. 您如何組織/維護這些數據?
  2. 如何將其應用於單元測試(任何自動化工具)?
  3. 你真的需要測試數據還是認為它沒用?

我目前的解決方案

我區分主數據樣本數據 ,其中前者在系統投入生產時可用(第一次安裝),后者是我運行測試所需的典型用例(以及在開發期間播放)。

我將所有這些存儲在一個Excel文件中(因為它很容易維護),其中每個工作表包含一個特定的實體(例如用戶,客戶等),並標記為主文件或樣本。

我有2個測試用例,我(想念)用它來導入必要的數據:

  1. InitForDevelopment(創建架構,導入主數據,導入樣本數據)
  2. InitForProduction(創建架構,導入主數據)

我使用存儲庫模式並擁有一個由相關單元測試實例化的虛擬存儲庫,它提供了一組已知數據,其中包含各種字段范圍內和范圍外的示例。

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

我不知道這是一個很好的網絡參考,但我從Apress出版的Steven Sanderson的Professional 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,了解實時項目的反轉控制方法,以允許生產代碼通過依賴注入自動實例化您的實時存儲庫。 這應該讓你更接近你需要的地方。

在我們公司,我們從幾周和一個月開始討論這些問題。

遵循單元測試指南:

每個測試必須是atomar並且不允許彼此相關(無數據共享),這意味着每個tust必須在開始時擁有自己的數據並在結束時清除數據。

Out產品如此復雜(5年的開發,數據庫中超過100個表),幾乎不可能以可接受的方式維護它。

我們嘗試了數據庫腳本,它在測試之前/之后創建和刪除數據(有自動方法調用它)。

我會說你使用excel文件的方式很好。

我的想法讓它變得更好:

  • 如果您的軟件背后有一個數據庫谷歌“NDBUnit”。 它是一個在數據庫中插入和刪除數據以進行單元測試的框架。
  • 如果你沒有數據庫,那么XML在像excel這樣的系統上會更靈活一些。

不是直接回答問題,而是限制需要使用虛擬數據的測試數量的一種方法是使用模擬框架來創建模擬對象,您可以使用這些對象偽造您在類中具有的任何依賴項的行為。

我發現使用模擬對象而不是具體的具體實現,您可以大大減少需要使用的實際數據量,因為模擬不會處理傳遞給它們的數據。 它們只是按照您的要求執行。

我仍然確定你可能在很多實例中需要虛擬數據,所以如果你已經在使用或者知道模擬框架,那么道歉。

需要明確的是,您需要區分UNIT測試(測試模塊與其他模塊沒有隱含的依賴關系)和應用程序測試(應用程序的測試部分)。

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

對於后者,相同的模擬框架是有用的,還有創建測試數據集的能力(可以為每個測試重置)。 要為測試加載的數據可以駐留在可以加載的任何脫機存儲中 - Sybase DB數據的XML文件,XML,無論您喜歡什么。 我們使用BCP和XML。

請注意,如果您的整體公司框架允許 - 或者更確切地說 - “此表別名的真實數據庫表名稱是什么”API,那么這種“將測試數據加載到數據庫”測試會非常容易。 這樣,您可以使您的應用程序在測試期間查看克隆的“測試”數據庫表而不是真實的數據庫表 - 在此類表別名API之上,主要目的是使數據庫表從一個數據庫移動到另一個數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM