-
單元測試簡介
單元測試是對軟件進(jìn)行準(zhǔn)確性驗(yàn)證的步驟。
單元測試并不進(jìn)行整個軟件功能的測試,僅僅是對于最小工作單元的測試。一般最小工作單元就是指方法/函數(shù)等。
這里并不打算對單元測試的概念及基礎(chǔ)進(jìn)行更多的介紹,需要了解更多的自行g(shù)oogle。 -
單元測試作用
許多開發(fā)者都有個習(xí)慣,常常不樂意去寫個簡單的單元測試程序來驗(yàn)證自己的代碼。
對自己的程序一直非常有自信,或存在僥幸心理每次運(yùn)行通過后就直接扔給測試組測試了。
然而每次測試組的BUG提交過來后就會發(fā)現(xiàn)自己的程序還存在許多沒有想到的漏洞。
但是每次修改好BUG以后還是懷著僥幸心理,認(rèn)為這次不會有bug了。然后又一次自信地提交,結(jié)果又?jǐn)×恕?br> 其實(shí)在項(xiàng)目開發(fā)的過程中,實(shí)際編程的時間并不是特別多,而真正耗時的往往是調(diào)試和修改階段。
因此單元測試的覆蓋是很有必要的。
一般認(rèn)為,單元測試有四種作用:
(1)使代碼可以放心修改和重構(gòu);
(2)迫使程序員從調(diào)用者而不是實(shí)現(xiàn)者的角度設(shè)計(jì)軟件模塊;
(3)迫使程序員將軟件模塊寫得易于測試和調(diào)用,從而有利于解耦;
(4)測試本身可作為被測代碼的用法說明,從而替代了一部分文檔功能。 -
測試驅(qū)動和傳統(tǒng)單元測試的流程對比
傳統(tǒng)的單元測試流程

- 單元測試框架
NUnit(XUnit:JUnit CPPUnit DUnit PHPUnit)
MSTest
5.為什么要用Mock
在測試過程中,往往會遇到這些問題:
(1)真實(shí)對象具有不可確定的行為(產(chǎn)生不可預(yù)測的結(jié)果,如股票行情)。
(2)真實(shí)對象很難被創(chuàng)建。
(3)真實(shí)對象的某些行為很難觸發(fā)(如網(wǎng)絡(luò)錯誤)。
(4)真實(shí)對象令程序的運(yùn)行速度很慢。
(5)真實(shí)對象有(或者是)用戶界面。
(6)測試需要詢問真實(shí)對象它是如何被調(diào)用的(例如,測試可能需要驗(yàn)證某個回調(diào)函數(shù)是否被調(diào)用了)。
(7)真實(shí)對象實(shí)際上并不存在(當(dāng)需要和其他開發(fā)小組,或者新的硬件系統(tǒng)打交道的時候,這是一個普遍問題)。
借助于mock對象,我們就可以解決上面提到的所有問題。
- Stub和Mock的區(qū)別?


-
單元測試隔離框架
MSFakes
介紹
Microsoft Fakes是UnitTestFramework下的高級組件。
Microsoft Fakes可以幫我們隔離測試的代碼。
我們的代碼/方法很多時候并不是完全獨(dú)立的。
一個方法會受到傳入的參數(shù)的影響,一個方法也可能去調(diào)用另外一個方法才能正確的執(zhí)行。
所以當(dāng)我們想要對一個方法進(jìn)行單元測試的時候,如果有其他因素影響,那么我們很難確定這個方法失敗錯誤的真實(shí)原因。
所以我們進(jìn)行單元測試的時候就要想辦法消除這些影響。這個時候我們可以用Microsoft Fakes。
Microsoft Fakes可以用來模擬接口,靜態(tài)方法等,通過Microsoft Fakes模擬的方法,具有穩(wěn)定的,可以預(yù)期的返回值,這個時候我們就可以認(rèn)為消除了外部模塊對單元測試的影響。注意:Microsoft Fakes并不是所有版本的VisualStudio都支持,通常只有高級版本才包含。比如VisualStudio2015只有Enterprice版本才支持。
Microsoft Fakes主要有2大功能:stub和shim
stub
一個stub可以用來替換一個實(shí)現(xiàn)了某個接口的class。簡單的說stub可以用來快速的實(shí)現(xiàn)一個接口,用來測試。使用stub來測試,你的程序必須是面向接口設(shè)計(jì)的。
shim
一個shim可以用來替換一個你已經(jīng)編譯完成的庫中的某個方法,當(dāng)你的測試運(yùn)行的時候,調(diào)用的是shim模擬的方法。shim可以用來模擬那些你無法修改的程序集的方法,比如.NET內(nèi)置類庫。
參考文章
使用Microsoft Fakes進(jìn)行單元測試-Agile.Zhou
用 Microsoft Fakes 隔離測試代碼-MSDNNsubstitute
介紹
NSubstitute 更注重替代(Substitute)概念。
它的設(shè)計(jì)目標(biāo)是提供一個優(yōu)秀的測試替代的.NET模擬框架。
它是一個模擬測試框架,用最簡潔的語法,使得我們能夠把更多的注意力放在測試工作,減輕我們的測試配置工作,以滿足我們的測試需求,幫助完成測試工作。
它提供最經(jīng)常需要使用的測試功能,且易于使用,語句更符合自然語言,可讀性更高。對于單元測試的新手或只專注于測試的開發(fā)人員,它具有簡單、友好的語法,使用更少的lambda表達(dá)式來編寫完美的測試程序。
NSubstitute 采用的是Arrange-Act-Assert測試模式,你只需要告訴它應(yīng)該如何工作,然后斷言你所期望接收到的請求,就大功告成了。因?yàn)槟阌懈匾拇a要編寫,而不是去考慮是需要一個Mock還是一個Stub。參考文章
Moq
介紹
Moq的發(fā)明者聲稱,較之于其他的模擬對象框架(例如Rhino Mocks和TypeMock Isolator),這個框架更易于學(xué)習(xí)和使用。
具體來看,Moq框架中充分利用了VB.NET和C#語言的最新特征,例如lambda表達(dá)式與泛型的概念。
因此,當(dāng)你使用Moq創(chuàng)建模擬對象時,你可以使用lambda表達(dá)式來描述你想要模擬的方法與屬性等。
由于提供了對于最新的lambda表達(dá)式的支持,Moq得以能夠提供一種格外清晰的語法形式來描述期望值、參數(shù)約束和返回值等。參考文章
Fakes實(shí)戰(zhàn)分享
MOOC2U 支付下訂單業(yè)務(wù)模塊
