2014-10-01 64 views
2

我有一個測試方法和一堆測試用例,如下所示。改進大量測試用例的測試語法

[TestCase(1, 2)] 
[TestCase(3, 4)] 
[TestCase(5, 6)] 
public void Smack(int a, int b) { ... } 

我已經隱藏了一堆地區的案件,但它感覺不對。我已經嘗試了官方網頁上列出的其他屬性,但並沒有真正實現它的功能(有點困惑於合適的方法來處理它)。此外,一位同事暗示說,使用排列組合可能會導致問題。

下面是描述一堆測試用例的最佳方式,還是有更平滑和更專業的東西?

#region Bunch 
[TestCase(1, 2)] 
[TestCase(3, 4)] 
[TestCase(5, 6)] 
#endregion 
public void Smack(int a, int b) { ... } 
+1

就個人而言,我會使用一個專用的屬性(可以在相同或不同的類中)作爲[[[TestCaseSource]'](http://www.nunit.org/index.php?p=testCaseSource&r=2.5)的數據源。 – 2014-10-01 15:40:28

+0

使用'TestCaseSource'或'ValuesSource'屬性。 – 2014-10-01 15:42:09

回答

3

您可以嘗試使用TestCaseSource

[TestCaseSource("SmackTestCases")] 
public void Smack(int a, int b) { ... } 

static object[] SmackTestCases = 
{ 
    new object[] { 1, 2 }, 
    new object[] { 3, 4 }, 
    new object[] { 5, 6 } 
}; 

你也可以實現這一個單獨的類,像這樣:

[TestFixture] 
public class MyTests 
{ 
    [Test] 
    [TestCaseSource(typeof(SmackTestDataProvider), "TestCases")] 
    public void Smack(int a, int b) { ... } 
} 

public class SmackTestDataProvider 
{ 
    public static IEnumerable TestCases 
    { 
     get 
     { 
      yield return new TestCaseData(1, 2); 
      yield return new TestCaseData(3, 4); 
      yield return new TestCaseData(5, 6); 
     } 
    } 
} 
+0

我試圖做這樣的事情,但我固執地把它放在同一個班級。也許這就是問題所在。或者我只是累了。它如何反映測試的正交性?在你的例子中,我們有兩個單獨的類,如果其他(帶有yield)缺失,測試就沒有意義了。另一方面,我們贏得了可交換性......無論如何,我們贏得了清晰的語法。 – 2014-10-01 16:08:48

+0

@KonradViltersten是的,燈具依賴於提供者,但是因爲你必須在屬性中引用提供者類型,所以如果缺失的話它將不能編譯。基本上你可以把兩個類作爲一個單元來考慮:fixture +提供者與測試庫中的任何其他fixture +提供者是正交的。這是否回答你的問題? – 2014-10-01 17:02:06

+0

是的。我現在正在講述不同課程中的提供者,但在同一個文件中。我們會看看周圍的人是否會覺得它很直觀。 +1的額外努力討論。 – 2014-10-01 21:16:10