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