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

  • 相关阅读:
    静态代码块执行顺序
    静态代码块
    方法的定义(实例与静态)
    变量的声明(实例与静态)
    static关键字
    封装2
    线程1
    数组元素的查找——二分法查找
    docker介绍、安装及要素讲解
    渗透测试基础
  • 原文地址:https://www.cnblogs.com/shouhu/p/12166232.html
Copyright © 2020-2023  润新知