漫話:如何給女朋友解釋什么是Mock?

某天晚上,接到測試的電話,他問為什么在日常環(huán)境我的接口使用不同的用戶測試返回的內(nèi)容都一樣,我回答他:接口數(shù)據(jù)被我mock掉了,現(xiàn)在返回的都是mock數(shù)據(jù)。需要調(diào)一下mock的邏輯才行。
掛斷電話之后,女朋友滿懷好奇的來問我:




Mock,直譯過來的話是虛假的意思,但是在面向?qū)ο蟪绦蛟O計中,一般翻譯成模擬。如接口mock、mock對象等,通常表示接口模擬、模擬對象等。
在程序開發(fā)中,一般在兩種場景中會是用到mock技術,第一種是在單元測試的時候,第二種是在接口測試的時候。


最初,mock主要應用在單元測試中,因為單元測試的目的是只想針對自己關注的這個"單元"部分進行測試,所以需要對屏蔽掉一些外部依賴的影響,這時候就可以使用mock技術。
不僅僅是軟件開發(fā)領域的單元測試,其實在很多工業(yè)測試場景中,也會使用一些Mock技術,比如常見的汽車碰撞測試。
汽車在上市之前都需要經(jīng)過碰撞測試,并且公布測試結(jié)果。碰撞測試過程中需要通過真實撞擊來評定汽車的耐撞能力以及對內(nèi)部駕駛?cè)藛T的保護能力。

但是,為了保證驗證的準確性,有為了保證測試人員的安全,一般會采用假人來進行測試。這些假人都是經(jīng)過特制的,他們的生物學性能一般和真人是一樣的,比如體重、關節(jié)能力、組織強度等。
而且有時候,為了保證測試的全面性,還會采用各種各樣的假人,如成年人、老人、小孩子、男性、女性等都需要充分測試到。
所以,這個假人其實就是一個Mock對象。在軟件單元測試中,我們也需要用到這些測試對象。目的也類似,就是為了保證測試的全面性及準確性。
之所以要在測試中使用Mock對象,其實有很多原因,其中最重要的原因就是真實對象的構(gòu)造成本太高。這時候一般就會采用mock對象。
而市面上也有很多工具可以方便的幫助我們進行單元測試的mock,如Easymock、jMock、Mockito、Unitils Mock、PowerMock、JMockit等。
其中比較常用的就是Easymock(https://easymock.org/ )、JMockit(https://jmockit.github.io/index.html )和Mockito(https://site.mockito.org/ )這三種,用起來都比較簡單。
關于這些工具的對比,在JMockit官網(wǎng)中有一張圖還是挺明顯的,如下:





如我們的要測試的一個方法,其中依賴了一個RPC遠程服務,因為遠程服務的返回值可能是各種各樣的,我們?yōu)榱藴y試我們的接口的魯棒性,就會針對各種邊界情況進行充分測試。
如果把外部接口mock掉,也就是把外部接口的返回值當做一個mock對象,那么我們就可以很方便的模擬各種情況。如外部接口正常返回、異常返回、請求超時等等,都可以很方便的被測試。
其實,隨著軟件開發(fā)這么多年的發(fā)展,mock技術已經(jīng)不僅僅局限于單元測試階段了,尤其是隨著微服務的興起,應用拆分的越來越細,應用見依賴也越來越多。

這時候Mock技術就顯得尤為重要了。
很多時候,一個項目中,大家可能是同時開發(fā)的,而我們的很多下游依賴可能還沒開完完,或者有些特殊case沒辦法構(gòu)造,那這時候就可以利用mock技術來mock掉下游接口。
我們?nèi)粘i_發(fā)中用到的時候很多,比如日常開發(fā)環(huán)境調(diào)用支付寶,我們需要經(jīng)常構(gòu)造諸如協(xié)議過期、余額不足、請求超時、賬戶不存在等case的時候,就可以想辦法將他們的接口mock掉。
市面上現(xiàn)在也有很多接口mock工具可以使用,如RAP、Yapi、Moco和DOClever等。


RAP
RAP是阿里團隊出的一款接口管理工具,能給你提供方便的接口文檔管理、Mock、導出等功能。他可以通過分析接口結(jié)構(gòu),動態(tài)生成模擬數(shù)據(jù),校驗真實接口正確性,圍繞接口定義,通過一系列自動化工具提升我們的協(xié)作效率。
現(xiàn)在該項目已暫停維護,但是官方團隊推出了RAP2,RAP2 是在 RAP1 基礎上重做的新項目,項目地址:https://github.com/thx/rap2-delos

YApi
YApi是去哪兒網(wǎng)移動架構(gòu)組開發(fā)的一個開源項目,旨在為開發(fā)、產(chǎn)品、測試人員提供更優(yōu)雅的接口管理服務。可以幫助開發(fā)者輕松創(chuàng)建、發(fā)布、維護 API。官網(wǎng)地址:https://hellosean1025.github.io/yapi/

Moco
Moco 是一個搭建模擬服務器的工具,其支持 API 和獨立運行兩種方式,前者通常是在 junit 等測試框架中使用,后者則是通過運行一個 jar 包開啟服務。項目地址:https://github.com/dreamhead/moco
DOClever
DOClever是一個可視化免費開源的接口管理工具 ,可以分析接口結(jié)構(gòu),校驗接口正確性, 圍繞接口定義文檔,通過一系列自動化工具提升我們的協(xié)作效率。主要提供接口信息管理、接口調(diào)試運行、接口Mock、自動化測試、團隊協(xié)作等功能。官網(wǎng)地址:http://doclever.cn/controller/index/index.html









