[宅男週記] #05-2019 測試程式的斷言語句

Feb 13, 2019




前言

撰寫單元測試有 3A 架構:

  • Arrange:
    初始化測試環境,例如需要使用到的參數設定,建立模擬物件或是存根物件。
  • Act:
    執行測試對象。
  • Assert:
    驗證結果,驗證對象分為三種,回傳值、物件狀態及互動關係。

其中對於第三個步驟的判斷語句,對於撰寫測試程式初期較陌生的部分,因為一般的程式開發場景不會有這樣的斷言,此處的判斷撰寫亦與開發時使用的判斷處理不同,算是撰寫測試程式需要額外學習之處。

以下就一般常用的斷言語句作簡單介紹。

個別比對

Assert 類別提供多個針對物件的比對方法。

AreSame 方法

用於比對兩個物件是否為同一物件,比對是採用變數的位址是否相同進行判斷,因此下述測試的判斷將不會通過。

[TestMethod]
public void Example_AreSame()
{
    var sExpected = "abc";
    var sActual = "abc";
    
    Assert.AreSame(sExpected, sActual);
}

AreEqual 方法

採用變數型別的 Equals 方法進行比對,若沒有定義則採用 Object 型別的 Equals 方法進行比對,亦即採用比對位址的方式。

[TestMethod]
public void Example_AreEqual()
{
    var sExpected = "abc";
    var sActual = "abc";
    
    Assert.AreEqual(sExpected, sActual);
}

集合比對

CollectionAssert 類別提供多個針對清單集合的比對方法,假設有一組預期值的集合如下:

排序 1 2 3
內容  UserA   UserB   UserC 

AreEqual 方法

用於完整比對,當兩個清單內容必須在內容值、數目且順序都保待一致的情形時使用。所以下述的情形都不會通過,因為項目的排序與預期值不符。

排序 1 2 3
內容  UserA   UserC   UserB 

AreEquivalent

用於項目內容比對,當兩個清單內容及數量一致時即可,不考慮項目在序列中的順序。所以前述順序不同的情形是可以通過檢查。

排序 1 2 3
內容  UserA   UserC   UserB 

但下述情形則因為數量不一致所以並不會通過檢查。

排序 1 2 3 4
內容  UserA   UserC   UserC   UserB