很開心剛到公司就搶到91的上課機會

單元測試之前有接觸過相關內容但常常反應不過來到底要做甚麼

終於今天上課有了比較系統性的認識

趁著還有記憶趕快來筆記一下

==============================================

*現有程式改單元測試 步驟

  • 前置分析作業
    • 找到相依性(Dependency)
    • 相依性程式碼重構新的Math
    • 將該Math 從 private 改成protect virtual
  • 測項編寫
    • 新增測試對象(SUT)子類  ex: getMemberForTest....
    • Override相依性的Math
    • set 相依性參數為public Fields
    • 新增測項並且記得要設SetUp不然測項結果會累加
    • 將測項指到SUT子類
    • 決定相依性

 

===============================================

以下紀錄上課的三大範例

1. Today is Holiday

需求: 如果今天是聖誕節(12/25),回傳String"Today Is Holiday",如果不是,回傳"Today Is Not Holiday"

實做:

  1. 此測項相依性是DateTime.today,根據前置作業只是相GetToday()寫為 protect virtual
  2. 新增HolidayForTest SUT子類
  3. 於SUT子類將相依性的today參數提取成Fields,設為public 且複寫GetToday設定today值
  4. 新增測項,設定SetUp,並將測項來源指到SUT子類
  5. 根據需求邏輯編寫測項_TodayIsHoliday
  6. 完成測試後重構現有測項,分為SetData和ResponseShould等兩大類
  7. 新增其他測項_TodayIsNotHoliday

/////////////////////////

2.AuthenticationService

需求: 輸入帳號密碼後,根據帳號取得profile並且計算密碼驗證後是否符合輸入密碼

實做: 

  1. 此測項相依性有兩個,一為取得profile,另一個為資料加密(RSA)是亂數須於測項有固定值
  2. 前置作業 寫了兩個介面和兩個方法 分別為IProfile.GetPasswort() & IToken.GetRSAToken()
  3. 介面新增Fake介面  FakeProfile & FakeToken
  4. 將SUT 新增建構子,分為程式碼呼叫(預設) 跟介面設定建構子,才能確保程式碼可正常運作
  5. 前置作業結束後開始建立測項
  6. 建立SetUp並將介面用Substituter建立虛擬介面(FakeProfile & FakeToken),透過Substituter便可快速的override各種math回傳指定的結果
  7. 編寫測項is_valid
  8. 重構is_valid,一樣分為參數設定和ResultShouldBe兩大類
  9. 重構後快速的新增is_not_valid測項

/////////////////////////

3.OrderService

需求:取得OrderList後filter 類型為書籍的訂單執行同步的function(逐筆insert至結果),特別注意此功能已上線所以不能改任何架構

實做:

  1. 分析相依性為Order來源 跟 BookOrderInsert,原本可使用介面的方法去執行,但 因特別要求不能改架構(包含改public),所以這邊採用案例1的override方式修改
  2. 新增FakeOrder繼承OrderService,override GerOrder() 並新增一個SetOrder的function,這樣在測項時便可根據測試需求 先呼叫SetOrder指定要回傳得資料便可
  3. 解決了Order的相依性後BookOrder仍然可以套用Interface的方式,建立一個IBook,這樣宣告Book這個Class時便可重構一個GetBookDao的math,在透過SUT子類重新定義GetBook
  4. 重複步驟2 一樣override寫GetBook並新增SetBook的功能讓測項可以指定會取得甚麼資料
  5. 完成兩個相依性後 便可開始寫測項,由於insert這個meth本身並不會回傳值供測項驗證,所以我們這邊選擇sub.receve來驗證是否有新增正確筆數
  6. 編寫測項時的小技巧,可以在設定資料時,夾雜一些非目標測式的資料,以驗證是否真的是否根據測試需求而取得正確的目標,比如說OrderList = {Book},{Order},{Book};

==========================================================

課後心得整理

*單元測試 三種驗證方向

  • 驗證回傳值 
  • 驗證狀態是否改變
    • 將SUT 寫一個子類繼承並將測項指到子類測試
    • 將相依性抽為math 並從private 改為 protected virtual ,在寫override
    • 將SUT抽成Interface在用Substituter指定回傳值
  • 跟相依性的物件有沒有互動
    • 透過Receive 或NotReveive驗證
arrow
arrow
    文章標籤
    單元測試 91大神
    全站熱搜
    創作者介紹
    創作者 JayeChen987 的頭像
    JayeChen987

    Jaye的碎碎念

    JayeChen987 發表在 痞客邦 留言(0) 人氣()