python中使用mock模塊返回數據


mock是輔助單元測試的一個模塊。它允許您用模擬對象替換您的系統的部分,並對它們已使用的方式進行斷言。

mock在python3中已經被集成到了unittest單元測試框架中,所以,可以直接使用。

 

 

mock作用

1. 解決依賴問題:當我們測試一個接口或者功能模塊的時候,如果這個接口或者功能模塊依賴其他接口或其他模塊,那么如果所依賴的接口或功能模塊未開發完畢,那么我們就可以使用mock模擬被依賴接口,完成目標接口的測試

2. 單元測試:如果某個功能未開發完成,我們又要進行測試用例的代碼編寫,我們也可以先模擬這個功能進行測試

3. 模擬復雜業務的接口:實際工作中如果我們在測試一個接口功能時,如果這個接口依賴一個非常復雜的接口業務,那么我們完全可以使用mock來模擬這個復雜的業務接口,其實這個和解決接口依賴是一樣的原理。

4.前后端聯調:如果你是一個前端頁面開發,現在需要開發一個功能:根據后台返回的狀態展示不同的頁面,那么你就需要調用后台的接口,但是后台接口還未開發完成,是不是你就停止這部分工作呢?答案是否定的,你完全可以借助mock來模擬后台這個接口返回你想要的數據

 

 

 

實例:

# mock_modular.py

import requests

class PayApi():

    @staticmethod
    def auth(card, money):
        '''
        第三方支付接口
        :param card: 卡號
        :param money: 支付金額
        :return:
        '''
        pay_url = "http://www.payapi.com"
        data = {
            "card": card,
            "money": money
        }
        response = requests.post(url=pay_url, data=data)
        return response

    def pay(self, userId, card, money):
        '''
        我們自己的支付接口
        :param userId: 用戶id
        :param card: 卡號
        :param money: 支付金額
        :return:
        '''
        # 調用第三方支付接口
        response = self.auth(card, money)
        try:
            if response['status_code'] == "200":
                print("用戶{}支付金額{}成功" .format(userId, money))
                return "支付成功"
            elif response['status_code'] == "500":
                print("用戶{}支付失敗,金額不變".format(userId))
                return "支付失敗"
            else:
                return "未知錯誤"
        except  Exception:
            return "Error, 服務器異常!"

if __name__ == "__main__":
    pass

 

# modular.py

import unittest
from unittest import mock
from mock_modular import PayApi

class TestPayApi(unittest.TestCase):

    def setUp(self):
        self.pay = PayApi()

    def test_success(self):
        # pay = PayApi()
     # mock.Mock定義要模擬的函數,return_value定義模擬函數的返回值
self.pay.auth = mock.Mock(return_value={"status_code": "200"}) status = self.pay.pay('10000', '123456', "10000")
     # 增加斷言,檢查返回值是否正確 self.assertEqual(status,
"支付成功") def test_fail(self): # pay = PayApi() self.pay.auth = mock.Mock(return_value={"status_code": "500"}) status = self.pay.pay("10001", '1234567', "20000") self.assertEqual(status, "支付失敗") def test_error(self): # pay = PayApi() self.pay.auth = mock.Mock(return_value={"status_code": "300"}) status = self.pay.pay("10002", '12345678', '30000') self.assertEqual(status, "未知錯誤") def test_exception(self): # pay = PayApi() self.pay.auth = mock.Mock(return_value="201") status = self.pay.pay("10003", "123456789", "40000") self.assertEqual(status, "Error, 服務器異常!") '''
   # mock.patch(模塊名.類名.函數名)指明了將要模擬的函數
@mock.patch("modular.PayApi.auth") def test_success(self, mock_payapi): mock_payapi.return_value={"status_code": "200"} pay = PayApi() status = pay.pay('10000', '123456', "10000") self.assertEqual(status, "支付成功") @mock.patch("modular.PayApi.auth") def test_fail(self, mock_payapi): pay = PayApi() mock_payapi.return_value={"status_code": "500"} status = pay.pay("10001", '1234567', "20000") self.assertEqual(status, "支付失敗") ''' if __name__ == "__main__": unittest.main()

運行modular.py,結果如下:

Ran 4 tests in 0.002s

OK
用戶10001支付失敗,金額不變
用戶10000支付金額10000成功

Process finished with exit code 0

 

參考:https://www.cnblogs.com/linuxchao/p/linuxchao-mock.html


免責聲明!

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



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