《Unit Testing》2.1 伦敦学派如何做隔离
針對單元測試的定義,主要有兩種看法:
經典學派。經典學派之所以經典,是因為這原本就是人們做單元測試和測試驅動開發的方式
倫敦學派。倫敦學派扎根于倫敦的編程社區。
?
單元測試的定義
單元測試有很多定義,但是所有的定義都有三個重要的屬性。單元測試是一個自動化測試,并且:
驗證一小段代碼(或者叫一個單元)
執行速度快
使用隔離的方式進行
?
而隔離的方式是經典學派和倫敦學派的根本區別所在。(我個人使用經典的方式)
?
隔離問題,倫敦學派的做法
以隔離的方式驗證一段代碼(一個單元)意味著什么?
倫敦學派把它描述成將被測試系統(SUT,System Under Test)與它的協作者隔離開來。也就是說,如果一個 class 有依賴項或依賴其它的class,需要把這些依賴項都使用測試替身(test double)來替換掉。
測試替身(test double)是一個外觀和行為都與其對應的正式版本類似的對象,但它是一個簡化版,它降低了復雜性并有助于測試。
?
使用測試替身替換依賴項,如下圖:
這樣做的好處有:
如果測試失敗,出問題的代碼肯定是 SUT(被測試系統)。其它地方不會出現嫌疑,因為其鄰居都被測試替身替換掉了。
它能夠拆分對象圖,也就是溝通的類之間組成的網絡。你可以把被測試類的直接依賴項替換掉,這樣就不需要再處理依賴項的依賴項了,從而大大減少單元測試的準備工作。
還有一個小的優點,它允許你引入項目范圍內的指南:一次只測試一個類。這樣的話就無需考慮代碼覆蓋率的問題了,因為如果建立一個類,那么就創建它對應的一個測試類。如下圖:
??
如何創建測試替身?
首先看經典學派如何做單元測試:
這里面 Customer 是被測試系統 SUT,而 Store 是它的協作者。
在經典學派里,不使用測試替身替代依賴項。
?
針對同一個類,倫敦學派是這樣做單元測試的:
這里我使用了Moq(https://github.com/moq/moq4)框架。
具體的說,我是用mock 這種東西替代了 Store。(而 mock 是測試替身的一種,現在知道這么多就行)。
這里面 Mock<IStore> 就是 Store 的簡化版:
在傳入特定參數時,HasEnoughInventory 方法會被指定返回 true 或 false。
此外,也可以得到?RemoveInventory 被調用的次數,并將其用于驗證。
總結
以上是生活随笔為你收集整理的《Unit Testing》2.1 伦敦学派如何做隔离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用ABP进行软件开发之基础概览
- 下一篇: Gartner:容器采用将迅速增长,但不