当前位置: 首页 > news >正文

pytest-mock 数据模拟

文章目录

  • mock 测试
  • unittest.mock
    • Mock类
    • MagicMock类
    • patch装饰器
    • create_autospec函数
    • 断言的方法
  • pytest-mock 使用

mock 测试

在单元测试时,有些数据需要依赖其他服务或者不好获取到,此时需要使用mock来模拟对应的函数、对象等。
 
mock模拟数据的python框架
unittest.mock, 标准模块;,有基于此的mock扩展包;
faker 生成假数据
pytest-mock, 扩展模块

 
mock 作用:

  • 解决web开发中,后端接口不存在时,使用mock模拟数据返回;
  • 依赖第三方接口时, mock模拟返回;
  • demo 演示效果;
     

unittest.mock

Mock类

  • 核心类Mock,基类;
  • 可以创建属性、方法,并存储如何被调用;
  • Mock实例化的参数
    • spec, 字符串列表或者对象(dir获取对象的属性名称),表示该Mock对象可以访问的属性;访问不在列表中的属性时,报错AttributeError;
    • spec_set,属于spec的严格变体,使用方法类似;
    • side_effect, 调用Mock对象时,执行的函数,常用引发异常,或者动态改变函数的返回值; 如果是可迭代对象,则每次调用Mock对象都获取一个值;
    • return_value, 指定调用Mock对象的返回值;
    • wraps,包裹的函数,Mock对象的调用,实际是包裹函数的调用,并返回,类似side_effect;
    • name, Mock对象的名称;
  • 使用方法:

from unittest.mock import Mock
class Lauf:def __init__(self, name, age):self.name = nameself.age = age# 创建对象
lauf = Lauf("jack", 25)
mock_obj = Mock(spec=lauf) # mock对象具有lauf的属性、方法,可以进行属性赋值
mock_obj.name = "lili"# side_effect 用于引发异常
mock = Mock(side_effect=KeyError('foo'))
mock()
# 抛出异常
KeyError: 'foo'
mock.side_effect = 可重新赋值# side_effect 用于执行函数动作
m4 = Mock(side_effect=lambda: print("执行函数"))
m4()
执行函数
m4.mock_calls # 查看调用记录# return_value 直接指定返回值
In [58]: m5 = Mock(return_value="jack")
In [59]: m5()
Out[59]: 'jack'# wraps 包裹
In [67]: def func():...:     print("func is running...")...: In [68]: m8 = Mock(wraps=func)
In [69]: m8()
func is running...

MagicMock类

  • MagicMock是 Mock的子类,默认实现了大部分魔法方法;
  • 简单使用
from unittest.mock import MagicMockclass Lauf:def __init__(self, name, age):self.name = nameself.age = age# 模拟方法
lauf.run_method = MagicMock(return_value="running...")lauf.run_method(3,4,5,key="value") # 参数随意
'running...'# 断言
lauf.run_method.assert_called_once_with(3,4,5,key="value") # 带着这些参数被调用一次

 

patch装饰器

  • 模拟xxx,得到一个MagicMock对象;
  • 使用:
from unittest.mock import patchIn [83]: @patch("os.path")...: def func(a): # 模拟os.path得到一个MagicMock对象,传给函数...:     print(a, a is os.path)...: ...: In [84]: func()
<MagicMock name='path' id='1620313178896'> True# 依次模拟,得到多个MagicMock对象
@patch("requests.post")
@patch("requests.get")
def func(get_mock, post_mock):print(get_mock is requests.get) # Trueprint(post_mock is requests.post) # True# 模拟类的对象
# 为类的对象的属性、方法(必须该类中存在) 创建一个MagicMock对象
with patch.object(Lauf, 'method', return_value=None) as mock_method:lauf = Lauf('a', 10)lauf.method(1, 2, 3)# 断言
mock_method.assert_called_once_with(1, 2, 3)# 上下文内有效
foo = {'key': 'value'}
original = foo.copy()
with patch.dict(foo, {'newkey': 'newvalue'}, clear=True):assert foo == {'newkey': 'newvalue'} # 测试时foo变为新字典# 测试结束,foo恢复
assert foo == original# 操作魔法方法
m = MagicMock()
m.__str__.return_value = "jack"
str(m) # 返回"jack"m.__str__ = MagicMock(return_value="xxx")

 

create_autospec函数

  • 创建mock对象,并确保与模拟的函数、对象具有相同的接口;
  • patch(autospec=True)
In [98]: def func(a,b,c):...:     print(a,b,c)...: # 模拟函数,并确保参数相同
In [99]: mock_func = create_autospec(func, return_value="3")In [100]: mock_func(1,2,3)
Out[100]: '3'# 模拟对象,并确保相同的接口
In [106]: mock_obj = create_autospec(Lauf("jack", 23))In [107]: mock_obj.name
Out[107]: <NonCallableMagicMock name='mock.name' spec='str' id='1620277710272'>
mock_obj.name = "lili" # 赋值In [108]: mock_obj.age
Out[108]: <NonCallableMagicMock name='mock.age' spec='int' id='1620302996240'>

 

断言的方法

  • assert_called()
    Assert that the mock was called at least once.
mock = Mock()
# 调用mock
mock()
# 断言
mock.assert_called()# 返回一个新的Mock对象
mock.method()
<Mock name='mock.method()' id='...'>
# mock.xx 随即返回一个新的 mock对象,新的mock对象断言
mock.method .assert_called()
  • assert_called_once()
    Assert that the mock was called exactly once.
mock = Mock()
mock.assert_called_once()  # 仅仅调用一次,多/没调用  均异常
  • assert_called_with(*args, **kwargs)
    This method is a convenient way of asserting that the last call has been made in a particular way:

mock = Mock()
mock.method(1, 2, 3, test='wow')
mock.method.assert_called_with(1, 2, 3, test='wow')
  • assert_called_once_with(*args, **kwargs)
    Assert that the mock was called exactly once and that call was with the specified arguments.

mock = Mock(return_value=None)
mock('foo', bar='baz')
mock.assert_called_once_with('foo', bar='baz')mock('other', bar='values')
mock.assert_called_once_with('other', bar='values')
Traceback (most recent call last):...
AssertionError: Expected 'mock' to be called once. Called 2 times.
  • assert_any_call(*args, **kwargs),
    assert the mock has been called with the specified arguments.
mock = Mock(return_value=None)
mock(1, 2, arg='thing')
mock('some', 'thing', 'else')
mock.assert_any_call(1, 2, arg='thing')

 

pytest-mock 使用

  • 安装
pip install pytest pytest-mock
  • 使用

相关文章:

pytest-mock 数据模拟

文章目录 mock 测试unittest.mockMock类MagicMock类patch装饰器create_autospec函数断言的方法 pytest-mock 使用 mock 测试 在单元测试时&#xff0c;有些数据需要依赖其他服务或者不好获取到&#xff0c;此时需要使用mock来模拟对应的函数、对象等。 mock模拟数据的python…...

单片机原理及应用:定时器/计数器综合应用

本文是《单片机原理及应用》专栏中的最后一篇文章&#xff0c;笔者以编译器的安装配置——51单片机简介——LED和数码管外设——开关和按键控制功能切换——外部中断系统——定时器与计数器为知识大纲&#xff0c;介绍了C语言编程控制51单片机的入门教程。作为收尾&#xff0c;…...

R语言【paleobioDB】——pbdb_intervals():通过参数选择,返回多个地层年代段的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_interval (id, ...) Arguments 参数【..…...

阅读笔记lv.1

阅读笔记 sql中各种 count结论不同存储引擎计算方式区别count() 类型 责任链模式常见场景例子&#xff08;闯关游戏&#xff09; sql中各种 count 结论 innodb count(*) ≈ count(1) > count(主键id) > count(普通索引列) > count(未加索引列)myisam 有专门字段记录…...

小鼠的滚动疲劳仪-转棒实验|ZL-200C小鼠转棒疲劳仪

转棒实验|ZL-200C小鼠转棒疲劳仪用于检测啮齿类动物的运动功能。通过测量动物在滚筒上行走的持续时间&#xff0c;来评定**神经系统*病或损坏以及药物对运动协调功能和疲劳的影响。 疲劳实验中&#xff0c;让小鼠在不停转动的棒上运动&#xff0c;肌肉会很快进入疲劳状态&#…...

平衡搜索二叉树(AVL树)

目录 前言 一、AVL树的概念 二、AVL树的定义 三、AVL树的插入 四、AVL树的旋转 4.1、右单旋 4.2、左单旋 4.3、左右双旋 4.4、右左双旋 五、AVL树的验证 5.1、 验证其为二叉搜索树 5.2、 验证其为平衡树 六、AVL树的性能 前言 二叉搜索树虽可以缩短查找的效率&…...

2024年1月12日学习总结

学习目标 完成集中学习的readme 完成联邦学习的代码编写 边学习边总结 学习内容 Introduction to Early Stopping 1、Overfitting 过拟合是所有机器学习&#xff0c;深度学习中可能出现的一个比较严重的问题。具体表现就是&#xff1a;你的模型在训练集上处理的效果非常好&…...

PCL 使用克拉默法则进行四点定球(C++详细过程版)

目录 一、算法原理二、代码实现三、计算结果本文由CSDN点云侠原创,PCL 使用克拉默法则进行四点定球(C++详细过程版),爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 已知空间内不共面的四个点,设其坐标为 A (…...

前端导致浏览器奔溃原因分析

内存泄漏 内存泄漏&#xff08;Memory Leak&#xff09;是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放&#xff0c;造成系统内存的浪费&#xff0c;导致程序运行速度减慢甚至系统崩溃等严重后果。&#xff08;程序某个未使用的变量或者方法&#xff0c;长期占…...

力扣:209.长度最小的子数组

1.题目分析&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 …...

常见类型的yaml文件如何编写?--kind: Service

基本说明 在 Kubernetes 中&#xff0c;Service 是一种抽象的方式&#xff0c;用于定义一组 Pod 的访问方式和网络服务。Service 提供了一个稳定的网络端点&#xff08;Endpoint&#xff09;&#xff0c;使得其他服务或外部用户可以通过 Service 来访问被管理的 Pod。 负载均…...

linux环境下安装postgresql

PostgreSQL: Linux downloads (Red Hat family)postgresql官网 PostgreSQL: Linux downloads (Red Hat family) 环境&#xff1a; centos7 postgresql14 选择版本 执行启动命令 配置远程连接文件 vi /var/lib/pqsql/14/data/postgresql.conf 这里将listen_addresses值由lo…...

专业课145+合肥工业大学833信号分析与处理考研经验合工大电子信息通信

今年专业课145也是考研科目中最满意的一门&#xff0c;其他基本相对平平&#xff0c;所以这里我总结一下自己的专业课合肥工业大学833信号分析与处理的复习经验。 我所用的教材是郑君里的《信号与系统》&#xff08;第三版&#xff09;和高西全、丁玉美的《数字信号处理》&…...

FreeRtos Queue (一)

本篇主要讲队列的数据结构和初始化 一、队列的数据结构 二、队列初始化完是什么样子的 队列初始化的函数调用关系&#xff1a;xQueueGenericCreate->prvInitialiseNewQueue->xQueueGenericReset 所以&#xff0c;最终初始化完的队列是这样的 假设申请了4个消息体&…...

深入理解 Hadoop (五)YARN核心工作机制浅析

概述 YARN 的核心设计理念是 服务化&#xff08;Service&#xff09; 和 事件驱动&#xff08;Event EventHandler&#xff09;。服务化 和 事件驱动 软件设计思想的引入&#xff0c;使得 YARN 具有低耦合、高内聚的特点&#xff0c;各个模块只需完成各自功能&#xff0c;而模…...

优化 - 重构一次Mysql导致服务器的OOM

概述 优化了一次前后端处理不当导致的CPU的一次爆机行为&#xff0c;当然&#xff0c;这和服务器的配置低也有着密不可分的关系&#xff0c;简单的逻辑学告诉我们&#xff0c;要找到真正的问题&#xff0c;进行解决&#xff0c;CPU爆机的关键点在于前后端两个方面&#xff0c;…...

【光波电子学】基于MATLAB的多模光纤模场分布的仿真分析

基于MATLAB的多模光纤模场分布的仿真分析 一、引言 &#xff08;1&#xff09;多模光纤的概念 多模光纤&#xff08;MMF&#xff09;是一种具有较大纤芯直径的光纤结构&#xff0c;其核心直径通常在10-50微米范围内。与单模光纤&#xff08;SMF&#xff09;相比&#xff0c;…...

0104 AJAX介绍

Ajax 的全称是 Asynchronous Javascript And XML &#xff08;异步 JavaScript 和 XML &#xff09;。 通俗的理解&#xff1a;在网页中利用 XMLHttpRequest 对象和服务器进行数据交互的方式&#xff0c;就是 Ajax Ajax 能让我们轻松实现网页与服务器之间的数据交互。 浏览器…...

代码随想录算法训练营第24天 | 理论基础 77. 组合

目录 理论基础 什么是回溯法 回溯法的效率 回溯法解决的问题 如何理解回溯法 回溯法模板 77. 组合 &#x1f4a1;解题思路 &#x1f4bb;实现代码 理论基础 什么是回溯法 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 回溯法的效率 虽然回溯法很难&#xff…...

【深度学习环境搭建】Windows搭建Anaconda3、已经Pytorch的GPU版本

目录 搭建Anaconda3搭建GPU版本的Pytorch你的pip也要换源&#xff0c;推荐阿里源打开conda的PowerShell验证 搭建Anaconda3 无脑下载安装包安装&#xff08;自行百度&#xff09; 注意点&#xff1a; 1、用户目录下的.condarc需要配置&#xff08;自定义环境的地址&#xff08…...

基于WebFlux的Websocket的实现,高级实现自定义功能拓展

基于WebFlux的Websocket 一、导入XML依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency><!-- 或者引入jackson --> <dependency><group…...

使用 LLVM clang C/C++ 编译器编译 OpenSSL 3.X库

1、下载 OpenSSL 3.X 库的源代码放到待编译目录 2、解压并接入 OpenSSL 3.X 库源码的根目录 3、复制 ./Configure 一个取名为 ./Configure-clang 4、修改 ./Configure-clang 找到配置段&#xff1a; CC CXX CPP LD 把它们改成 CC > "/usr/bin/clang-…...

【信息安全】hydra爆破工具的使用方法

hydra简介 hydra又名九头蛇&#xff0c;与burp常规的爆破模块不同&#xff0c;hydra爆破的范围更加广泛&#xff0c;可以爆破远程桌面连接&#xff0c;数据库这类的密码。他在kali系统中自带。 参数说明 -l 指定用户名 -L 指定用户名字典文件 -p 指定密码 -P 指…...

uniapp中uview组件库丰富的CountTo 数字滚动使用方法

目录 #平台差异说明 #基本使用 #设置滚动相关参数 #是否显示小数位 #千分位分隔符 #滚动执行的时机 #API #Props #Methods #Event 该组件一般用于需要滚动数字到某一个值的场景&#xff0c;目标要求是一个递增的值。 注意 如果给组件的父元素设置text-align: cente…...

inflate流程分析

一.inflate的三参数重载方法else里面逻辑 我们先看到setContentView里面的inflate的调用链&#xff1a; public View inflate(LayoutRes int resource, Nullable ViewGroup root) {return inflate(resource, root, root ! null);}public View inflate(LayoutRes int resource…...

数据挖掘实战-基于机器学习的电商文本分类模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

第8章-第4节-Java中字节流的缓冲流

1、缓冲流&#xff1a;属于高级IO流&#xff0c;并不能直接读写数据&#xff0c;需要依赖于基础流。缓冲流的目的是为了提高文件的读写效率&#xff1f;那么是如何提高文件的读写效率的呢&#xff1f; 在内存中设置一个缓冲区&#xff0c;缓冲区的默认大小是8192字节&#xff…...

NULL是什么?

NULL是一个编程术语&#xff0c;通常用于表示一个空值或无效值。在很多编程语言中&#xff0c;NULL用于表示一个变量或指针不引用任何有效的对象或内存位置。 NULL可以看作是一个特殊的值&#xff0c;表示缺少有效的数据或引用。当一个变量被赋予NULL值时&#xff0c;它表示该变…...

FreeRTOS 基础知识

这个基础知识也是非常重要的&#xff0c;那我们要学好 FreeRTOS&#xff0c;这些都是必不可少的。 那么就来看一下本节有哪些内容&#xff1a; 首先呢就是介绍一下什么是任务调度器。接着呢就是任务它拥有哪一些状态了。那这里的内容不多&#xff0c;但是呢都是非常重要的。 …...

【野火i.MX6NULL开发板】挂载 NFS 网络文件系统

0、前言 参考资料&#xff1a; &#xff08;误人子弟&#xff09;《野火 Linux 基础与应用开发实战指南基于 i.MX6ULL 系列》PDF 第22章 参考视频&#xff1a;&#xff08;成功&#xff09; https://www.bilibili.com/video/BV1JK4y1t7io?p26&vd_sourcefb8dcae0aee3f1aab…...

类似凡科互动的网站/磁力帝

视频中用到的是<bean id...> <constructor-arg ref"userDao4Mysql"/> </bean> 表示在构造函数中引用userDao4Mysql这个类。 ref是引用的意思。...

小果视界怎么推广赚钱/长沙seo 优化选智投未来no1

Cooler Master酷冷至尊在本届Computex上发布了即将上市的全系列散热解决方案产品&#xff0c;包括新3DVVC技术、一体化双冷头水冷和全新MasterFan SF系列风扇。MasterAir Maker 3DVVC MasterAir Maker 3DVVC采用垂直式均热板导热技术。不同于传统的热管散热技术&#xff0c;这款…...

互联网行业排行榜/seo优化技术厂家

安装 Oracle VM VitrualBoxOracle VM VirtualBox Extension PackU盘启动 VBoxManage internalcommands createrawvmdk -filename D:\usb.vmdk -rawdisk \\.\PhysicalDrive#转载于:https://www.cnblogs.com/magiclor/p/9496835.html...

网站开发需要什么关键技术/关键词优化排名查询

由于网上大部分用分治算法实现的大整数相乘程序&#xff0c;其输入乘数竟然设定为int值&#xff0c;实现了分治思想&#xff0c;但实在不能称其为大整数。本文实现了用字符串存储乘数&#xff0c;并且输出正确结果。由于算法未经过大量数据测试&#xff0c;可能还存在问题&…...

html5的篮球网站开发/开封网络推广公司

点击蓝色“程序员书单”关注我哟 加个“星标”&#xff0c;每天带你读好书&#xff01; ​ qt系列书单 ​ Qt 5编程入门 Qt是软件开发领域中非常著名的C可视化开发平台。本书以Qt 5.11为平台&#xff0c;介绍Qt和QML编程及其应用开发。全书分为5个部分。第1部分为Qt基础&a…...

长沙传统网络营销策略/百度竞价是seo还是sem

本软件为全国计算机等级考试一级计算机基础及Ms Office应用押题库的软件&#xff0c;适合2017年的考试&#xff0c;为考试的提供了充分的复习准备&#xff0c;可随时随地学习练习&#xff0c;有效帮助顺利通过考试&#xff0c;学习知识通过考试必备神器&#xff01;【功能介绍】…...