發表文章

目前顯示的是有「單元測試」標籤的文章

單元測試學習筆記03_Mock Framework介紹(Moq)_MVC專案的UnitTest介紹

圖片
在上一篇中介紹到有分所謂 Stub跟Mock的做法 那在一般實作中較常用到的是模擬物件 Mock,因為很常我們處裡道的是 沒有回傳值的情況,因此比較著重在互動方式的驗證。 這類模擬物件的技法可以幫助我們在開發階段中不會 因為正式環境還沒準備好就無法驗證程式的窘境 但若要每次都自己寫Mock其實也滿費時的 因此就有推出許多Mock框架 在此先介紹 Moq 也可輕鬆定義模擬物件包含visual studio intellisense整合使減輕測試的麻煩 此外Moq強型別的特性也能降低測試程式撰寫發生錯誤機率 採用授權為 The 3-Clause BSD License 新建一個MVC包含UnitTest的專案 在此順帶觀察MVC專案的UnitTest寫作方式 預設產生的示例 我們這裡已經事先準備寫好的一個BeginController 類別 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 using System ; using System.Collections.Generic ; using System.Linq ; using System.Web ; using System.Web.Mvc ; namespace MVC_UniTestApp.Controllers { public class BeginController : Controller { // GET: Begin public ActionResult Show () { ViewBag.Message = "早安你好" ; return View (); } } } 而我們在測試專案中的Controller目錄可再增加測試類與相關測試method BeginControllerTest 類別 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 using Microsoft.VisualStudio.TestTools.UnitTesting ; using System ; ...

單元測試學習筆記02_虛設常式(stub)、模擬物件(Mock)_call api為例

圖片
一般測試中比較容易頭疼就是在於對於外部資源會有依賴 (像是一段function涉及到發信、寫Log檔、讀取外部文件或者call web api, web service等) 而除了外部資源外還可能會有我只想驗證自己負責的class中特定方法但該方法可能又有去呼叫或者存取也就是依賴到其餘class的方法甚至層層相依等問題 如下圖所示 測試過程往往會遇到目標要測試的方法當中又相依很多其餘的class 甚至會往下相依多個層級 此時我們會藉由類似建構假物件(Fake)的方式來把關注點分離 進行隔離測試程式碼 有點類似 「各人自掃門前雪,莫管他人瓦上霜」的含意。 Microsoft Fakes 會以「虛設常式」或「填充碼」取代應用程式的其他部分,協助您隔離要測試的程式碼。 這些是受測試所控制的一些程式碼片段。 藉由隔離待測的程式碼,您可以在正確的位置尋找測試失敗的原因。 即使應用程式的其他部分還無法運作,您也可以利用虛設常式和填充碼。 該框架鎖定義Fakes 分為兩種類別: 虛設常式(stub) 會以一小段實作相同介面的類別取代類別。 若要使用虛設常式,您所設計的應用程式 必須讓每個元件只相依於介面,而不相依於其他元件 。 (「元件」表示一起設計及更新的類別或類別群組,通常會包含在組件中)。 填充碼(shim) 會在執行階段修改應用程式的編譯程式碼,以便執行您的測試所提供的填充碼,而不是進行指定的方法呼叫。 您可以使用填充碼取代您無法修改的組件 (例如 .NET 組件) 的呼叫。 不過很遺憾這功能只有在enterprice版本的visual studio才有支援 https://stackoverflow.com/questions/18337736/add-fakes-assembly-option-missing/18339061 https://blog.johnwu.cc/article/c-sharp-unit-test-datetime.html 這裡我就沒特別用它來示範了 而一般Fake通用觀念就是上一篇提及到的 主要分成兩大類 虛設常式(stub) 通常 用於驗證目標回傳值 ,以及驗證目標物件狀態的改變(State-Based Testing) These are extremely simplified versions of Mocks, which ty...