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