這篇會說明幾個NUit內幾個好用的屬性或是方法,其中包含TestCase
、SetUp
、TearDown
、ExpectedException
、Assert.Catch<t>(delegate)
以我們第一個範例來說,這樣的程式碼很難維護,因為每一個參數每一個測試都要寫一個function(方法),當有100總可能性,是不是需要寫出100種不同的方法名、100總不同命名。這樣程式碼變得很長,而且裡面的程式結構又十分相近,所以可以增加case,使用TestCase
。也就是參數畫測試(parameterized test)。
修改僅需要下面這些步驟:
所以會變成(參考檔案:LogAnalyzerTest_TestCase.cs)
[TestCase("WoW.txt")] //That will be error.
[TestCase("SUCCESS.LOG")]
[TestCase("TEST.log")]
public void IsValidLogFileName_ValidExtensions_ReturnsTrue(string file)
{
LogAnalyzer analyzer = new LogAnalyzer();
bool result = analyzer.IsValidLogFileName(file);
Assert.True(result); //預期:True。當發生非預期,就會Error,表示程式寫錯
}
其中使用三種不同的參數,只有第一個會發生錯誤,因為並不是使用「.log」檔名。
這樣就相同的功能,只需要參數替換就好,可以節省很多時間在觀察以及編寫重複的程式碼。
接著更簡單化且可以測試多個不同的結果:使用第二個參數。增加參數「expected」,接著修改Assert.True(result)
,變成Assert.AreEqual(expected, result)
所以最終程式碼變成:
[TestCase("WoW.txt", false)] //That will be error.
[TestCase("SUCCESS.LOG", true)]
[TestCase("TEST.log", true)]
public void IsValidLogFileName_ValidExtensions_ReturnsTrue(string file, bool expected)
{
LogAnalyzer analyzer = new LogAnalyzer();
bool result = analyzer.IsValidLogFileName(file);
Assert.AreEqual(expected, result);
}
更為簡單明瞭囉!!
從原本的兩個function,現在變成一個,參數也變成三種,而且一次可以測兩個預期結果。這是個不錯的功能吧!
臨時想要增加:SetUp
、TearDown
、ExpectedException
、Assert.Catch<t>(delegate)
有空會補齊
---待續---