Python Mock模块原理及使用方法详解


Posted in Python onJuly 07, 2020

一、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的入门;
  • 读者实操出来有一定的想法后完全可以应用到接口测试和单元测试过程中去。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现在线程里运行scrapy的方法
Apr 07 Python
python中的全局变量用法分析
Jun 09 Python
朴素贝叶斯Python实例及解析
Nov 19 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
Apr 26 Python
python写入文件自动换行问题的方法
Jul 05 Python
numpy np.newaxis 的实用分享
Nov 30 Python
适合Python初学者的一些编程技巧
Feb 12 Python
python 监控logcat关键字功能
Sep 04 Python
Python入门基础之数字字符串与列表
Feb 01 Python
python Autopep8实现按PEP8风格自动排版Python代码
Mar 02 Python
python 如何在 Matplotlib 中绘制垂直线
Apr 02 Python
详解Python小数据池和代码块缓存机制
Apr 07 Python
opencv 图像礼帽和图像黑帽的实现
Jul 07 #Python
PyTorch: Softmax多分类实战操作
Jul 07 #Python
opencv 形态学变换(开运算,闭运算,梯度运算)
Jul 07 #Python
解决pytorch 交叉熵损失输出为负数的问题
Jul 07 #Python
Python基于httpx模块实现发送请求
Jul 07 #Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 #Python
Pytorch损失函数nn.NLLLoss2d()用法说明
Jul 07 #Python
You might like
Yii数据库缓存实例分析
2016/03/29 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
浅入深出Vue之组件使用
2019/07/11 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
使用Python编写类UNIX系统的命令行工具的教程
2015/04/15 Python
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
在Django的上下文中设置变量的方法
2015/07/20 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
用Pelican搭建一个极简静态博客系统过程解析
2019/08/22 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
python lambda函数及三个常用的高阶函数
2020/02/05 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
Django如何重置migration的几种情景
2021/02/24 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
BudgetAir印度:预订航班、酒店和汽车租赁
2019/07/07 全球购物
2014年高三毕业生自我评价
2014/01/11 职场文书
护士上岗前培训自我鉴定
2014/04/20 职场文书
创业计划书之养殖业
2019/10/11 职场文书
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android
Java中的Kotlin 内部类原理
2022/06/16 Java/Android
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python
windows10声卡驱动怎么安装?win10声卡驱动安装操作步骤教程
2022/08/05 数码科技