1.Mock實(shí)現(xiàn)原理和實(shí)現(xiàn)機(jī)制
在某些時(shí)候,后端在開(kāi)發(fā)接口的時(shí)候,處理邏輯非常復(fù)雜,在測(cè)試的時(shí)候,后端在未完成接口的情況下該如何去測(cè)試呢?
我們需要測(cè)試,但是有些請(qǐng)求又需要修改一下參數(shù),或者改變一下request實(shí)現(xiàn)的方式,比如修改狀態(tài)碼,產(chǎn)生的圖片要進(jìn)行替換,或者是替換執(zhí)行文件等
Mock介紹
- Mock這個(gè)詞在英語(yǔ)中有模擬的這個(gè)意思,因此我們可以猜測(cè)出這個(gè)庫(kù)的主要功能是模擬一些東西。準(zhǔn)確的說(shuō),Mock是Python中一個(gè)用于支持單元測(cè)試的庫(kù),它的主要功能是使用mock對(duì)象替代掉指定的Python對(duì)象,以達(dá)到模擬對(duì)象的行為。
- 在項(xiàng)目的單元測(cè)試過(guò)程中,會(huì)遇到:
- 1、接口的依賴
- 2、外部接口調(diào)用
- 3、測(cè)試環(huán)境非常復(fù)雜
- 單元測(cè)試應(yīng)該只針對(duì)當(dāng)前單元進(jìn)行測(cè)試, 所有的內(nèi)部或外部的依賴應(yīng)該是穩(wěn)定的, 已經(jīng)在別處進(jìn)行測(cè)試過(guò)的.使用mock 就可以對(duì)外部依賴組件實(shí)現(xiàn)進(jìn)行模擬并且替換掉, 從而使得單元測(cè)試將焦點(diǎn)只放在當(dāng)前的單元功能。
- 解決測(cè)試依賴
- 例如,我們要測(cè)試A模塊,然后A模塊依賴于B模塊的調(diào)用。但是,由于B模塊的改變,導(dǎo)致了A模塊返回結(jié)果的改變,從而使A模塊的測(cè)試用例失敗。其實(shí),對(duì)于A模塊,以及A模塊的用例來(lái)說(shuō),并沒(méi)有變化,不應(yīng)該失敗才對(duì)。
- 這個(gè)時(shí)候就是mock發(fā)揮作用的時(shí)候了。通過(guò)mock模擬掉影響A模塊的部分(B模塊)。至于mock掉的部分(B模塊)應(yīng)該由其它用例來(lái)測(cè)試。
- 例子
- import requests from unittest import mock def request_lemonfix(): “”” :return: “”” res = requests.get(‘http://www.baidu.com’) return res.status_code.encode(‘utf-8’) if __name__ == ‘__main__’: request_lemonfix = mock.Mock(return_value=”我已經(jīng)替換了數(shù)據(jù)”) print(request_lemonfix()) 結(jié)果: 我已經(jīng)替換了數(shù)據(jù) “`
2.簡(jiǎn)單的案例實(shí)現(xiàn)mock
- 基本功能 # function.py def multiply(x, y): return x * y def add_and_multiply(x, y): addition = x + y multiple = multiply(x, y) # 回調(diào)函數(shù) return (addition, multiple)
- 針對(duì) add_and_multiply()函數(shù)編寫(xiě)測(cè)試用例
import mockimport requestsimport unittesturl = “www.baidu.com/login”data = { “user_id”: “001”, “password”: “caichen”}def post_request(url, data): “””登陸百度賬號(hào)””” res = requests.post(url, data).json() return resclass TestLogin(unittest.TestCase): “””單元測(cè)試””” def setUp(self) -> None: print(“case開(kāi)始執(zhí)行”) def tearDown(self) -> None: print(“case執(zhí)行結(jié)束”) def test_01(self): “””模擬數(shù)據(jù)判斷是否正確””” url = “www.baidu.com/login/tieba” data = { “user_id”: “001” } sucess_test = mock.Mock(return_value=data) post_request = sucess_test res = post_request self.assertEqual(“654321”, res()) # self.assertEqual({‘user_id’: ‘001’},res())if __name__ == ‘__main__’: unittest.main()# 錯(cuò)誤結(jié)果Fcase開(kāi)始執(zhí)行======================================================================case執(zhí)行結(jié)束FAIL: test_01 (__main__.TestLogin)模擬數(shù)據(jù)判斷是否正確———————————————————————-Traceback (most recent call last): File “C:/Users/x1c/Desktop/untitled/mocktest.py”, line 35, in test_01 self.assertEqual(“654321”, res())AssertionError: ‘654321’ != {‘user_id’: ‘001’}———————————————————————-Ran 1 test in 0.001sFAILED (failures=1)# 正常結(jié)果case開(kāi)始執(zhí)行.case執(zhí)行結(jié)束———————————————————————-Ran 1 test in 0.000sOK
3.mock實(shí)現(xiàn)get數(shù)據(jù)模擬
舉個(gè)例子來(lái)說(shuō):我們有一個(gè)簡(jiǎn)單的客戶端實(shí)現(xiàn),用來(lái)訪問(wèn)一個(gè)URL,當(dāng)訪問(wèn)正常時(shí),需要返回狀態(tài)碼200,不正常時(shí),需要返回狀態(tài)碼404。首先,我們的客戶端代碼實(shí)現(xiàn)如下:“`import requestsdef send_request(url): r = requests.get(url) return r.status_codedef visit_ustack(): return send_request(‘http://www.ustack.com’)“`# 外部模塊調(diào)用visit_ustack()來(lái)訪問(wèn)baidu的官網(wǎng)。下面我們使用mock對(duì)象在單元測(cè)試中分別測(cè)試訪問(wèn)正常和訪問(wèn)不正常的情況。“`import unittestimport mockimport clientclass TestClient(unittest.TestCase):def test_success_request(self): success_send = mock.Mock(return_value=’200′) client.send_request = success_send self.assertEqual(client.visit_ustack(), ‘200’)def test_fail_request(self): fail_send = mock.Mock(return_value=’404′) client.send_request = fail_send self.assertEqual(client.visit_ustack(), ‘404’) “`
1.找到要替換的對(duì)象:我們需要測(cè)試的是visit_ustack這個(gè)函數(shù),那么我們需要替換掉send_request這個(gè)函數(shù)。
2.實(shí)例化Mock類(lèi)得到一個(gè)mock對(duì)象,并且設(shè)置這個(gè)mock對(duì)象的行為。在成功測(cè)試中,我們?cè)O(shè)置mock對(duì)象的返回值為字符串“200”,在失敗測(cè)試中,我們?cè)O(shè)置mock對(duì)象的返回值為字符串”404″。
3.使用這個(gè)mock對(duì)象替換掉我們想替換的對(duì)象。我們替換掉了client.send_request
4.寫(xiě)測(cè)試代碼。我們調(diào)用client.visit_ustack(),并且期望它的返回值和我們預(yù)設(shè)的一樣。
上面這個(gè)就是使用mock對(duì)象的基本步驟了。在上面的例子中我們替換了自己寫(xiě)的模塊的對(duì)象,其實(shí)也可以替換標(biāo)準(zhǔn)庫(kù)和第三方模塊的對(duì)象,方法是一樣的:先import進(jìn)來(lái),然后替換掉指定的對(duì)象就可以了。
4.Mock和mockrunner的區(qū)別
Mockrunner用在J2EE環(huán)境中進(jìn)行應(yīng)用程序的模擬測(cè)試。它不僅支持Struts actions,servlets,過(guò)濾器和標(biāo)簽類(lèi),還包括一個(gè)JDBC和一個(gè)JMS測(cè)試框架,可以用于測(cè)試基于EJB的應(yīng)用程序。
Mockrunner擴(kuò)展了JUnit并模擬了必要的行為,而無(wú)需調(diào)用實(shí)際的基礎(chǔ)結(jié)構(gòu)。它不需要正在運(yùn)行的應(yīng)用程序服務(wù)器或數(shù)據(jù)庫(kù)。此外,它不會(huì)調(diào)用web容器或Struts ActionServlet。它非??焖?,使用戶可以在測(cè)試的所有步驟中操縱所有涉及的類(lèi)和模擬對(duì)象。它可以用于為基于J2EE的應(yīng)用程序編寫(xiě)非常復(fù)雜的單元測(cè)試,而不會(huì)產(chǎn)生任何開(kāi)銷(xiāo)。Mockrunner不支持任何類(lèi)型的容器內(nèi)測(cè)試。
Mockrunner不會(huì)讀取任何配置文件,例如web.xml或struts-config.xml。您可以使用Mockrunner API指定所有參數(shù)。因此,可以將servlet,過(guò)濾器,標(biāo)簽和Struts動(dòng)作作為可重用組件進(jìn)行測(cè)試,而不管您在一個(gè)或另一個(gè)應(yīng)用程序中使用的設(shè)置如何。無(wú)法測(cè)試配置文件中的定義。如果要這樣做,可以將StrutsTestCase用于基于Struts的應(yīng)用程序或Cactus。
Mockrunner支持Java版本從1.3到1.6以及J2EE 1.3,J2EE 1.4和JavaEE5。尚不支持EJB 3.0。Mockrunner支持Struts版本1.1、1.2和1.3。
下載地址:Mockrunner download | SourceForge.net
- mockrunner必須配置java環(huán)境
- 使用命令啟動(dòng):java -jar moco-runner-0.12.0-standalone.jar http -p 8801 -c config.json
- 配置config.json文件就可以進(jìn)行mock數(shù)據(jù)
- [ { “response” : { “text” : “Hello, Moco” } } ] “` 使用命令啟動(dòng): java -jar moco-runner-0.12.0-standalone.jar http -p 8801 -c config.json 訪問(wèn)http://localhost:8801 就會(huì)顯示 Hello, Moco
- MockRunner在工作中運(yùn)用 構(gòu)建一個(gè)復(fù)雜的鏈接規(guī)則
- [ { “request”:{ “uri”:”/monitorApplication/alert/confirm”, “method”:”PUT”, “text”:”{“id”:”123″}” }, “response”:{ “status”:200, “json”:{ “code”:”0″, “msg”:”OK!”, “data”:null } } } ]
5.接口測(cè)試基礎(chǔ)面試
- 項(xiàng)目中如何做接口測(cè)試?
- 通過(guò)測(cè)試工具…進(jìn)行參數(shù)、請(qǐng)求參數(shù)、返回參數(shù)效驗(yàn)
- 接口開(kāi)發(fā)過(guò)程中如何進(jìn)行case編寫(xiě)
- 規(guī)則文檔熟悉通過(guò)mock校驗(yàn)格式
- 如何理解Mock
- 模擬返回參數(shù),模擬接口
- Mock在工作中的運(yùn)行?
- 幫助前端實(shí)現(xiàn)正常開(kāi)發(fā)
好了各位,以上就是這篇文章的全部?jī)?nèi)容了,能看到這里人啊,都是人才。
最后:【可能給你帶來(lái)幫助的教程】軟件測(cè)試最新自學(xué)教程