溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

什么是Mock測(cè)試

發(fā)布時(shí)間:2021-10-18 14:18:29 來源:億速云 閱讀:333 作者:iii 欄目:web開發(fā)

本篇內(nèi)容介紹了“什么是Mock測(cè)試”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

初識(shí)mock

作為一個(gè)動(dòng)詞,mock是模擬、模仿的意思;作為一個(gè)名詞,mock是能夠模仿真實(shí)對(duì)象行為的模擬對(duì)象。

在軟件測(cè)試中,mock所模擬的對(duì)象是什么呢?

它一定不是我們所測(cè)試的對(duì)象,而是 SUT 的依賴(dependency)。換句話說,mock 的作用是模擬 SUT 依賴對(duì)象的行為。

測(cè)試的對(duì)象一般稱之為SUT(Software Under Test)

文字不好理解,我們畫個(gè)圖,如下圖所示,被測(cè)試對(duì)象是 A,A 依賴的是B,B 依賴的是 C。而我們要 mock 的是 B 的行為。圖中 A 就是  SUT。

什么是Mock測(cè)試

為什么需要模擬 B 的行為呢?

  • (1)提高 A 的測(cè)試覆蓋率。A 依賴 B,本質(zhì)上依賴的是 B 的返回結(jié)果,也就是說 B 的返回結(jié)果會(huì)影響 A 的行為。通過 mock B  我們可以構(gòu)造各種正常和異常的來自 B 的返回結(jié)果,從而更充分測(cè)試 A 的行為。

  • (2)避免 B 的因素從而對(duì) A 產(chǎn)生影響。依賴真實(shí)的 B 去測(cè)試 A 可能有很多問題:B 的開發(fā)沒有完成時(shí)無法測(cè)試 A;B 有阻塞性bug 時(shí)無法測(cè)試  A;B 的依賴 C 有阻塞性 bug 時(shí)無法測(cè)試 A;

  • (3)提高 A 的測(cè)試效率。B 的真實(shí)行為可能很慢,而 B 的模擬行為是非常快的,因此可以加快 A 的測(cè)試執(zhí)行速度。

mock 種族

常見的 mock 類型如下圖所示:

什么是Mock測(cè)試

從下往上依次解釋一下:

  • (1)方法級(jí)別 mock:mock 的對(duì)象是一個(gè)函數(shù)調(diào)用,例如獲取系統(tǒng)環(huán)境變量。

  • (2)類級(jí)別 mock:mock 的對(duì)象是一個(gè)類,例如一個(gè) HTTP server。

  • (3)接口級(jí)別 mock:mock 的對(duì)象是一個(gè) API 接口。

  • (4)服務(wù)級(jí)別 mock:mock 的對(duì)象是整個(gè)服務(wù)。比如前端工程師自測(cè)試時(shí),可以講后端整個(gè)服務(wù)都 mock 掉,這其實(shí)等同于將后端的所有接口都  mock。

接口mock注入的五種方式

在使用 mock 進(jìn)行接口測(cè)試時(shí),一般要做兩件事情,即打樁和調(diào)樁。

其實(shí)打樁就是創(chuàng)建mock 樁,指定 API 請(qǐng)求內(nèi)容及其映射的 mock 響應(yīng)內(nèi)容;所謂調(diào)樁就是被測(cè)服務(wù)來請(qǐng)求 mock 樁并接收 mock  響應(yīng)。

事實(shí)上,在打樁和調(diào)樁之間還隱藏著一件不顯山露水、但是及其重要的事情,那就是 mock 樁的注入(mock injection)。

什么是 mock 注入?

mock 的本質(zhì)就是用模擬樁來替換真實(shí)的依賴。所謂 mock 樁注入就是阻斷被測(cè)服務(wù)與真實(shí)服務(wù)之間的鏈路,建立被測(cè)服務(wù)與 mock  之間的鏈路過程。

什么是Mock測(cè)試

如何注入 mock?

總的來說 mock 樁的注入方式與架構(gòu)、被測(cè)服務(wù)的架構(gòu)等因素相關(guān),在實(shí)際中常見的 mock 樁注入方式包括但不限于以下五種。

(1)API 請(qǐng)求構(gòu)造

在 mock 接口中被測(cè)服務(wù)是 API 的請(qǐng)求方,即客戶端;依賴服務(wù)是 API 的響應(yīng)方,即服務(wù)端。根據(jù) mock 工作的位置,mock 可以分為客戶端  mock 和服務(wù)端 mock。

客戶端 mock:mock 在被測(cè)服務(wù)內(nèi)部工作,直接攔截被測(cè)服務(wù)的 API 請(qǐng)求方法(比如 HTTP Client方法),在被測(cè)服務(wù)調(diào)用 API  請(qǐng)求方法時(shí),直接從方法內(nèi)部返回預(yù)定義的 mock 響應(yīng)。

服務(wù)端 mock:mock 在被測(cè)服務(wù)外部工作,作為 HTTP 服務(wù)器接收被測(cè)服務(wù)發(fā)送的 API 請(qǐng)求,并返回預(yù)定義的 mock 響應(yīng)。

客戶端 mock 的注入其實(shí)就是改造被測(cè)服務(wù)的 API 請(qǐng)求方法,即在 API 請(qǐng)求方法中加入 mock 處理邏輯。當(dāng)滿足某些條件時(shí)執(zhí)行 mock  分支,不滿足時(shí)執(zhí)行真實(shí)分支。

可以通過兩種方式實(shí)現(xiàn),一種是直接改造源代碼,另一種是利用字節(jié)碼增強(qiáng)技術(shù)對(duì)字節(jié)碼進(jìn)行改造(Java 語言)。

什么是Mock測(cè)試

API 請(qǐng)求改造這種注入方式適用于客戶端 mock,其優(yōu)勢(shì)性能極好,其不足是實(shí)現(xiàn)成本較高。

(2)本地配置

對(duì)于服務(wù)端 mock,打樁之后會(huì)生成唯一的 mock  樁地址。被測(cè)服務(wù)要想調(diào)用這個(gè)樁需要知道樁地址,如何讓被測(cè)服務(wù)知道樁地址呢?一種最直接的方法就是被測(cè)服務(wù)提供一個(gè)依賴服務(wù)地址配置項(xiàng),在需要使用 mock  時(shí)將依賴服務(wù)地址修改成 mock 地址。

本地配置的優(yōu)勢(shì)是實(shí)現(xiàn)簡(jiǎn)單,不足之處是修改配置項(xiàng)需要重啟被測(cè)服務(wù),在需要進(jìn)行 mock 服務(wù)與真實(shí)服務(wù)切換時(shí)不方便。

什么是Mock測(cè)試

(3)配置中心

在服務(wù)端 mock 中,為了避免修改依賴服務(wù)地址配置項(xiàng)導(dǎo)致被測(cè)服務(wù)重啟,可以采用配置中心(如 Spring Cloud Config  Server)存儲(chǔ)和管理依賴服務(wù)地址配置,或者使用注冊(cè)中心(如 Spring Cloud Eureka)記錄服務(wù)與服務(wù)地址的映射關(guān)系。

使用配置或者注冊(cè)中心時(shí),mock 注入的方法是修改配置中心,將依賴服務(wù)地址改成 mock  地址。這種注入方法不需要重啟被測(cè)服務(wù),但是從配置改變到配置生效可以存在一定的延時(shí)。

什么是Mock測(cè)試

(4)反向代理

在微服務(wù)架構(gòu)下,被測(cè)服務(wù)與依賴服務(wù)之間可能不是直連的,而是經(jīng)過了一層反向代理,例如 API 網(wǎng)關(guān)。在這種情況下,被測(cè)服務(wù)是通過調(diào)用 API  網(wǎng)關(guān)來間接調(diào)用依賴服務(wù)的接口。

在 API 網(wǎng)關(guān)模式下,mock 注入的具體做法就是修改 API 網(wǎng)關(guān)配置,將依賴服務(wù) API 網(wǎng)關(guān)接口綁定的地址改成 mock 地址。

這種注入的優(yōu)勢(shì)是對(duì)被測(cè)服務(wù)無侵入,并且實(shí)現(xiàn)更細(xì)粒度(接口級(jí))的 mock。當(dāng)然,根據(jù) API 網(wǎng)關(guān)的實(shí)現(xiàn)不同,仍然可能存在一定的時(shí)延。亞馬遜 AWS 的  API 網(wǎng)關(guān)就是采用這種方式進(jìn)行 mock。

什么是Mock測(cè)試

(5)前向代理

服務(wù)端 mock 除了作為 HTTP 服務(wù)器,還可以兼?zhèn)?HTTP 代理的功能,這種架構(gòu)又叫做 mock 代理,例如 mock server  proxy。對(duì)于 mock 代理來說,它不僅能夠返回 mock 響應(yīng),而且能夠在需要的時(shí)候?qū)?API  請(qǐng)求轉(zhuǎn)發(fā)給依賴服務(wù),并將依賴服務(wù)的真實(shí)響應(yīng)返回給被測(cè)服務(wù)。

使用前向代理模式,mock 注入的方式是將被測(cè)服務(wù)的依賴地址或網(wǎng)絡(luò)代理修改為 mock 地址,這種注入方法需要重啟被測(cè)服務(wù),其優(yōu)勢(shì)是能夠?qū)崿F(xiàn)細(xì)粒度的  mock,并且能夠根據(jù)錄制的真實(shí)響應(yīng)自動(dòng)生成 mock。

什么是Mock測(cè)試

五種注入方式對(duì)比

一張表格總結(jié)一下

什么是Mock測(cè)試

不可忽視的mock兩大功能

關(guān)于 mock,經(jīng)常容易被誤解的是:認(rèn)為 mock 只是模擬返回的結(jié)果而已。

實(shí)際上 mock 還可以提供兩大功能:(1)記錄真實(shí)的調(diào)用信息;(2)生成模擬的返回信息;

什么是Mock測(cè)試

對(duì)于測(cè)試用例來說,我們不僅關(guān)心 mock 是否返回了期望的結(jié)果,還需要關(guān)心 SUT 是否以期望的方式調(diào)用了 mock 對(duì)象。

如果 SUT 沒有以期望的方式調(diào)用,比如:沒有傳參或者參數(shù)不對(duì),那么 SUT 就存在問題。

mock 需要詳細(xì)記錄來自SUT 的調(diào)用信息,并提供給用例來校驗(yàn)。比如 Java mockito 就提供了此類校驗(yàn)功能:

List<String> mockedList = mock(MyList.class); mockedList.size(); // 校驗(yàn) size 函數(shù)調(diào)用且只調(diào)用了1次 verify(mockedList, times(1)).size();

常用 mock 工具

單元測(cè)試級(jí)別

這個(gè)級(jí)別的mock工具有easymock、jMock、Mockito、Unitils  Mock、PowerMock、JMockit等,關(guān)于各自優(yōu)劣勢(shì)大家可以上網(wǎng)查詢。

接口測(cè)試級(jí)別

接口級(jí)別的mock工具完成的主要功能是對(duì)一個(gè)用戶的請(qǐng)求,模擬server返回一個(gè)接口的響應(yīng)數(shù)據(jù)。常用的有:

  • Wiremock

  • Mockserver

  • Moco

  • Mock.js

  • RAP

mock 不是銀彈

說了這么多 mock 的好處,實(shí)際上 mock 也有很多不足,比如:

  • (1)mock 可能導(dǎo)致問題遺漏。mock 的模擬行為與真實(shí)行為可能存在 GAP,導(dǎo)致基于 mock  的測(cè)試雖然通過了,但是基于真實(shí)對(duì)象的測(cè)試卻失敗了,這意味著問題被遺漏了。mock 很難模擬所有的真實(shí)情況。

  • (2)mock 帶來較高的維護(hù)成本?;?mock 的測(cè)試用例結(jié)構(gòu)比較復(fù)雜,實(shí)現(xiàn)和維護(hù)都不容易,后期被測(cè)代碼有變動(dòng)時(shí)需要適配 mock 代碼。

簡(jiǎn)單一句話:mock 不是銀彈。

有態(tài)度的總結(jié)

mock 不是銀彈,mock 是有利有弊的,一張圖總結(jié)一下:

什么是Mock測(cè)試

說了這么多,在工作中如何正確使用 mock 呢?這里提兩點(diǎn)建議,敲黑板啦。

(1)不要過度使用 mock。測(cè)試用例中掌握好使用 mock 的度。在涉及網(wǎng)絡(luò)訪問、數(shù)據(jù)庫讀寫、操作系統(tǒng)交互等系統(tǒng)級(jí)調(diào)用,優(yōu)先使用 mock。

(2)不要過度依賴基于 mock 的測(cè)試結(jié)果。基于 mock 的測(cè)試無論多么充分,這都不能保證不出現(xiàn)問題的遺漏。一個(gè)完整的測(cè)試策略一定是由基于 mock  的測(cè)試和基于非 mock 的測(cè)試共同組成的,二者相輔相成缺一不可。

“什么是Mock測(cè)試”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI