從圖中可以看到 HelloBank 方案當中有兩隻專案,一隻是 HelloBank 專案(對應於軟體開發就是商業邏輯開發的 Library);另一支專案則是 HelloBankTest,是測試 HelloBank 的單元測試專案。GitHub HelloBank Startup 的專案已提供 HelloBank 的原始碼;因此我們會將焦點放在 HelloBankTest 這隻類別上。
依據 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
}
Arrange 階段就是新增物件,以方便後面的階段呼叫類別的屬性或方法,寫法如下:
[Test]
public void Adding_Funds_Updates_Balance()
{
// Arrange
BankAccount account = new BankAccount(1000);
// Act
// Assert
}
目前此範例是呼叫自己撰寫的建構子方法建構新的物件;然而,現今實際開發系統時,大多是引用第三方套件新增物件,僅少許時候是呼叫自己開發的類別;因此,在之後「單元測試-核心技術」階段,會進一步探討在 Arrange 階段,如何導入假物件 (Fake),假物件中又分了虛設常式 (Stub) 與模擬物件 (Mock)。
Act 階段為利用物件處理商業邏輯,處理完商業邏輯後再將結果傳至驗證階段,寫法如下:
[Test]
public void Adding_Funds_Updates_Balance()
{
// Arrange
BankAccount account = new BankAccount(1000);
// Act
account.Add(500);
// Assert
}
此範例利用帳戶裡面的存款功能,在這新帳戶儲存了 500 元,而原先帳戶有 1000 元。因此,最終的帳戶餘額應有 1500 元。
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) 點開測試並執行所有測試:
(2) 查看測試結果:
Mac:
(1) 點開檢視:
(2) 點開測試並執行:
(3) 查看測試結果(右側或下側都可以觀看結果):