使用 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/   谢谢!!******* 

原文地址:https://www.cnblogs.com/shouhu/p/12166232.html