zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    [Everyday Mathematics]20150208
    [Everyday Mathematics]20150207
    [Everyday Mathematics]20150206
    数学基本技艺100题
    这天,白云酒楼里来了两位客人
    [Everyday Mathematics]20150205
    [Everyday Mathematics]20150204
    数学书籍阅读
    国科金发计〔2014〕86号
    [Everyday Mathematics]20150203
  • 原文地址:https://www.cnblogs.com/Maruying/p/13503937.html
Copyright © 2011-2022 走看看