iT邦幫忙

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

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

【Day 6】解說第一個Unit Test之2-測試程式碼結構與精神

此部份參考書本的第2.4章節。
這邊會講解一些Unit test會包含的架構以及作者表達的命名精神。請參考第四天第五天


Unit Test通常包含三個行為

通常一個UT會包含三個行為:

  1. Arrange 對象:目標對象,就是我們所要測試的對象。e.g. LogAnalyzer analyzer = new LogAnalyzer();把目標實體化。
  2. Act 對象:就是我們操作的測試功能。e.g. bool result = analyzer.IsValidLogFileName("filewithbadextension.foo");
  3. Assert:測試結果的驗證。e.g. Assert.False(result);

所以在程式碼:

[Test]
public void IsValidLogFileName_goodExtensionUppercase_ReturnsTrue()
{
    LogAnalyzer analyzer = new LogAnalyzer();
    
    bool result = analyzer.IsValidLogFileName("sion.LOG");
    
    Assert.True(result);
}

可以看到這三個條件。先實體化要測試的對象,接著進行資料測試,最後再檢驗結果是否相同。

作者的命名習慣

在範例中,可以看到方法名稱非常的長,這是作者的命名習慣。目的是直接從名稱就可以快速了解目的以及測試結果。
裡面包含了被測試的功能、測試的條件,以及預期的回傳結果,所以方法名稱有這三個部分:

  1. UnitOfWorkName:被測試的方法、一組方法或是一組class。e.g. IsValidLogFileName
  2. Scenario:進行的假設條件。e.g. 是否為log檔名,goodExtensionUppercase
  3. ExpectedBehavior:在測試場景指定條件下,對於被測試方式的預期。e.g. ReturnsTrue

所以有:
IsValidLogFileName_BadExtension_ReturnsFalse
IsValidLogFileName_goodExtensionUppercase_ReturnsTrue
我們可以解讀:

  1. 測試是否為log檔名,測試使用錯誤的資料,預期回傳false
  2. 測試是否為log檔名,測試使用正確的大寫資料,預期回傳True

是不是簡潔有力許多呢?這樣就不需要進入程式碼裡面,就可以快速得知測試項目與內容!
而作者也在程式碼中,這三個部分做出區隔,每個部分都空一行,可以讓閱讀者可以更容易取得這三個部分。


明天將會講解一些NUit可以使用的小功能


上一篇
【Day 5】解說第一個Unit Test之1 -程式碼解說
下一篇
【Day7】NUnit 好用的小功能(增加項目中)
系列文
【Unit Test】Unit Test with C#31

尚未有邦友留言

立即登入留言