pytest中mock的使用


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的基本使用在用例中已經介紹了,這里就不多解釋了。工作中具體的使用需要大家實際中磨練。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM