什么是Mock
如果將mock單獨翻譯過來,其意義為 “虛假、虛設”,因此在軟件開發領域,我們也可以將其理解成 “虛假數據”,或者 “真實數據的替身”。
為什么使用Mock
1.解除依賴,團隊並行工作
接口尚未開發完成,在系統交互雙方定義好接口之后,我們可以提前進行開發和測試,並不依賴上游系統的開發實現。
2.開啟TDD模式,即測試驅動開發
單元測試是TDD的基石,當接口定義好后,測試人員就可以創建一個Mock,把接口添加到自動化測試環境中,提前創建測試。
3.隔離系統
通過編寫Mock,隔離請求操作(Get、Post)對於數據庫中數據的污染。
4.提升測試覆蓋度
通過Mock接口返回的不同狀態,來查看系統是否能夠正常影響,提升測試的覆蓋度。
5.方便演示
通過使用Mock模擬數據接口,我們即可在只開發了UI的情況下,無須服務端的開發就可以進行產品的演示。
除此之外,Mock可以加深我們對測試的理解,深入明白測試“輸入”和“輸出”的不同表達形式,同時還能提高自身技術,脫離功能測試對於開發的依賴。
市面上常見的Mock工具
市面上常見的Mock分為單元測試級別的Mock工具和接口測試級別的Mock工具
單元測試級別的mock工具
單元測試級別的Mock工具有Easymock、jMock、Mockito、Unitils Mock、PowerMock、JMockit等。
EasyMock
EasyMock 是一套用於通過簡單的方法對於給定的接口生成 Mock 對象的類庫。它提供對接口的模擬,能夠通過錄制、回放、檢查三步來完成大體的測試過程,可以驗證方法的調用種類、次數、順序,可以令 Mock 對象返回指定的值或拋出指定異常。通過 EasyMock,我們可以方便的構造 Mock 對象從而使單元測試順利進行。
JMock
JMock是一個使用模擬對象機制測試Java代碼的開發包。模擬對象(Mock Object)可以取代真實對象的位置,用於測試一些與真實對象進行交互或依賴於真實對象的功能,模擬對象的背后目的就是創建一個輕量級的、可控制的對象來代替測試中需要的真實對象,模擬真實對象的行為和功能,方便我們的測試。JMock就是這種機制的實現,使用JMock我們可以快速創建模擬對象,定義交互過程中的約束條件等,同時JMock也是易擴展的,你可以很方便添加自定義的需求。
Mockito
Mockito 無需准備昂貴的前期啟動。他們的目標是透明的,讓開發人員專注於測試選定的行為。
Mockito 擁有的非常少的 API,所有開始使用 Mockito,幾乎沒有時間成本。因為只有一種創造 mock 的方式。只要記住,在執行前 stub,而后在交互中驗證。你很快就會發現這樣 TDD java 代碼是多么自然。
單元測試Mock工具對比
Features:
Feature |
EasyMock |
jMock |
Mockito |
UnitilsMock |
PowerMock(EasyMock) |
PowerMock(Mockito) |
JMockit |
---|---|---|---|---|---|---|---|
Invocation count constraints(調用數限制) | √ | √ | √ | √ | √ | √ | |
Recording strict expectations(記錄嚴格的預期結果) | √ | √ | √ | √ | |||
Explicit verification(顯式驗證) | √ | √ | √ | √ | |||
Partial mocking(部分mock) | √ | √ | √ | √ | √ | √ | |
Easier argument matching based on properties of value objects(基於值對象屬性的簡化參數匹配) | √ | √ | √ | √ | √ | √ | |
Cascading mocks(級聯mock) | √ | √ | √ | √ | |||
Mocking of multiple interfaces(多接口mock) | √ | √ | √ | ||||
Mocking of annotation types(注釋類型mock) | √ | √ | √ | √ | √ | ||
Partially ordered expectations | √ | √ | |||||
Auto-injection of mocks(mock的自動注入) | √ | √ | √ | √ | |||
Mocking of enums(枚舉的mock) | √ | √ | √ | ||||
Declarative mocks for test methods (mock parameters) | √ | ||||||
Mocking of unspecified implementation classes(未實現接口類的mock) | √ | ||||||
“Duck typing” fakes for integration tests | √ | ||||||
Total | 4/14 | 4/14 | 8/14 | 6/14 | 5/14 | 9/14 | 14/14 |
Qualities:
Feature |
EasyMock |
jMock |
Mockito |
UnitilsMock |
PowerMock(EasyMock) |
PowerMock(Mockito) |
JMockit |
---|---|---|---|---|---|---|---|
Argument matchers for some parameters only, not all | √ | √ | |||||
No method call to switch from record to replay(切換記錄回放時無方法調用) | √ | √ | √ | √ | |||
No extra code for implicit verification(隱式驗證沒有額外代碼) | N/A | N/A | N/A | √ | |||
No extra “prepare for test” code(沒有額外的”prepare for test”代碼) | √ | √ | √ | √ | √ | ||
No need to use @RunWith annotation or base test class(不需要用@runwith注解和測試基類) | √ | √ | √ | √ | |||
Consistent syntax between void and non-void methods(空和非空方法的語法一致) | √ | √ | √ | ||||
Mocking of constructors and final/static/private methods(構造函數、final、static和private方法的mock) | √ | √ | √ | ||||
Mocking of “new-ed” objects(“new-ed”對象的mock) | √ | √ | √ | ||||
Support for covariant return types | √ | ||||||
Single jar file in the classpath is sufficient to use mocking API(在classpath中的單個jar文件就能夠使用mockAPI | √ | N/A | N/A | √ | |||
Total | 2/10 | 3/10 | 4/9 | 4/9 | 2/9 | 3/8 | 10/10 |
接口測試級別的mock工具
接口測試級別的Mock工具有RAP、Yapi、Moco等。
RAP
RAP是阿里團隊出的一款接口管理工具,幫助開發人員有效的管理接口文檔。包括阿里集團在內的三百五十多個企業都在使用RAP管理重要的接口文檔。
Web接口管理工具,接口自動化,MOCK數據自動生成,自動化測試
能夠通過分析接口結構自動生成Mock數據、校驗真實接口的正確性
阿里產品,功能完善、結合了文檔、Mock.js、可視化、Rest、接口過渡、文檔修改提醒、支持本地部署
Yapi
YApi是去哪兒網移動架構組開發的一個開源項目,YApi的 Mock 功能可以根據用戶的輸入接口信息如協議、URL、接口名、請求頭、請求參數、返回數據、生成 Mock 接口,這些接口會自動生成模擬數據,創建者可以自由構造需要的數據。mock模擬數據基於mock.js。
Mock.js 是一款模擬數據生成器,旨在幫助前端獨立於后端進行開發,幫助編寫單元測試。提供了以下模擬功能:
根據數據模板生成模擬數據
模擬 Ajax 請求,生成並返回模擬數據
基於 HTML 模板生成模擬數據
Moco
Moco 是一個簡單搭建 stub 的框架,主要用於測試和集成。
Moco本身支持API和獨立運行兩種方式。通過使用API,開發人員可以在JUnit、JBehave等測試測試框架里使用Moco,極大程度地降低了集成點測試的復雜度
Moco可以提供以下服務:
HTTP APIs
Socket APIs
REST API
接口測試Mock工具對比
Yapi |
Rap |
Moco |
|
---|---|---|---|
方便集成 | √ | √ | × |
Mock簡便性 | √ | √ | √ |
文檔管理 | √ | × | × |
開源程度 | √ | √ | √ |
部署難度 | 低 | 高 | 低 |
可視化界面 | √ | √ | × |
本文轉自:搜狗測試
end