使用Microsoft Fakes進行單元測試(1)

jopen 8年前發布 | 31K 次閱讀 單元測試

一:什么是單元測試

單元測試是對軟件進行準確性驗證的步驟。單元測試并不進行整個軟件功能的測試,僅僅是對于最小工作單元的測試。一般最小工作單元就是指方法/函數等。

這里并不打算對單元測試的概念及基礎進行更多的介紹,需要了解更多的自行google。

二:UnitTestFramework

UnitTestFramework是微軟開發的一套單元測試框架。類似的三方框架有NUnit等。UnitTestFramework為單元測試提供斷言,自動化測試,管理界面等功能。與VisualStudio無縫集成。

三:Microsoft Fakes

Microsoft Fakes是UnitTestFramework下的高級組件。Microsoft Fakes可以幫我們隔離測試的代碼。我們的代碼/方法很多時候并不是完全獨立的。一個方法會受到傳入的參數的影響,一個方法也可能去調用另外一個方法才能正確的執行。所以當我們想要對一個方法進行單元測試的時候,如果有其他因素影響,那么我們很難確定這個方法失敗錯誤的真實原因。所以我們進行單元測試的時候就要想辦法消除這些影響。這個時候我們可以用Microsoft Fakes。Microsoft Fakes可以用來模擬接口,靜態方法等,通過Microsoft Fakes模擬的方法,具有穩定的,可以預期的返回值,這個時候我們就可以認為消除了外部模塊對單元測試的影響。

注意:Microsoft Fakes并不是所有版本的VisualStudio都支持,通常只有高級版本才包含。比如VisualStudio2015只有Enterprice版本才支持。

Microsoft Fakes主要有2大功能:

stub:

一個stub可以用來替換一個實現了某個接口的class。簡單的說stub可以用來快速的實現一個接口,用來測試。使用stub來測試,你的程序必須是面向接口設計的。

shim:

一個shim可以用來替換一個你已經編譯完成的庫中的某個方法,當你的測試運行的時候,調用的是shim模擬的方法。shim可以用來模擬那些你無法修改的程序集的方法,比如.NET內置類庫。

四:示例

1.使用Stub來模擬接口

使用VisualStudio新建一個項目叫做MSFakeSample:

我們想象這樣一個業務需求。我們需要把所有學生的名稱組合成一個用逗號分隔的字符串。所有的學生信息存放在數據庫里。

IStudentsRepository

這個接口描述的是Students倉儲類需要實現的功能。

StudentsService

這類是用來實現Students的業務邏輯。

按照正常的開發邏輯,我們這個時候還需要去實現IStudentsRepository這個接口,也許是封裝EF,也許是封裝Dapper等等,然后才能去測試ConnectNames這個方法。但是盡管用EF等去實現了IStudentsRepository接口,我們的測試方法嚴重依賴了倉儲層,數據庫。也許為了測試我們還需要配置數據庫連接,添加模擬數據到數據庫。任何IStudentsRepository實現類的變化,或者數據庫的變化,都可能影響到單元測試的結果。如果我們可以隔離這些變化那么我們的單元測試將變得非常完美。

有了Microsoft Fakes我們可以模擬一個實現了IStudentsRepository的類,來完全的隔離IStudentsRepository實現類的變化,或者數據庫的變化。

創建單元測試類

在ConnectNames方法上右擊,點擊創建單元測試

在彈出的創建單元測試對話框上點擊確定,程序就會自動創建一個以當前項目名稱+Tests的項目,并且為你生成一個測試類StudentsServiceTests。

添加Fakes程序集

新增的Tests項目會自動引用MSFakeSample項目,在引用下右擊MSFakeSample,點擊添加Fakes程序集

點擊添加Fakes程序集后VS會自動生成一個MSFakeSample.fakes的庫并且引用。

使用stub來模擬接口

有了上面的這些操作,我們就可以開始真正的使用Fakes的Stub來模擬接口了。

我們直接new了3個StubIStudentsRepository類,并且用Lambda表達式直接定義了3個方法,分別返回null,空List,跟一個正常的List來描述3種情況。然后用Assert去斷言跟預期的結果是否一致。

運行單元測試

Ctrl+T+R直接運行,會彈出單元測試運行窗口

可以看到ConnectNamesTest Passed,測試通過了。

通過使用Fakes的Stub功能,我們可以輕而易舉的模擬接口。利用Lambda表達式來直接控制方法的返回值,使其穩定不變,從而為測試方法隔離接口。

不管你真正的接口如何實現,我測試的方法永遠不會受到影響。

2.使用Shim模擬靜態方法

太晚了,下回分解吧。晚安~

來自: http://www.cnblogs.com/kklldog/p/5143908.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!