單元測試在測什麼東西

Feb 15, 2019




撰寫一個單元測試的目的在「驗證」一個單元的正確性(癈話!!),因此,單元測試可以說就是模擬客戶端呼叫方法,並確認客戶端在意的預期結果是否與呼叫結果吻合的過程。

對於客戶端可能在意的預期結果可以區分為三類,分別是呼叫方法的回傳值、呼叫方法後物件的狀態及呼叫方法所屬物件與其他物件的互動情形。

透過傳入不同定義域的的代表性樣本值來確認值域是否符合預期,藉以確認函式的處理邏輯是否符合預期,後面透過一個 IPeople 介面,定義 Ask 、 Eat 及 Recevie 三個不同方法,針對不同的情景建立對應的案例及測試實做示例。

呼叫方法的回傳值

Ask 方法

Ask 方法示範對於具有回傳值的處理的測試撰寫方式。

商業邏輯

人聽到提問會回覆答案。

案例

松下問童子,言師採藥去

Gherkin

Given 問題 "林老師哩?"
When 詢問樹下童子
Then 得到回應 "採藥去"

實做

[TestMethod]
public void Test_函式回傳值()
{
    //Arrange
    var sQuestion = "林老師哩?";
    //Act
    var objChild = (IPeople)new Child();
    var sAnswer = objChild.Ask(sQuestion);
    //Assert
    Assert.AreEqual("採藥去", sAnswer);
}

呼叫方式後物件的改變

Eat 方法

Eat 方法示範處理前後物件屬性值的改變的測試。

商業邏輯

人吃多少重量的食物則體重就會增加多少。

案例

有一位 100 公斤的客人點了一塊 2公斤的牛排當晚餐,這個客人吃完後體重應為 102 公斤。

Gherkin

Given 一塊 2 公斤的牛排的晚餐
When 體重 100 公斤的客戶吃完
Then 客戶體重為 102 公斤

實做

[TestMethod]
public void Test_物件的屬性值()
{
    //Arrange
    var objDiner = (IFood)new Meet(2);
    //Act
    var objClient = (IPeople)new Customer(100);

    objClient.Eat(objDiner);
    //Assert
    Assert.IsTrue(objClient.Weight == 102);
}

呼叫方法時方法所屬物件與其他物件間的互動情形

Recevie 方法

Recevie 方法示範驗證處理過程中物件互動的測試撰寫方式。

商業邏輯

人會將收到的工作推給其他人。

案例

經理收到的工作後會轉給所屬工程師。

Gherkin

Given 工程師
When 經理接收到一項工作
Then 工程師會被呼叫執行

實做

[TestMethod]
public void Test_物件間的互動()
{
    var objEngineer = new StubEngineer();
    var objTask = new Task();
    var objManager = new Manager();

    objManager.Subordinate.Add(objEngineer);
    ((IPeople)objManager).Receive(objTask);

    Assert.IsTure(objEngineer.RunJobMethodCalled())
}