2012-03-20 69 views
4

我有一個單元測試像這樣:邏輯在單元測試中

[Test] 
    public void DataIn_NoOfRowsReached_CreatesSequentialData() 
    { 
     //Assert 
     MyLogic logic = SetupLogic(); 
     logic.NoOfRows = 3; 

     logic.DataIn(1, "1,4,7"); 
     logic.DataIn(2, "2,5,8"); 
     logic.DataIn(3, "3,6,9"); 

     CollectionAssert.AreEqual(new[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, logic.ExpectedValues); 
    } 

每個DATAIN呼叫添加在數據傳遞到根據ID(第一PARAM)的單獨列表。當NoOfRows數字等於DataIn輸入ID時,它將數據合併爲順序數據。然後我測試檢查這一點。

我現在想用測試案例,但我看不出有什麼簡單的方法來做到這一點不把if語句和測試方法中的各種可選參數。我真的不想重複測試各種情況。

的NoOfRows最大爲6

+1

哪個單元測試框架您使用的? – sloth 2012-03-20 13:50:33

+1

所以要解釋...你想要創建一個通用的方法,將採取輸入參數,並與多個輸入做這個特定的測試? – scottheckel 2012-03-20 13:50:41

回答

2

我相信這是你在找什麼。利用params keyword允許傳遞任意數量的字符串。

[Test] 
public void DataIn_NoOfRowsReached_CreatesSequentialData() 
{ 
    MyGenericTest("1,4,7", "2,5,8", "3,6,9"); 
} 

private void MyGenericTest(params string[] inputs) 
{ 
    //Assert 
    MyLogic logic = SetupLogic(); 
    logic.NoOfRows = inputs.Length; 

    List<string> allNumbers = new List<string>(); 
    for(int i = 0; i < inputs.Length; i++) 
    { 
     logic.DataIn(i + 1, inputs[i]); 
     allNumbers.AddRange(inputs[i].Split(','); 
    } 

    allNumbers.Sort(); 
    CollectionAssert.AreEqual(allNumbers.Distinct(), logic.ExpectedValues); 
} 

這只是執行字符串排序......如果您的數字大於9,您需要add your own compare function to the Sort() method

+0

我假設鑄造所有的字符串爲int然後排序他們也會工作? – Jon 2012-03-20 20:08:00

+0

是的,使用int.Parse,int.TryParse或任何你最喜歡的轉換方法都可以正常工作。我把它保持爲字符串,因爲我認爲你可能想要字符串。 – scottheckel 2012-03-20 20:15:27

+1

是的,我直到你提到大於9的數字!謝謝 – Jon 2012-03-20 20:45:38

0

如果你想寫一些「聰明」的測試,你也許可以創建你輸入輸入和整理他們的數字預期的數組,你可以跟蹤的數字你輸入每行的一部分(使用一些數字來創建字符串)。除此之外,我並沒有看到太多的改善。

1

如果您使用NUnit和想要運行多個測試用例與不同的輸入,你可以利用的價值屬性,http://nunit.com/index.php?p=values&r=2.6。然後

單元測試看起來是這樣的:

[Test] 
public void DataIn_NoOfRowsReached_CreatesSequentialData([Values(new[] { "1,4,7", "2,5,8", "3,6,9" }, ...)] string[] vals) 
{ 
    //Assert 
    MyLogic logic = SetupLogic(); 
    logic.NoOfRows = vals.Length; 

    for (var i = 0; i < vals.Length; ++i) 
     logic.DataIn(i + 1, vals[i]); 

    CollectionAssert.AreEqual(new[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, logic.ExpectedValues); 
} 
+1

使用Values和TestCases有什麼區別? – Jon 2012-03-20 16:54:59

+0

沒有考慮到這一點,感謝您的想法。看起來如果將值與Combinatorial屬性結合使用,您可以測試所有可能的組合,只要您有兩個或更多變量。另一方面,使用TestCase屬性爲您提供了更多的自由度,例如允許您爲特定的測試用例設置ExpectedException。如果你只想運行順序測試用例,TestCase也可能使代碼更具可讀性。我甚至可以說,我推薦在上面的單元測試中使用TestCase屬性:-) – 2012-03-20 17:25:24