2015-06-08 15 views
1

如何以編程方式告訴NUnit重複測試?如何以編程方式告訴NUnit重複測試?

背景: 我是從我的C#代碼中運行NUnit的,使用SimpleNameFilter和RemoteTestRunner。我的應用程序讀取一個csv文件TestList.csv,它指定要運行的測試。到目前爲止,一切正常。

問題: 問題是,當我在TestList文件放在同一個測試名稱兩次。在這種情況下,我的應用程序會正確讀取並加載帶有兩個測試名稱實例的SimpleNameFilter。這個過濾器然後被傳遞給RemoteTestRunner。然後,Nunit只執行一次測試。當Nunit看到它已經運行的第二次測試時,它似乎忽略了它。

我該如何重寫這種行爲?我想讓NUnit按照我的TestList.csv文件中的指定運行相同的測試名稱兩次或更多次。

謝謝

+1

看看[數據驅動測試](http://stackoverflow.com/questions/30622972/how-to-do-a-nunit-test-with-parameters/30623089#30623089) – lloyd

+0

你能否澄清爲什麼你想這樣做? –

+0

嗨勞埃德:看起來非常好,但是,它似乎只適用於微軟單元測試工具,而不是NUnit? –

回答

0

運行相同的測試兩次應具有相同的結果。單個測試可以通過,也可以失敗。如果你有測試有時會失敗,那麼感覺就像是錯誤的事情發生了。這就是爲什麼NUnit不支持這種開箱即用的原因。我想這也會導致測試運行結果的報告中出現問題,它是否說測試X有效,如果兩者都發生了失敗?

您將在Nunit中獲得的最接近的東西就像TestCaseSource屬性(您已經知道的)。您可以使用TestCaseSource來指定一個方法,該方法可以反過來從文件中讀取。所以,你可以例如有一個文件「cases.txt」它看起來像這樣:

Test1,1,2,3 
Test2,wibble,wobble,wet 
Test1,2,3,4 

然後用這個從你的測試,像這樣:

[Test] 
[TestCaseSource("Test1Source")] 
public void Test1(string a, string b, string c) { 
} 

[Test] 
[TestCaseSource("Test2Source")] 
public void Test2(string a, string b, string c) { 
} 

public IEnumerable Test1Source() { 
    return GetCases("Test1"); 
} 

public IEnumerable Test2Source() { 
    return GetCases("Test2"); 
} 

public IEnumerable GetCases(string testName) { 
    var cases = new List<IEnumerable>(); 

    var lines = File.ReadAllLines(@"cases.txt").Where(x => x.StartsWith(testName)); 
    foreach (var line in lines) { 
     var args = line.Split(','); 
     var currentcase = new List<object>(); 
     for (var i = 1; i < args.Count(); i++) { 
      currentcase.Add(args[i]); 
     } 
     cases.Add(currentcase.ToArray()); 
    } 
    return cases; 
} 

這顯然是一個非常簡單的例子,導致Test1被調用兩次,並且Test2被調用一次,具有來自文本文件的參數。然而,如果傳遞給測試的參數不同,這將再次起作用,因爲nunit使用參數來創建唯一的測試名稱,儘管您可以通過讓測試源爲每個方法調用生成唯一的編號來解決此問題並將其作爲測試簡單忽略的額外參數傳遞給測試。

另一種方法是讓你從一個反覆調用nunit的腳本中爲文件的每一行運行nunit,但我想這可能會導致你遇到其他問題,當你從多個運行。

+0

謝謝forsvarir。這是一個很好的答案。你給了一些非常好的指針來考慮。我將繼續使用TestCaseSource。 –

1

http://www.nunit.org/index.php?p=testCase&r=2.5

TestCaseAttribute用於標記與 參數作爲試驗方法的方法,並提供內聯數據的雙重目的時要使用 調用該方法。下面是一個試驗的例子正在運行三個 倍,具有三個不同的數據集:

[TestCase(12,3, Result=4)] 
[TestCase(12,2, Result=6)] 
[TestCase(12,4, Result=3)] 
public int DivideTest(int n, int d) 
{ 
    return(n/d); 
} 
+0

Hi Vitaly:這很好,但是,測試在編譯時固定的次數。另外,在你的答案中,測試數據也是固定的,可以用TestCaseSource()修復。但是,在我的應用程序中,我不知道測試將被調用多少次。我正在尋找的是告訴NUnit運行一次測試,測試名稱包含在我的TestList.csv文件中。 –

相關問題