前言:
我們在做接口測試的時候有時候會遇到,接口還沒有開發(fā)完成,領導就讓先介入測試,然后縮短項目時間,有的人肯定會懵,接口還沒開發(fā)好,怎么介入測試,其實就引入新的詞語mock了。
一、Mock測試介紹
1、什么是Mock測試?
Mock 測試就是在測試過程中,對于某些不容易構造或者不容易獲取的比較復雜的對象(如 JDBC 中的ResultSet 對象),用一個虛擬的對象(Mock 對象)來創(chuàng)建以便測試的測試方法。比如:測試天氣這個接口,近期上海都沒有雪,那么我怎么去模擬雪這個場景?需要等到真正下雪的哪天才可以嗎?這個時候就可以通過mock來幫助我們完成雪的場景了。
2、為什么要進行Mock測試?
Mock是為了解決不同的單元之間由于耦合而難于開發(fā)、測試的問題。所以,Mock既能出現(xiàn)在單元測試中,也會出現(xiàn)在集成測試、系統(tǒng)測試過程中。Mock zui大的功能是幫你把單元測試的耦合分解開,如果你的代碼對另一個類或者接口有依賴,它能夠幫你模擬這些依賴,并幫你驗證所調用的依賴的行為。比如一段代碼有這樣的依賴:當我們需要測試A類的時候,如果沒有 Mock,則我們需要把整個依賴樹都構建出來,而使用 Mock 的話就可以將結構分解開,像下面這樣:
當我們需要測試A類的時候,如果沒有 Mock,則我們需要把整個依賴樹都構建出來,而使用 Mock 的話就可以將結構分解開,像下面這樣:
3、Mock對象適用場景
(1)需要將當前被測單元和其依賴模塊獨立開來,構造一個獨立的測試環(huán)境,不關注被測單元的依賴對象,只關注被測單元的功能邏輯。比如:被測代碼中需要依賴第三方接口返回值進行邏輯處理,可能因為網(wǎng)絡或者其他環(huán)境因素,調用第三方經(jīng)常會中斷或者失敗,無法對被測單元進行測試,這個時候就可以使用mock技術來將被測單元和依賴模塊獨立開來,使得測試可以進行下去。
(2)被測單元依賴的模塊尚未開發(fā)完成,而被測單元需要依賴模塊的返回值進行后續(xù)處理。
1)前后端項目中,后端接口開發(fā)完成之前,接口聯(lián)調;
2)依賴的上游項目的接口尚未開發(fā)完成,需要接口聯(lián)調測試;比如:service層的代碼中,包含對Dao層的調用,但是,DAO層代碼尚未實現(xiàn)
(3)被測單元依賴的對象較難模擬或者構造比較復雜。比如:支付寶支付的異常條件有很多,但是模擬這種異常條件很復雜或者無法模擬,比如:查詢聚劃算的訂單結果,無法在測試環(huán)境進行模擬。
4、Mock測試的優(yōu)勢
(1) 團隊可以并行工作
有了Mock,前后端人員只需要定義好接口文檔就可以開始并行工作,互不影響,只在zui后的聯(lián)調階段往來密切;后端與后端之間如果有接口耦合,也同樣能被Mock解決;測試過程中如果遇到依賴接口沒有準備好,同樣可以借助Mock;不會出現(xiàn)一個團隊等待另一個團隊的情況。這樣的話,開發(fā)自測階段就可以及早開展,從而發(fā)現(xiàn)缺陷的時機也提前了,有利于整個產(chǎn)品質量以及進度的**。
(2)開啟TDD模式,即測試驅動開發(fā)
單元測試是TDD實現(xiàn)的基石,而TDD經(jīng)常會碰到協(xié)同模塊尚未開發(fā)完成的情況,但是有了mock,這些一切都不是問題。當接口定義好后,測試人員就可以創(chuàng)建一個Mock,把接口添加到自動化測試環(huán)境,提前創(chuàng)建測試。
(3)可以模擬那些無法訪問的資源
比如說,你需要調用一個“墻”外的資源來方便自己調試,就可以自己Mock一個。
(4)隔離系統(tǒng)
假如我們需要調用一個post請求,為了獲得某個響應,來看當前系統(tǒng)是否能正確處理返回的“響應”,但是這個post請求會造成數(shù)據(jù)庫中數(shù)據(jù)的污染,那么就可以充分利用Mock,構造一個虛擬的post請求,我們給他指定返回就好了。
(5)可以用來演示
假如我們需要創(chuàng)建一個演示程序,并且做了簡單的UI,那么在完全沒有開發(fā)后端服務的情況下,也可以進行演示。說到演示了,假如你已經(jīng)做好了一個系統(tǒng),并且需要給客戶進行演示,但是里面有些真實數(shù)據(jù)并不想讓用戶看到,那么同樣,你可以用Mock接口把這些敏感信息接口全部替換。
(6)測試覆蓋度
假如有一個接口,有100個不同類型的返回,我們需要測試它在不同返回下,系統(tǒng)是否能夠正常響應,但是有些返回在正常情況下基本不會發(fā)生,比如,我們需要測試在當接口發(fā)生500錯誤的時候,app是否崩潰,別告訴我你一定要給服務端代碼做些手腳讓他返回500 。而使用mock,這一切就都好辦了,想要什么返回就模擬什么返回,不用再擔心我的測試覆蓋度了!
5、Mock測試存在的問題
使用Mock測試有時可以提高團隊的開發(fā)效率,但當B、C都開發(fā)完成代碼后,這時應該把E2E測試代碼從使用Mock測試改為調用真實的模塊,以避免出現(xiàn)模塊之間集成部分漏測的問題。這里說mock存在的問題,主要是讓開發(fā)和測試不要過分的依賴/相信mock接口。
使用mock時,切記的幾點:
1)測試人員不應該被覆蓋率高的E2E自動化測試所迷惑,覆蓋率高不代表沒有問題。尤其在接手新項目中,需要查看E2E測試中有沒有使用Mock測試,進一步去判斷這些地方使用Mock測試是否合理,這些Mock測試是否應該換成真實模塊間的調用和集成。
2)當把mock接口換成實際接口后,測試/開發(fā)也必須把之前的測試重新做一遍。
ps: 當你使用mock接口來提高效率,請注意:你的工作量其實是比直接只用實際接口多了 一倍的。如果測試時,偷懶,替換成實際接口后,只是簡單測試,那么當實際接口和mock預期接口有差異時,故障便和你相遇了。
建議:mock接口只能主流程聯(lián)調/ 異常返回測試,不要過分依賴mock接口進行測試。
3)測試完畢,上線前,請一定確保為了mock而做的相關代碼/配置文件的修改,已經(jīng)完全恢復了。
二、Mock測試方式
1、Mock Server-Moco
這是一個jar包,只要執(zhí)行該jar包,指定配置文件,就可開啟一個http服務器提供服務,并且修改配置文件后也無需重啟服務,支持動態(tài)加載。
2、fiddler
fiddler大家都很熟了,在windows環(huán)境可以隨便自定義返回內(nèi)容,但一個很大的缺點是,它不跨平臺,而我們平時的很多場景下,是需要在Linux下進行mock的。
在選擇mock工具時,可參考以下幾個方面:
1)數(shù)據(jù)要好管理,別讓我管理一堆文件;
2)mock接口zui好可以設置成和真實接口完全一致,這樣就只需要切換hosts就可以切換mock接口和真實接口,不需要修改代碼;
3)跨平臺,mock接口在windows和Linux下都需要可用。至于跨域、動態(tài)加載什么的,這是必須條件。
三、Mock測試示
1、使用Fiddler進行Mock測試
這種調試方式適用于rest接口調試,web界面調試等。測試工程師在做測試時,也需要服務器返回一些特殊的數(shù)據(jù)來做測試,使用 Fiddler AutoResponder功能來偽造測試數(shù)據(jù)(創(chuàng)建虛擬對象),能大大減少測試工程師的工作量。
1.1 Fiddler AutoResponder工作原理
使用Fiddler可以替換自動返回的一個【偽造】的HTTP響應,這與使用斷點修改HTTP響應類似,只不過AutoResponder是自動的,操作更加方便。即瀏覽器發(fā)出的HTTP請求并沒有到達服務器,而是被Fiddler直接返回了一個【偽造】的HTTP響應。
1.2 使用Fiddler進行Mock測試
(1)接口抓包-----找到要mock的接口
比如我們要測試百度首頁的接口
使用Fiddler進行抓包:
2)創(chuàng)建接口Mock對象
進入Fiddler AutoResponder頁面,選中剛才抓到的包,點擊“Add Rule”新建接口Mock對象:
點擊“Test”可以設置接口匹配規(guī)則和接口地址:
3)設置接口返回內(nèi)容
創(chuàng)建一個json文件,如:
點擊“Find a filename”:
選擇剛才創(chuàng)建好的文件:
4)激活規(guī)則
選中“Enable rules”,激活規(guī)則。選中“Unmatched requests passthrough",放行不匹配的HTTP請求。
5)save,刷新頁面
單擊“Save”按鈕。只需修改本地保存的json文件,然后刷新瀏覽器(或直接訪問接口),就可以看到效果了。