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

  • 相关阅读:
    Asp.NET 4.0 ajax实例DataView 模板编程1
    ASP.NET 4.0 Ajax 实例DataView模板编程 DEMO 下载
    部分东北话、北京话
    .NET 培训课程解析(一)
    ASP.NET 4.0 Ajax 实例DataView模板编程2
    ASP.NET Web Game 架构设计1服务器基本结构
    ASP.NET Web Game 构架设计2数据库设计
    TFS2008 基本安装
    Linux上Oracle 11g安装步骤图解
    plsql developer远程连接oracle数据库
  • 原文地址:https://www.cnblogs.com/Maruying/p/13503937.html
Copyright © 2011-2022 走看看