2016-02-02 98 views
1

我打算將所有測試用例存儲在一個excel文件中,其中的列指示測試方法名稱,參數和預期結果;但是,我發現TestCaseSource只是將所有測試用例分配給每個測試方法。我想知道是否有任何方法可以根據我放入電子表格的方法名稱爲NUnit選擇測試用例的方法?NUnit:TestCaseSource將測試分配給特定的測試方法

謝謝。

+0

您是否希望使用一個'TestCaseSource'作爲不同的測試方法,以便每個測試只會根據其名稱運行特殊的測試用例組? – Kote

+0

是的!更確切地說,我會把TestCaseSource屬性放在所有的測試方法上。 –

回答

1

有一種方法可以做到這一點。例如,正如你所提到的,你可以創建一個自定義屬性。
這個想法是通過測試的名稱TestCaseSource
您可以通過創建TestCaseSource作爲單獨的類來實現。

首先,TestCaseSource類:

public class SpreadSheetTestCaseSource 
{ 
    [ThreadStatic] 
    public static string TestName = String.Empty; 

    public static IEnumerable TestCases 
    { 
     get 
     { 
      SpreadSheetTestCaseProvider.GetTestCases() 
       .Where(testCase => testCase.TestName == TestName); 
     } 
    } 
} 

再到屬性:

public class MyTestCaseSourceAttribute : TestCaseSourceAttribute 
{ 
    public MyTestCaseSourceAttribute(Type sourceType, string sourceName, 
     [CallerMemberName] string name = null) 
     : base(sourceType, sourceName) 
    { 
     SpreadSheetTestCaseSource.TestName = name; 
    } 

    //Another two members impl. 
} 

和測試:

[TestFixture] 
public class TestClass 
{ 
    [MyTestCaseSource(typeof(SpreadSheetTestCaseSource), "TestCases")] 
    public void TestMethod() 
    { 
     //Test logic 
    } 
} 

SpeadSheetTestCaseSource.TestName是線程靜態的。所以你可以並行運行測試。

+0

比我的想法更清潔的實現。 +1 –

+0

非常感謝您的回覆。只是一個問題,我如何實現SpreadSheetTestCaseSource類。 SpreadSheetTestCaseProvider是從TestCaseProvider繼承的嗎? –

+0

@LiuGarry,在這種情況下'SpreadSheetTestCaseSource'只是一個虛構的類。您可以通過多種方式實現它。我只是假設它將Excel文檔解析爲「IEnumerable 」。 – Kote

0

這不是NUnit直接支持的功能。各種TestCaseSource類型屬性無法根據輸入提供測試方法。

一個選項是爲每個測試方法創建一個TestCaseSource。其中每一個都是一個簡單的包裝器,它將方法名稱傳遞給一個內部方法。該內部方法將在Excel文件中讀取,並只返回給定方法名稱的行。

PseudoCode;

[TestCaseSource(nameof(TestMethodOneSource))] 
public void TestMethodOne(int x, int y, int expected) 
{ 
    Assert.That(x + y, Is.EqualTo(expected)); 
} 

public static IEnumerable<object[]> TestMethodOneSource() => 
    ReadExcel(nameof(TestMethodOne)); 

private static IEnumerable<object[]> ReadExcel(string method) 
{ 
    // Open and start reading Excel 
    for(var row in rows) 
    { 
     if(row[0] == method) 
     { 
      // Return objects minus the method 
      yield return new [] {row[1], ..., row[n]}; 
     } 
    } 
} 
+0

非常感謝。我曾考慮過這個問題。問題是我會有很多測試方法,所以我需要爲每個測試方法創建包裝。我想知道如果有辦法,也許可以創建自定義屬性來實現這一點。 –