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
  • 使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

71、C++ 环境搭建:10分钟快速在 windows 上安装一个 Linux 系统

这一节带大家搭建一个统一的 C++ 环境。 因为不少人用的 C++ 环境都不一样,用的编译器、编辑器也都不一致,很难统一。我在准备写这篇的时候,思考了很久,最终决定搭建一个统一的环境,希望大家后面在运行和调试C++代码时,可以参考这个环境来进行。 如果你是 linux 老用户…

Android Studio个性化修改

Android Studio原始界面看着也太无趣了叭&#xff0c;话不多说跟步骤走就可以。 1.更改Android Studio主题及背景 1.背景修改 File->Settings->Plugins&#xff0c;搜索Sexy Editor 重启后&#xff0c;左侧边栏出现Other Settings选项&#xff0c;点击SexyEditor进行背…

二分搜索边界问题的简单结论

引言 二分搜索是一个说简单也很简单&#xff08;代码很固定&#xff0c;也没几行&#xff09;&#xff0c;说难也很难&#xff08;边界问题可能会让人想不太清楚&#xff09;。 事实上&#xff0c;边界问题也是是算法题中普遍存在的难点。 这篇文章讲两个简单的结论&#xff0…

009-Zynq基操之如何去玩转PL向PS的中断(对新手友好,走过路过千万不要错过)

文章目录 前言一、PL-PS的中断是啥&#xff1f;二、PL-PS端中断详细步骤1.ZYNQ核配置2.PS端中断函数配置3.需要拓展多个中断函数 总结 前言 本设计跟我的ZYNQ实战合集专栏中的脉冲触发电路有关系&#xff0c;也正好趁这个机会讲述一下PL-PS的中断系统&#xff0c;如何去触发中…

Java 设计模式

1.单例设计模式 对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法。 1.1 饿汉式 构造器私有化 --> 防止直接new类的内部创建对象提供一个static的public方法 getInstance class GirlFriend {private String name;private static GirlFri…

MySQL第二次

作业要求&#xff1a; 作业代码实现&#xff1a; create database db_04 default charsetutf8mb4;use db_04;create table if not exists t_hero(id int primary key auto_increment,name varchar(20) not null unique,nickname varchar(50) not null unique,address varchar…

【Python机器学习系列】建立KNN模型预测心脏疾病(完整实现过程)

这是Python程序开发系列原创文章&#xff0c;我的第198篇原创文章。 一、问题 对于表格数据&#xff0c;一套完整的机器学习建模流程如下&#xff1a; 针对不同的数据集&#xff0c;有些步骤不适用即不需要做&#xff0c;其中橘红色框为必要步骤&#xff0c;由于数据质量较高&…

4点优势,昂首资本使用浮动差价不使用固定差价的原因

在交易中&#xff0c;很多投资者和昂首资本一样&#xff0c;会使用浮动点差而不使用固定点差&#xff0c;那是因为投资者和昂首资本一样认为&#xff0c;使用浮动差价交易会比使用固定价差交易更有优势。 首先在大部分交易时段&#xff0c;价差缩小。正如投资者和昂首资本所知…

Pandas实战100例 | 案例 40: 分组并应用多个聚合函数

案例 40: 分组并应用多个聚合函数 知识点讲解 Pandas 的 groupby 和 agg 方法使得对数据分组后应用多个聚合函数成为可能。这在数据分析中非常有用&#xff0c;可以快速得到分组统计数据。 分组聚合: 使用 groupby 方法对数据进行分组。多重聚合: 使用 agg 方法并传递一个包…

用python批量合并word文件并统一调整图片大小

import os,time from docx import Document from docxcompose.composer import Composer import win32com.client as win32 # 获取要处理的文件夹路径 folder_path r"C:\Users\Thinkpad\Desktop\wordoutput" datanames os.listdir(folder_path) list_wordoutname …

6. 逻辑删除

逻辑删除对应的是物理删除&#xff0c;分别介绍一下这两个概念&#xff1a; 物理删除 &#xff1a;指的是真正的删除&#xff0c;即&#xff1a;当执行删除操作时&#xff0c;将数据表中的数据进行删除&#xff0c;之后将无法再查询到该数据逻辑删除 &#xff1a;并不是真正意…

SQL 解析与执行流程

一、前言 在先前的技术博客中&#xff0c;我们已经详细介绍过数据库的 parser 模块与执行流程&#xff1a;用户输入的 SQL 语句通过词法解析器生成 token&#xff0c;再通过语法分析器生成抽象语法树&#xff08;AST&#xff09;&#xff0c;经过 AST 生成对应的 planNode&…

JavaScript常用事件详解

一、用于form&#xff08;表单&#xff09;的事件 在网页中经常会遇到一些表单的验证&#xff0c;是通过事件进行处理的&#xff0c;比如用户输入用户名之后&#xff0c;及时显示用户是否被注册 用于form&#xff08;表单&#xff09;的事件 事件名功能 onblur 当元素失…

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

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

go 语言优雅地处理 error

我看到很多 golang 社区的开发者&#xff0c;特别是因为它的简单性而被吸引的开发者&#xff0c;对 golang 中的事情应该如何处理做出了一些快速的判断。 其中一件事就是错误处理。由于目前大多数语言的开发者都来自于 OOP 背景&#xff0c;他们习惯于处理异常&#xff0c;或者…

go最佳实践:如何舒适地编码

什么是 "最佳 "做法&#xff1f; 有很多做法&#xff1a;你可以自己想出来&#xff0c;在互联网上找到&#xff0c;或者从其他语言中拿来&#xff0c;但由于其主观性&#xff0c;并不总是容易说哪一个比另一个好。”最佳”的含义因人而异&#xff0c;也取决于其背景…

数据结构学习之顺序栈应用的案例(有效的括号)

实例要求&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效&#xff1b; 有效字符串需满足的条件&#xff1a; 1、左括号必须用相同类型的右括号闭合&#xff1b; 2、左括号必须…

CSAPP - 流程化的人工反汇编 string_length, strings_not_equal

文章目录 反汇编的流程string_length 的反汇编&#xff0c;第二次尝试strings_not_equal 反汇编&#xff0c;第二次尝试一些“定式”的整理定式1&#xff1a; cmp 和 je/jne定式2&#xff1a;test A,A 和 je/jne 反汇编的流程 依然是 CSAPP bomblab phase_1 的小白视角的理解。…

c# ref和out参数修饰符

ref&#xff1a;把值类型变成引用类型传递&#xff0c;形参的值改变了实参的值也会改变 public static int findMax(ref int num1, ref int num2){num1 * 2;num2 * 2;return num1 num2;}private static void Main(string[] args){int a1 1; int a2 2;findMax(ref a1, ref a2…

什么是算法的空间复杂度?

一、问题 常常⽤算法的空间复杂度来评价算法的性能&#xff0c;那么什么是算法的空间复杂度呢&#xff1f; 二、解答 算法的空间复杂度是指在算法的执⾏过程中&#xff0c;需要的辅助空间数量。 辅助空间数量指的不是程序指令、常数、指针等所需要的存储空间&#xff0c;也不是…