iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 7
0
Software Development

【Unit Test】Unit Test with C#系列 第 7

【Day7】NUnit 好用的小功能(增加項目中)

這篇會說明幾個NUit內幾個好用的屬性或是方法,其中包含TestCaseSetUpTearDownExpectedExceptionAssert.Catch<t>(delegate)


TestCase

以我們第一個範例來說,這樣的程式碼很難維護,因為每一個參數每一個測試都要寫一個function(方法),當有100總可能性,是不是需要寫出100種不同的方法名、100總不同命名。這樣程式碼變得很長,而且裡面的程式結構又十分相近,所以可以增加case,使用TestCase。也就是參數畫測試(parameterized test)。
修改僅需要下面這些步驟:

  1. 把**[Test]變成[TestCase]**
  2. 把程式碼內寫死的值換成
  3. 把替換掉的參數放在屬性的括號中,如[TestCase(param1)]
  4. 為這個方法重新命名(畢竟已經不是之前那樣的測試條件)

所以會變成(參考檔案: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,現在變成一個,參數也變成三種,而且一次可以測兩個預期結果。這是個不錯的功能吧!


臨時想要增加:SetUpTearDownExpectedExceptionAssert.Catch<t>(delegate)
有空會補齊
---待續---


上一篇
【Day 6】解說第一個Unit Test之2-測試程式碼結構與精神
下一篇
【Day 8】Unit Test應用:系統狀態修改
系列文
【Unit Test】Unit Test with C#31

尚未有邦友留言

立即登入留言