使用 unittest 中 mock 來模擬外部接口的返回


  在自動化測試過程中我們可能會遇到一個 A 接口需要調用其他的接口(外部接口),但是其他接口不能正常訪問;但是我們又需要測試 A 接口;這時我們就可以使用 mock ,來模擬第三方接口請求成功后,獲取到他的返回值,才可以進行下一步測試

  先定義第三方接口支付類

import requests


class Payment:
    """
    定義第三方支付類
    """
    @staticmethod
    def auth(card_num, amount):
        """
        請求 某付寶 第三方的支付接口, 不是我們自己開發的接口
        :param card_num: 卡號
        :param amount: 金額
        :return: 返回狀態碼, 200代碼支付成功, 500 代表支付異常
        """
        url = "http://第三方字符串接口.site"        # 假接口地址不能訪問
        data = {"card_num": card_num, "amount": amount}     # 參數
        res = requests.post(url, data=data)     # 傳參
        return res.status_code                  # 正常返回狀態碼, 200代碼支付成功, 500 代表支付異常

    def pay(self, user_id, card_num, amount):
        """
        支付方法
        :param user_id: 用戶ID
        :param card_num: 卡號
        :param amount: 金額
        :return:
        """
        try:
            status_code = self.auth(card_num, amount)
        except TimeoutError:    # 超時異常,后再進行支付
            status_code = self.auth(card_num, amount)

        if status_code == 200:      # 返回200成功
            print(f"【{user_id}】支付【{amount}】成功!!! 進行扣款並登記支付記錄!")
            return "success"
        elif status_code == 500:    # 500 代表支付異常
            print(f"【{user_id}】支付【{amount}】失敗!!! 不進行扣款!")
            return "Fail"

  接下來我們來測試支付接口

 只有支付成功后才能買到商品,但現在不能調用第三方的支付接口時,就使用mock來代替充值成功,方便測試支付功能?

import unittest
from unittest import mock               # 導入unittest當中的mock

from scripts.bbpayment import Payment   # 測試的支付接口模塊


class PaymentTest(unittest.TestCase):
    """
    測試支付接口
    """
    def setUp(self):
        self.payment = Payment()    # 創建這個類的對象

    def test_normal(self):
        """
        正常調用支付接口會失敗
        :return:
        """
        res = self.payment.pay(user_id=1001,
                               card_num=6666,
                               amount=100000)
        self.assertEqual('success', res)

    def test_success(self):
        """
        測試支付成功,模擬返回值
        :return:
        """
        # 第三方支付接口不能訪問,我們需要來創建一個假的接口來替代它,模擬返回的數據
        # 可以直接返回對象
        # self.payment.auth = mock.Mock(return_value='{"name": "超越", "msg": "征婚成功", "code": 8888}')
        # 可以模擬返回狀態碼
        self.payment.auth = mock.Mock(return_value=200)     # 創建假接口來覆蓋第三方接口,模擬返回200
        res = self.payment.pay(user_id=1001,
                               card_num=6666,
                               amount=100000)
        self.assertEqual('success', res)

    def test_fail(self):
        """
        測試支付失敗,模擬返回值
        :return:
        """
        self.payment.auth = mock.Mock(return_value=500)     # 創建假接口來覆蓋第三方接口,模擬返回500
        res = self.payment.pay(user_id=1001,
                               card_num=6666,
                               amount=100000)
        self.assertEqual('Fail', res)

    def test_retry_success(self):
        """
        測試調用的第三方接口超時之后, 再次字符串成功,模擬返回值
        :return:
        """
        # 邊界校驗傳參
        self.payment.auth = mock.Mock(side_effect=[TimeoutError, 200])
        res = self.payment.pay(user_id=1001,
                               card_num=6666,
                               amount=100000)
        self.assertEqual('success', res)


if __name__ == '__main__':
    unittest.main()

  失敗結果

  成功結果

  

 

 

 

*******請大家尊重原創,如要轉載,請注明出處:轉載自:https://www.cnblogs.com/shouhu/   謝謝!!******* 


免責聲明!

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



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