我打算將所有測試用例存儲在一個excel文件中,其中的列指示測試方法名稱,參數和預期結果;但是,我發現TestCaseSource只是將所有測試用例分配給每個測試方法。我想知道是否有任何方法可以根據我放入電子表格的方法名稱爲NUnit選擇測試用例的方法?NUnit:TestCaseSource將測試分配給特定的測試方法
謝謝。
我打算將所有測試用例存儲在一個excel文件中,其中的列指示測試方法名稱,參數和預期結果;但是,我發現TestCaseSource只是將所有測試用例分配給每個測試方法。我想知道是否有任何方法可以根據我放入電子表格的方法名稱爲NUnit選擇測試用例的方法?NUnit:TestCaseSource將測試分配給特定的測試方法
謝謝。
有一種方法可以做到這一點。例如,正如你所提到的,你可以創建一個自定義屬性。
這個想法是通過測試的名稱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
是線程靜態的。所以你可以並行運行測試。
比我的想法更清潔的實現。 +1 –
非常感謝您的回覆。只是一個問題,我如何實現SpreadSheetTestCaseSource類。 SpreadSheetTestCaseProvider是從TestCaseProvider繼承的嗎? –
@LiuGarry,在這種情況下'SpreadSheetTestCaseSource'只是一個虛構的類。您可以通過多種方式實現它。我只是假設它將Excel文檔解析爲「IEnumerable
這不是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]};
}
}
}
非常感謝。我曾考慮過這個問題。問題是我會有很多測試方法,所以我需要爲每個測試方法創建包裝。我想知道如果有辦法,也許可以創建自定義屬性來實現這一點。 –
您是否希望使用一個'TestCaseSource'作爲不同的測試方法,以便每個測試只會根據其名稱運行特殊的測試用例組? – Kote
是的!更確切地說,我會把TestCaseSource屬性放在所有的測試方法上。 –