• python常识系列16-->python自带的Mock模块使用


    前言

           时间是个常数,但也是个变数。勤奋的人无穷多,懒惰的人无穷少。
    

    一、mock是什么?

    • 英译中含义有:虚假的; 不诚实的; 模仿的; 模拟的 这个意思
    • 这个库的主要功能就是模拟一些事务
    • 官方解释:Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为

    二、为什么要用mock?

    举例:
    假设你开发一个项目,里面包含了一个登录模块,登录模块需要调用身份证验证模块中的认证函数,该认证函数会进行值的返回,然后系统根据这个返回值来做判断是否能进行登录。但是身份证验证模块中的认证函数只有在正式上线的系统上才提供。公司内部的测试环境或者开发环境上不提供。

    如果此时需要进行登录模块的业务测试或接口测试,该如何做?

    方法一:

    • 搭建一个测试服务器,在测试的时候,让认证函数和这个测试服务器交互,返回值给登录模块;
    • 缺点:1、测试服务器可能不好搭建,或者搭建效率很低;2、搭建的测试服务器可能无法返回所有可能的值,或者需要大量的工作才能达到这个目的。

    方法二:

    • 使用mock函数模拟即可。

    三、mock应用

    3.1 mock安装

    • 在Python 3.3以前的版本中,需要另外安装mock模块,可以使用pip命令来安装:
    pip install mock 
    
    • 从Python 3.3开始,mock模块已经被合并到标准库中,被命名为unittest.mock,可以直接import进来使用:
    from unittest import mock
    

    备注:目前Python 3.3之后的版本,也可以使用第一种方式应用mock

    3.2 mock简单举例

    from unittest import mock
    
    def add(num1,num2):
        return num1 + num2   # pass
    
    add_value = mock.Mock(return_value=200)  # 创建mock对象
    add = add_value # 把mock对象赋值给add方法
    
    print( add(10,20) )
    

    从上述代码执行可以看出,假使我把add()方法的实现改为pass,暂时还未实现,也可以通过mock先返回所需要的数据。

    3.3 mock应用举例

    import requests
    
    def send_request(url):
        r = requests.get(url)
        return r.status_code
    
    def visit_newdream():
        return send_request("http://www.hnxmxit.com/")
    
    print( visit_newdream() )
    

    上述代码是访问我们公司的官网,假设该官网访问请求还没被实现,此时 visit_newdream() 方法需要 send_request 返回响应状态码。这个时候可以用到mock。

    # 当前文件名为 mock_demo.py
    import unittest
    from unittest import mock
    import requests
    import mock_demo
    
    def send_request(url):
        r = requests.get(url)
        return r.status_code
    
    def visit_newdream():
        return send_request("http://www.hnxmxit.com/")
    
    class TestClient(unittest.TestCase):
        def test_success_request(self):
            success_send = mock.Mock(return_value='200')
            mock_demo.send_request = success_send
            self.assertEqual(mock_demo.visit_newdream(), '200')
    
    if __name__=="__main__":
        unittest.main()
    

    上述代码完成了mock的简单应用,由于mock_demo.send_request = success_send 把mock对象赋值给了方法,使得方法再次调用的时候使用了mock的方法完成把模拟返回值传递给mock_demo.visit_newdream()方法。

    四、小结

    • 此文基础的介绍了mock的入门;
    • 读者实操出来有一定的想法后完全可以应用到接口测试和单元测试过程中去。
  • 相关阅读:
    大厂面试高频Redis,记不住的多操作几次吧
    自动化测试系列之jenkins配置搭建环境
    关于linux服务器的磁盘监控的相关知识
    前端常见一些安全问题及解决方案
    如何使用PM2部署前端项目
    vuex状态管理器本地持久化
    关于在Vue中Typescript的写法
    websocket快速重连机制
    如何使用selenium打开多个浏览器
    运维人员踩坑记录之netplan遇坑,配置临时IP巧妙解决
  • 原文地址:https://www.cnblogs.com/dream66/p/13199395.html
Copyright © 2020-2023  润新知