https://cloud.tencent.com/developer/article/1684199?from=article.detail.1465591
什麼是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簡便性 |
√ |
√ |
√ |
文檔管理 |
√ |
× |
× |
開源程度 |
√ |
√ |
√ |
部署難度 |
低 |
高 |
低 |
可視化界面 |
√ |
√ |
× |