什么是 Mock 測試?


 

 

什么是 Mock?

作為動詞,Mock 是模擬、模仿的意思。

作為名詞,Mock 是能夠模仿真實對象行為的模擬對象。

那么,在軟件測試中,Mock 所模擬的對象是什么呢?

模擬的是 SUT(System Under Test:被測系統) 的依賴,而不是其本身。

比如,我要測試 A,但 A 依賴 B,要模擬的對象就是 B。

為什么要模擬 B 呢?

提高 A 的測試覆蓋率:通過 Mock 模擬 B 返回的正常和異常的結果,使用 A 的測試更充分。

避免 B 的因素對 A 產生影響:當 B 因各種原因無法正常使用時,導致 A 無法測試。

提高 A 的測試效率:B 的真實行為可能很慢,但模擬可以很快。

Mock 的兩大功能:

記錄真實的調用信息

生成模擬的返回信息

使用 Mock 的問題是什么?

可能導致問題遺漏:畢竟是模擬的,是理想可預見的情況,真實的情況可能更復雜。

可能導致維護成本變高:接口變更 Mock 用例要跟着改,改錯和漏改都可能出問題。

常見的 Mock 類型:

方法級別:Mock的對象是一個函數調用,例如:獲取系統環境變量。

類級別:Mock 的對象是一個類,例如:一個 HTTP server。

接口級別:Mock 的對象是一個 API 接口。

服務級別:Mock 的對象是整個服務。

使用 Mock 做接口測試時,一般分二步:

1.打樁:創建 Mock 樁,指定 API 請求內容及其映射的響應內容。

2. 調樁:被測服務來請求 Mock 樁並接收 Mock 響應。

在這二步之間還有一個 Mock 樁的注入,啥是 Mock 注入?

Mock 的本質就是用模擬樁來替換真實的依賴。所謂Mock 樁注入就是阻斷被測服務與真實服務之間的鏈路,建立被測服務與 Mock 之間的鏈路過程。

如下圖所示:

 

 


如何注入 Mock?

常見的方式包括但不限於以下五種:

API 請求構造

客戶端 Mock:在被測服務內部工作,直接攔截被測服務的 API 請求方法,直接從方法內部返回預定義的 Mock 響應。

服務端 Mock:在被測服務外部工作,作為 HTTP 服務器接收被測服務發送的 API 請求,並返回預定義的 Mock 響應。

本地配置:

對於服務端 Mock,打樁之后會生成唯一的 Mock 樁地址,被測服務提供一個依賴服務地址配置項,在需要使用 Mock 時將依賴服務地址修改成 Mock 地址。

配置中心

對於服務端 Mock,為了避免修改依賴服務地址配置項導致被測服務重啟,可以采用配置中心存儲和管理依賴服務地址配置,或者使用注冊中心記錄服務與服務地址的映射關系。

反向代理

在微服務架構下,被測服務與依賴服務之間可能不是直連的,而是經過了一層反向代理,例如 API 網關。在這種情況下,被測服務是通過調用 API 網關來間接調用依賴服務的接口。

前向代理

服務端 Mock 除了作為 HTTP 服務器,還可以兼備 HTTP 代理的功能,這種架構又叫做 Mock 代理。

對比:

 

 

常用 Mock 工具:

單元測試級別:

easymock、jMock、Mockito、Unitils Mock、PowerMock、JMockit..

接口測試級別

Wiremock、Mockserver、Moco、Mock.js、RAP...

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM