iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0

專案架構介紹

從圖中可以看到 HelloBank 方案當中有兩隻專案,一隻是 HelloBank 專案(對應於軟體開發就是商業邏輯開發的 Library);另一支專案則是 HelloBankTest,是測試 HelloBank 的單元測試專案。GitHub HelloBank Startup 的專案已提供 HelloBank 的原始碼;因此我們會將焦點放在 HelloBankTest 這隻類別上。

https://ithelp.ithome.com.tw/upload/images/20210905/20127378qmaD0slgo6.png


在進行 3A 原則前,先了解常用的語法 [TestFixture], [Test] 和 [TestCase]

依據 NUnit Docs 官方網站提供了這幾個語法的定義。

[TestFixture]:This is the attribute that marks a class that contains tests and, optionally, setup or teardown methods.

[Test]:The Test attribute is one way of marking a method inside a TestFixture class as a test. It is normally used for simple (non-parameterized) tests but may also be applied to parameterized tests without causing any extra test cases to be generated.

[TestCase]:TestCaseAttribute serves the dual purpose of marking a method with parameters as a test method and providing inline data to be used when invoking that method.

就我目前使用的觀點來說,[TestFixture] 是註記這個類別是 NUnit 測試的類別,[Test] 與 [TestCase] 都是註記該方法為要執行的測試單元,兩者最大的差別在於測試單元是否需要代入參數(若相同的測試單元需要做大量不同的案例測試,就會使用 TestCase)。


設定第一隻單元測試的目標

做完初始化的 NUnit 設定,接下來可以開始撰寫第一支單元測試。

而這次的預設情境是現在有位使用者在帳戶上存了一筆錢,我們要在測試中檢測使用者存進去的錢是否符合預期的結果,因此,把提供的 Startup 專案中的 Test1 改成如下的寫法:

[Test]
public void Adding_Funds_Updates_Balance()
{
    // Arrange
    
    // Act
    
    // Assert
    
}

3A 原則之一 — Arrange (準備):建立物件。

Arrange 階段就是新增物件,以方便後面的階段呼叫類別的屬性或方法,寫法如下:

[Test]
public void Adding_Funds_Updates_Balance()
{
    // Arrange
    BankAccount account = new BankAccount(1000);

    // Act

    // Assert

}

目前此範例是呼叫自己撰寫的建構子方法建構新的物件;然而,現今實際開發系統時,大多是引用第三方套件新增物件,僅少許時候是呼叫自己開發的類別;因此,在之後「單元測試-核心技術」階段,會進一步探討在 Arrange 階段,如何導入假物件 (Fake),假物件中又分了虛設常式 (Stub) 與模擬物件 (Mock)。


3A 原則之二 — Act (執行):操作物件。

Act 階段為利用物件處理商業邏輯,處理完商業邏輯後再將結果傳至驗證階段,寫法如下:

[Test]
public void Adding_Funds_Updates_Balance()
{
    // Arrange
    BankAccount account = new BankAccount(1000);

    // Act
    account.Add(500);

    // Assert

}

此範例利用帳戶裡面的存款功能,在這新帳戶儲存了 500 元,而原先帳戶有 1000 元。因此,最終的帳戶餘額應有 1500 元。


3A 原則之三 — Assert (驗證):驗證物件是否符合預期結果。

Assert 階段是驗證其成果是否符合開法者的想法,如同單元測試的藝術提到Assert 類別是商業邏輯的程式碼與 NUnit 測試框架中間的橋樑,用來確認在該假設下某個期望應該成立,寫法如下:

[Test]
public void Adding_Funds_Updates_Balance()
{
    // Arrange
    BankAccount account = new BankAccount(1000);

    // Act
    account.Add(500);

    // Assert
    Assert.AreEqual(1500, account.Balance);
}

一隻優秀的單元測試很大的重點就在於如何做最後的驗證,除了範例中利用的回傳值驗證方式,在單元測試的藝術還有提到兩種驗證方式:基於狀態的測試(俗稱狀態驗證)和與相依物件之間的互動,同樣也會在「單元測試-核心技術」階段做進一部探討。

最後,寫完這段程式碼之後,就可以進行第一次的測試了。

以下分別提供 Windows 與 Mac 如何執行測試的畫面截圖:

Windows:

(1) 點開測試並執行所有測試:
https://ithelp.ithome.com.tw/upload/images/20210905/20127378b7jST20Zz4.png

(2) 查看測試結果:
https://ithelp.ithome.com.tw/upload/images/20210905/20127378Dobfa9kLTK.png

Mac:

(1) 點開檢視:
https://ithelp.ithome.com.tw/upload/images/20210905/20127378oYmT4sA8ek.png

(2) 點開測試並執行:
https://ithelp.ithome.com.tw/upload/images/20210905/20127378IpzwOjtrg9.png

(3) 查看測試結果(右側或下側都可以觀看結果):
https://ithelp.ithome.com.tw/upload/images/20210905/20127378kPX8RZtDNf.png


上一篇
Day 4-Visual Studio 環境安裝與介紹第一隻測試專案 HelloBank (基礎-3)
下一篇
Day 6-單元測試 NUnit 更多常用的特性-1 (基礎-5)
系列文
單元測試從入門到進階之路 (以 C# NUnit 3 X NSubstitute 為例)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言