Mock工具介紹
什么是Mock
????如果將mock單獨翻譯過來,其意義為?“虛假、虛設(shè)”,因此在軟件開發(fā)領(lǐng)域,我們也可以將其理解成?“虛假數(shù)據(jù)”,或者?“真實數(shù)據(jù)的替身”。
為什么使用Mock
1.解除依賴,團(tuán)隊并行工作
接口尚未開發(fā)完成,在系統(tǒng)交互雙方定義好接口之后,我們可以提前進(jìn)行開發(fā)和測試,并不依賴上游系統(tǒng)的開發(fā)實現(xiàn)。
2.開啟TDD模式,即測試驅(qū)動開發(fā)
單元測試是TDD的基石,當(dāng)接口定義好后,測試人員就可以創(chuàng)建一個Mock,把接口添加到自動化測試環(huán)境中,提前創(chuàng)建測試。
3.隔離系統(tǒng)
通過編寫Mock,隔離請求操作(Get、Post)對于數(shù)據(jù)庫中數(shù)據(jù)的污染。
4.提升測試覆蓋度
通過Mock接口返回的不同狀態(tài),來查看系統(tǒng)是否能夠正常影響,提升測試的覆蓋度。
5.方便演示
通過使用Mock模擬數(shù)據(jù)接口,我們即可在只開發(fā)了UI的情況下,無須服務(wù)端的開發(fā)就可以進(jìn)行產(chǎn)品的演示。
除此之外,Mock可以加深我們對測試的理解,深入明白測試“輸入”和“輸出”的不同表達(dá)形式,同時還能提高自身技術(shù),脫離功能測試對于開發(fā)的依賴。
市面上常見的Mock工具
市面上常見的Mock分為單元測試級別的Mock工具和接口測試級別的Mock工具
單元測試級別的mock工具
單元測試級別的Mock工具有Easymock、jMock、Mockito、Unitils Mock、PowerMock、JMockit等。
EasyMock
EasyMock 是一套用于通過簡單的方法對于給定的接口生成 Mock 對象的類庫。它提供對接口的模擬,能夠通過錄制、回放、檢查三步來完成大體的測試過程,可以驗證方法的調(diào)用種類、次數(shù)、順序,可以令 Mock 對象返回指定的值或拋出指定異常。通過 EasyMock,我們可以方便的構(gòu)造 Mock 對象從而使單元測試順利進(jìn)行。
JMock
JMock是一個使用模擬對象機(jī)制測試Java代碼的開發(fā)包。模擬對象(Mock Object)可以取代真實對象的位置,用于測試一些與真實對象進(jìn)行交互或依賴于真實對象的功能,模擬對象的背后目的就是創(chuàng)建一個輕量級的、可控制的對象來代替測試中需要的真實對象,模擬真實對象的行為和功能,方便我們的測試。JMock就是這種機(jī)制的實現(xiàn),使用JMock我們可以快速創(chuàng)建模擬對象,定義交互過程中的約束條件等,同時JMock也是易擴(kuò)展的,你可以很方便添加自定義的需求。?
Mockito
Mockito 無需準(zhǔn)備昂貴的前期啟動。他們的目標(biāo)是透明的,讓開發(fā)人員專注于測試選定的行為。
Mockito 擁有的非常少的 API,所有開始使用 Mockito,幾乎沒有時間成本。因為只有一種創(chuàng)造 mock 的方式。只要記住,在執(zhí)行前 stub,而后在交互中驗證。你很快就會發(fā)現(xiàn)這樣 TDD java 代碼是多么自然。
單元測試Mock工具對比
Features:
Feature | EasyMock | jMock | Mockito | UnitilsMock | PowerMock(EasyMock) | PowerMock(Mockito) | JMockit |
|---|---|---|---|---|---|---|---|
| Invocation count constraints(調(diào)用數(shù)限制) | √ | √ | √ | √ | √ | √ | |
| Recording strict expectations(記錄嚴(yán)格的預(yù)期結(jié)果) | √ | √ | √ | √ | |||
| Explicit verification(顯式驗證) | √ | √ | √ | √ | |||
| Partial mocking(部分mock) | √ | √ | √ | √ | √ | √ | |
| Easier argument matching based on properties of value objects(基于值對象屬性的簡化參數(shù)匹配) | √ | √ | √ | √ | √ | √ | |
| Cascading mocks(級聯(lián)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(未實現(xiàn)接口類的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(切換記錄回放時無方法調(diào)用) | √ | √ | √ | √ | |||
| 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(構(gòu)造函數(shù)、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是阿里團(tuán)隊出的一款接口管理工具,幫助開發(fā)人員有效的管理接口文檔。包括阿里集團(tuán)在內(nèi)的三百五十多個企業(yè)都在使用RAP管理重要的接口文檔。
Web接口管理工具,接口自動化,MOCK數(shù)據(jù)自動生成,自動化測試
能夠通過分析接口結(jié)構(gòu)自動生成Mock數(shù)據(jù)、校驗真實接口的正確性
阿里產(chǎn)品,功能完善、結(jié)合了文檔、Mock.js、可視化、Rest、接口過渡、文檔修改提醒、支持本地部署
Yapi
YApi是去哪兒網(wǎng)移動架構(gòu)組開發(fā)的一個開源項目,YApi的 Mock 功能可以根據(jù)用戶的輸入接口信息如協(xié)議、URL、接口名、請求頭、請求參數(shù)、返回數(shù)據(jù)、生成 Mock 接口,這些接口會自動生成模擬數(shù)據(jù),創(chuàng)建者可以自由構(gòu)造需要的數(shù)據(jù)。mock模擬數(shù)據(jù)基于mock.js。
Mock.js 是一款模擬數(shù)據(jù)生成器,旨在幫助前端獨立于后端進(jìn)行開發(fā),幫助編寫單元測試。提供了以下模擬功能:
根據(jù)數(shù)據(jù)模板生成模擬數(shù)據(jù)
模擬 Ajax 請求,生成并返回模擬數(shù)據(jù)
基于 HTML 模板生成模擬數(shù)據(jù)
Moco
Moco 是一個簡單搭建 stub 的框架,主要用于測試和集成。
Moco本身支持API和獨立運(yùn)行兩種方式。通過使用API,開發(fā)人員可以在JUnit、JBehave等測試測試框架里使用Moco,極大程度地降低了集成點測試的復(fù)雜度
Moco可以提供以下服務(wù):
HTTP APIs
Socket APIs
REST API
接口測試Mock工具對比
Yapi | Rap | Moco | |
|---|---|---|---|
| 方便集成 | √ | √ | × |
| Mock簡便性 | √ | √ | √ |
| 文檔管理 | √ | × | × |
| 開源程度 | √ | √ | √ |
| 部署難度 | 低 | 高 | 低 |
| 可視化界面 | √ | √ | × |
本文轉(zhuǎn)自:搜狗測試
