Python中使用mock.Mock()進行mock測試


先來一個簡單的例子:

import requests
from unittest import mock

def request_lemonfix():
    """

    :return:
    """
    res = requests.get('http://www.lemonfix.com')
    return res.status_code.encode('utf-8')


if __name__ == '__main__':
    request_lemonfix = mock.Mock(return_value="這里會顯示論壇主頁")
    print(request_lemonfix())

然后再來一個實用的例子:第三方支付接口目前不能調用情況下 使用mock完成測試

import requests


class Payment:
    """
    定義第三方支付類
    """
    def authe(self, card_num, amount):
        """
        請求第三方支付接口,並返回響應碼
        :param card_num: 卡號
        :param amount: 金額
        :return: 返回狀態碼200 代表支付成功,500 代表支付異常
        """
        url = "https://www.dd.com"  # 第三方的url
        data = {"card_num": card_num, "amount": amount}
        response = requests.post(url, data=data)
        return response.status_code

    def pay(self, user_id, card_num, amount):
        """
        支付
        :param user_id: 用戶id
        :param card_num: 卡號
        :param amount: 金額
        :return:
        """
        try:
            status_code = self.authe(card_num, amount)
        except TimeoutError:
            status_code = self.authe(card_num, amount)

        if status_code == 200:
            print("支付成功")
            return "success"
        if status_code == 500:
            print("支付失敗")
            return "fail"

下面來看測試類:

import unittest
from payment import Payment
from unittest import mock


class PaymentTest(unittest.TestCase):
    """
    測試支付接口
    """
    def setUp(self):
        self.payment = Payment()

    def test_success(self):
        """
        測試支付成功
        :return:
        """
        self.payment.authe = mock.Mock(return_value=200)
        res = self.payment.pay(user_id=10001, card_num="123444", amount=1000)
        self.assertEqual("success", res)

    def test_fail(self):
        """
        測試支付成功
        :return:
        """
        self.payment.authe = mock.Mock(return_value=500)
        res = self.payment.pay(user_id=10002, card_num="1233444", amount=1000)
        self.assertEqual("fail", res)

    def test_retry_success(self):
        """
                測試支付失敗重試在成功
                side_effect 可以為序列類型 異常類型,對象
                如果為序列類型 每次調用mock對象,會依次將side effcet中的元素返回
                :return:
                """
        self.payment.authe = mock.Mock(side_effect=[TimeoutError, 200])
        res = self.payment.pay(user_id=10003, card_num="1234444", amount=1000)
        self.assertEqual("success", res)


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

  


免責聲明!

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



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