2015-10-02 29 views
1

我構建了一個測試驅動的應用程序,該應用程序將一個平面文件排序爲父子層次結構。現在我想爲自己的排序創建一個非常通用的測試。爲此,我想生成一些測試數據,然後再進行分類。爲測試創建對象層次結構

將被排序會是這個樣子的對象:

public interface IHierarchicalUnitWithChildren 
{ 
    string Id { get; } 
    string ParentId { get; } 
    IList<IHierarchicalUnitWithChildren> Children { get; set; } 
} 

但我不想要創建的測試對象自己。我想這由代碼生成,因爲這樣的:

 _items = new List<IHierarchicalUnitWithChildren>(); 
     Random random = new Random(); 

     for (int i = 1; i < 1000; i++) 
     { 
      var item = new HierarchicalUnitMock() 
      { 
       Oid = i.ToString(), 
       Children = new List<IHierarchicalUnit>(), 
      }; 

      // We need a couple of roots. 
      if (i%100 != 0) 
      { 
       item.Poid = random.Next(1, 100).ToString(); 
      } 

      _items.Add(item); 
     } 

我可以很容易地產生一千個項目,但我還需要給他們一個有效的父。我如何確保我正在創建一個有效的結構,我有幾個根,所有的孩子都有父母。

沒有項目應該有自己的孩子(或孫子)的父母,從而使其成爲一個無限的層次。

或者我在想這一切都是錯的?應該測試總是有靜態數據?

UPDATE:

有沒有什麼辦法了智能迴路要做到這一點,總是產生相同的數據?所以測試用例總是會一樣的?

回答

1

在測試中隨機生成的數據是而不是一個好主意。你無法保證測試條件每次都是一樣的,並且不能保證你覆蓋了每一種可能的情況。

相反:

想想你的代碼呢,把它分解成僞代碼,如果你要,並嘗試拿出,可以打破它的場景。使您的測試數據專門設置爲導致這些情況。

+0

嗯,我準備同意你的意見。正如你所說,測試用例每次都不一樣,這是測試的關鍵組件之一。 – smoksnes