接口測試-Mock測試方法
一、關於Mock測試
1、什么是Mock測試?
Mock 測試就是在測試過程中,對於某些不容易構造(如 HttpServletRequest 必須在Servlet 容器中才能構造出來)或者不容易獲取的比較復雜的對象(如 JDBC 中的ResultSet 對象),用一個虛擬的對象(Mock 對象)來創建以便測試的測試方法。
2、為什么要進行Mock測試?
Mock是為了解決不同的單元之間由於耦合而難於開發、測試的問題。所以,Mock既能出現在單元測試中,也會出現在集成測試、系統測試過程中。Mock 最大的功能是幫你把單元測試的耦合分解開,如果你的代碼對另一個類或者接口有依賴,它能夠幫你模擬這些依賴,並幫你驗證所調用的依賴的行為。比如一段代碼有這樣的依賴:
當我們需要測試A類的時候,如果沒有 Mock,則我們需要把整個依賴樹都構建出來,而使用 Mock 的話就可以將結構分解開,像下面這樣:
3、Mock對象適用場景
(1)需要將當前被測單元和其依賴模塊獨立開來,構造一個獨立的測試環境,不關注被測單元的依賴對象,只關注被測單元的功能邏輯。
-----比如被測代碼中需要依賴第三方接口返回值進行邏輯處理,可能因為網絡或者其他環境因素,調用第三方經常會中斷或者失敗,無法對被測單元進行測試,這個時候就可以使用mock技術來將被測單元和依賴模塊獨立開來,使得測試可以進行下去。
(2)被測單元依賴的模塊尚未開發完成,而被測單元需要依賴模塊的返回值進行后續處理。
1)前后端項目中,后端接口開發完成之前,接口聯調;
2)依賴的上游項目的接口尚未開發完成,需要接口聯調測試;
-----比如service層的代碼中,包含對Dao層的調用,但是,DAO層代碼尚未實現
(3)被測單元依賴的對象較難模擬或者構造比較復雜。
-----比如,支付寶支付的異常條件有很多,但是模擬這種異常條件很復雜或者無法模擬,比如,查詢聚划算的訂單結果,無法在測試環境進行模擬。
4、Mock測試的優勢
(1) 團隊可以並行工作
有了Mock,前后端人員只需要定義好接口文檔就可以開始並行工作,互不影響,只在最后的聯調階段往來密切;后端與后端之間如果有接口耦合,也同樣能被Mock解決;測試過程中如果遇到依賴接口沒有准備好,同樣可以借助Mock;不會出現一個團隊等待另一個團隊的情況。這樣的話,開發自測階段就可以及早開展,從而發現缺陷的時機也提前了,有利於整個產品質量以及進度的保證。
(2)開啟TDD模式,即測試驅動開發
單元測試是TDD實現的基石,而TDD經常會碰到協同模塊尚未開發完成的情況,但是有了mock,這些一切都不是問題。當接口定義好后,測試人員就可以創建一個Mock,把接口添加到自動化測試環境,提前創建測試。
(3)可以模擬那些無法訪問的資源
比如說,你需要調用一個“牆”外的資源來方便自己調試,就可以自己Mock一個。
(4)隔離系統
假如我們需要調用一個post請求,為了獲得某個響應,來看當前系統是否能正確處理返回的“響應”,但是這個post請求會造成數據庫中數據的污染,那么就可以充分利用Mock,構造一個虛擬的post請求,我們給他指定返回就好了。
(5)可以用來演示
假如我們需要創建一個演示程序,並且做了簡單的UI,那么在完全沒有開發后端服務的情況下,也可以進行演示。說到演示了,假如你已經做好了一個系統,並且需要給客戶進行演示,但是里面有些真實數據並不想讓用戶看到,那么同樣,你可以用Mock接口把這些敏感信息接口全部替換。
(6)測試覆蓋度
假如有一個接口,有100個不同類型的返回,我們需要測試它在不同返回下,系統是否能夠正常響應,但是有些返回在正常情況下基本不會發生,比如,我們需要測試在當接口發生500錯誤的時候,app是否崩潰,別告訴我你一定要給服務端代碼做些手腳讓他返回500 。而使用mock,這一切就都好辦了,想要什么返回就模擬什么返回,不用再擔心我的測試覆蓋度了!
5、Mock測試存在的問題
使用Mock測試有時可以提高團隊的開發效率,但當B、C都開發完成代碼后,這時應該把E2E測試代碼從使用Mock測試改為調用真實的模塊,以避免出現模塊之間集成部分漏測的問題。這里說mock存在的問題,主要是讓開發和測試不要過分的依賴/相信mock接口。
使用mock時,切記的幾點:
1)測試人員不應該被覆蓋率高的E2E自動化測試所迷惑,覆蓋率高不代表沒有問題。尤其在接手新項目中,需要查看E2E測試中有沒有使用Mock測試,進一步去判斷這些地方使用Mock測試是否合理,這些Mock測試是否應該換成真實模塊間的調用和集成。
2)當把mock接口換成實際接口后,測試/開發也必須把之前的測試重新做一遍。
ps: 當你使用mock接口來提高效率,請注意:你的工作量其實是比 直接只用實際接口 多了 一倍的。如果測試時,偷懶,替換成實際接口后,只是簡單測試,那么 當實際接口和mock預期接口有差異時,故障便和你相遇了。
建議: mock接口只能主流程聯調/ 異常返回測試,不要過分依賴mock接口進行測試。
3)測試完畢,上線前,請一定確保 為了mock而做的相關代碼/配置文件的修改,已經完全恢復了。
建議:上線checklist中條條列出,並上線前review
---------------------
原文:https://blog.csdn.net/huazhongkejidaxuezpp/article/details/67018676
二、Mock測試方式
1. Mock Server-Moco
這是一個jar包,只要執行該jar包,指定配置文件,就可開啟一個http服務器提供服務,並且修改配置文件后也無需重啟服務,支持動態加載。我使用的是moco-runner-0.10.2-standalone.jar,運行方式如下:
```java -jar moco-runner-0.10.2-standalone.jar start -p 8080 -c XXX.json```
XXX.json就是我們的mock配置文件,比如:
[ { "description": "api 1", "request" :{ "method" : "get", "uri" : "/foo" }, "response": { "json": {"foo":"bar"} } } ]
以上就可以實現當我們訪問127.0.0.0:8080/foo時,返回一個json為{"foo":"bar"}。
具體其他使用方法請參照官方文檔:https://github.com/dreamhead/moco/blob/master/moco-doc/apis.md
2. fiddler
fiddler大家都很熟了,在windows環境可以隨便自定義返回內容,但一個很大的缺點是,它不跨平台,而我們平時的很多場景下,是需要在Linux下進行mock的。
還有一些其他mock工具,大多都是通過編寫js代碼或者python、java等代碼來達到mock目的,此處就不再介紹了。
在選擇mock工具時,可參考以下幾個方面:
一是數據要好管理,別讓我管理一堆文件;
二是mock接口最好可以設置成和真實接口完全一致,這樣就只需要切換hosts就可以切換mock接口和真實接口,不需要修改代碼;
三是跨平台,mock接口在windows和Linux下都需要可用。至於跨域、動態加載什么的,這是必須條件。
三、Mock測試示例
1、使用Fiddler進行Mock測試
------這種調試方式適用於rest接口調試,web界面調試等。
測試工程師在做測試時,也需要服務器返回一些特殊的數據來做測試,使用 Fiddler AutoResponder功能來偽造測試數據(創建虛擬對象),能大大減少測試工程師的工作量。
1.1 Fiddler AutoResponder工作原理
使用Fiddler可以替換自動返回的一個【偽造】的HTTP響應,這與使用斷點修改HTTP響應類似,只不過AutoResponder是自動的,操作更加方便。即,瀏覽器發出的HTTP請求並沒有到達服務器,而是被Fiddler直接返回了一個【偽造】的HTTP響應。
1.2 使用Fiddler進行Mock測試
(1)接口抓包-----找到要mock的接口
以掘金首頁為例,找到下面的接口 https://gold-tag-ms.juejin.im/v1/categories
(2)復制接口數據到本地
在接口上進行右鍵點擊,選擇save -> …and Open as Local File -> 默認會保存至桌面,示例中的數據,保存到了桌面的test.json
(3)修改數據
修改保存到本地的json文件,示例中僅修改了頁面的標簽數據。
(4)替換json文件
在web session 面板中找到對應的請求,然后將其拖到AutoResponder面板中,在RuleEditor中單擊“Find a file...”,選擇本地json文件的路徑。
(5)激活規則
選中“Enable rules”,激活規則。選中“Unmatched requests passthrough",放行不匹配的HTTP請求。
(6)save,刷新頁面
單擊“Save”按鈕。只需修改本地保存的json文件,然后刷新瀏覽器(或直接訪問接口),就可以看到效果了。