iT邦幫忙

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

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

【Day 8】Unit Test應用:系統狀態修改

【Day 8】Unit Test應用:系統狀態修改
有時候我們不是檢查某個方法,只對其檢查回傳值true或是false,有時候會需要修改系統狀態,而測試系統的狀態是否如我們預期。

今天的範例也是使用LogAnalyzer的功能,但是增加了一個新方法WasLastFileNameValid,用來記錄上次檢查附檔名的時候是否有成功。
(本次是使用新專案,所以請參考專案【Day8】


我們假設,當我們檢查檔案之後會修改某個參數,也就是更改系統狀態。舉例來說「當9:00時候」,就「進入看書模式」,所以當條件滿足「9:00」,我們的狀態就被修改成「看書」。這個也是相同道理,當檔名檢查通過,將會修改系統的狀態,也就是WasLastFileNameValid的狀態。而我們今天要做的是檢查系統狀態。

首先在我們的程式LogAnalyzer.cs中建立我們需要的變數方法,用來記錄檢查後的狀態。

public bool WasLastFileNameValid { get; set; }

接著是我們主要判斷的程式,這邊會先設定一個預設值(false)給我們的系統參數WasLastFileNameValid,最後有通過檢查,就讓我們的參數變成true,這樣就可以隨時調用這個系統狀態。

public bool IsValidLogFileName(string fileName)
{
    WasLastFileNameValid = false;   //Modify the system's status.

    if (string.IsNullOrEmpty(fileName))
    {
        throw new ArgumentException("請提供檔名 please provide the filename");
    }

    if(!fileName.EndsWith(".log", StringComparison.CurrentCultureIgnoreCase))
    {
        return false;
    }

    //Doing the line means everything is correct.
    //Therefore the system's status is "true".
    WasLastFileNameValid = true;        //modify the system's status

    return true;        //means: the function finishes.
}

這樣主要的程式功能就完成了。剩下就是測試的程式碼

首先建立一個工廠,方便呼叫。

private LogAnalyzer MakeAnalyzer()
{
    return new LogAnalyzer();
}

接著建立我們要測試的functionIsValidLogFileName_WhenCalled_ChangeWasLastFileNameValid

public void IsValidLogFileName_WhenCalled_ChangeWasLastFileNameValid(string fileName, bool expectResult)
{
    LogAnalyzer logAlr = MakeAnalyzer();        //Arrange   //var: the target object.

    logAlr.IsValidLogFileName(fileName);        //Act   //func:Do something and change the system's status.

    Assert.AreEqual(expectResult, logAlr.WasLastFileNameValid); //Assert    //check: the status is correct.
}

首先建立測試物件LogAnalyzer logAlr = MakeAnalyzer();,接著進行測試,測試的變數如下:

[TestCase("Test.LOG", true)]
[TestCase("Test.log", true)]
[TestCase("Test.qoo", false)]
[TestCase("", false)]

這些變數會填入測試functionlogAlr.IsValidLogFileName(fileName);中。

之後比對的就和先前城市不同,先前是直接拿結果回傳值做比對,這個範例則是使用自己的系統參數做比對,也就是取得logAlr.WasLastFileNameValid的值來比對是否符合預期,因此斷言變成如此:

Assert.AreEqual(expectResult, logAlr.WasLastFileNameValid);

這樣就不是對原本的function進行結果比對,而是模擬一個系統狀態進行比對。是不是變得有趣多了呢?自己的測試內容不會受限於方法的回傳值,可以參照或測試自己想要的系統參數,來確保這樣的動作,這些參數有符合自己的預期做變化。


上一篇
【Day7】NUnit 好用的小功能(增加項目中)
下一篇
【Day9】解除依賴
系列文
【Unit Test】Unit Test with C#31

尚未有邦友留言

立即登入留言