mock安裝
pip install pytest-mock
mock使用
pytest中使用無需導入,只需要導入pytest就可使用,它提供了一個名為mocker
的fixture。使用方法:
def test(mocker): mocker.patch() ****
mock作用
1、解決接口依賴:當我們要測試一個接口,而這個接口所依賴的接口還沒開發或者沒開發完。這時候可以使用mock模擬所依賴的接口完成測試 。
2、單元測試:當我們所要測試的接口還未開發完,而我們還要完成測試用例代碼的編寫,我們可以先模擬這個接口進行測試。
3、調用第三方接口:當我們的接口需要調用第三方,而第三方接口我們還未得到權限或未購買時,可使用mock模擬進行測試。
4、前后端聯調:當前端需要的接口后端還在開發,就可以使用mock模擬后端返回我們需要的數據。
mock實例
比如現在有這樣一個場景,我們測試三網認證,而認證需要調用第三方聚合的接口,第三方認證接口還未購買。就可以使用mock先模擬測試。
接口:
''' Code description:實名認證 Create time:2020-10-30 Developer:葉修 ''' import requests class Api_Person_Auth(object): #第三方認證接口 def api_person_auth(self,real_name,id_card,mobile): url = 'http://v.juhe.cn/telecom/query'#第三方認證接口 body = { "real_name":real_name, "id_card":id_card, "mobile":mobile } r = requests.post(url, json=body)#請求第三方認證接口 #print(r.text) return r #返回信息 #我們的認證接口 def api_my_auth(self,real_name,id_card,mobile): #調用第三方認證接口 response = self.api_person_auth(real_name,id_card,mobile) try: if response['resultcode'] == '100': return '認證成功' elif response['resultcode'] == '101': return '認證失敗' elif response['resultcode'] == "102": return '有必填參數為空' else: return '未定義錯誤' except Exception: return '系統異常' if __name__ == '__main__': Api_Person_Auth().api_person_auth()
接口是聚合三網認證接口,沒有key的情況下,是不會調用成功的。
測試用例:
''' Code description: 實名認證 Create time: 2020/10/30 Developer: 葉修 ''' import sys import allure import pytest from common.logger import Log from common.read_yaml import ReadYaml from api.api_person_auth.api_person_auth import Api_Person_Auth testdata = ReadYaml("person_auth.yml").get_yaml_data()#讀取參數化的數據 @allure.feature('實名認證') class Test_person_Auth(object): log = Log() @allure.title('實名認證') #使用parametrize參數化請求參數、狀態碼和返回信息 @pytest.mark.parametrize('real_name,id_card,mobile,expect', testdata['person_auth'], ids=['正確傳入參數', '全部參數為空', '姓名為空', '姓名錯誤']) def test_person_auth(self, mocker,real_name, id_card, mobile, expect): self.log.info('%s,%s' % ((sys._getframe().f_code.co_name, '------認證接口-----'))) shili = Api_Person_Auth() # 實例化 #方法一 shili.api_person_auth = mocker.patch.object(Api_Person_Auth,'api_person_auth', return_value={'resultcode': expect['resultcode']})#引用參數化狀態碼 #當傳入side_effect時,return_value就會失效,當調用真實的認證方法時,就會使用真實的認證方法,從而達到真實的測試如下: # shili.api_person_auth = mocker.patch.object(Api_Person_Auth, 'api_person_auth', # return_value={'resultcode': code},side_effect=shili.api_person_auth) #方法二 # mocker.patch第一個參數傳模擬對象的具體路徑api.api_person_auth.api_person_auth.Api_Person_Auth.api_person_auth # shili.api_person_auth = mocker.patch('api.api_person_auth.api_person_auth.Api_Person_Auth.' # 'api_person_auth', 'api_person_auth',return_value={'resultcode': '100'}) #加入side_effect參數,代碼稍作修改,要調用真實認證方法 #msg = shili.api_person_auth(real_name,id_card,mobile) #不加入side_effect參數,調用自寫的認證方法 msg = shili.api_my_auth(real_name,id_card,mobile) #加入side_effect參數,真實情況下返回msg.json() #self.log.info('%s:%s' % ((sys._getframe().f_code.co_name, '獲取請求結果:%s' % msg.json()))) #不加入side_effect參數,模擬情況下直接返回msg self.log.info('%s:%s' % ((sys._getframe().f_code.co_name, '獲取請求結果:%s' % msg))) # 模擬情況下斷言 assert msg == expect['resultmsg']#斷言響應信息
測試數據:
person_auth: - ['測試','371523199805170016','17854319777',{'resultcode':'100','resultmsg':'認證成功'}] - ['','','',{'resultcode':'102','resultmsg':'有必填參數為空'}] - ['','371523199805170016','17854319777',{'resultcode':'102','resultmsg':'有必填參數為空'}] - ['測試呀','371523199805170016','17854319777',{'resultcode':'101','resultmsg':'認證失敗'}]
測試結果:
2020-10-30 16:02:10,930 - root - INFO - test_person_auth,------認證接口----- 2020-10-30 16:02:10,931 - root - INFO - test_person_auth:獲取請求結果:認證成功 2020-10-30 16:02:10,933 - root - INFO - test_person_auth,------認證接口----- 2020-10-30 16:02:10,933 - root - INFO - test_person_auth:獲取請求結果:有必填參數為空 PASSEDPASSEDPASSED2020-10-30 16:02:10,935 - root - INFO - test_person_auth,------認證接口----- 2020-10-30 16:02:10,936 - root - INFO - test_person_auth:獲取請求結果:有必填參數為空 2020-10-30 16:02:10,938 - root - INFO - test_person_auth,------認證接口----- 2020-10-30 16:02:10,939 - root - INFO - test_person_auth:獲取請求結果:認證失敗 PASSED
總結
mock的基本使用在用例中已經介紹了,這里就不多解釋了。工作中具體的使用需要大家實際中磨練。