python自带的Mock模块使用

枫铃3年前 (2021-07-11)Python253

一、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简单举例

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 当前文件名为 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的入门;

相关文章

python之请求报文对比(假定最多二维字典)

两段请求报文,判断不一样的key和value,只判断d2里和d1不同的值,和全部不同的key ''...

python重要函数eval

1.参数会作为一个 Python 表达式(从技术上说是一个条件列表)被解析并求值 >>> x = 1...

python 各种推导式玩法

推导式套路 除了最简单...

python中如何将字符串连接在一起,多倍的字符串如何输出

在python中,如果有多个字符串,想要连接在一起,或者说想要拼接在一起该如何操作,在此记录下。 1...

Python 删除文件与文件夹

删除文件 要删除一个文...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。