首页 > 编程语言 >Python中Mock和Patch的区别

Python中Mock和Patch的区别

时间:2023-09-02 16:13:38浏览次数:64  
标签:Python object patch 对象 Mock Patch mock

在测试并行开发(TPD)中,代码开发是第一位的。尽管如此,我们还是要写出开发的测试,并执行它们来验证代码的准确性(而不是直接运行代码或使用控制台)。

在Python中,我们有一个叫做单元测试的过程,里面有mock 和patch 函数。这篇文章将讨论这两个角色的用途和区别。

Mock 和Patch 对象库的用途和区别

在这篇文章中,我们不会把单元测试作为一个整体来处理,而是更多地关注于mock 和patch 函数。

我们使用mock Python包,用mock 对象替换你的被测系统的特定组件,并对它们的使用进行断言。它是Python标准库的一个组成部分,从Python 3.3开始可以作为unittest.mock 。

unittest.mock 类消除了在整个测试套件中对几个存根的需要。在执行了一个特定的动作后,我们可以设置关于我们使用了哪些方法/属性以及我们调用它们的参数的断言。

它让我们指定返回值并选择需要的功能。

MagicDock可以处理Magic 对象,它是Mock 的子类。Mock 和MagicMock 对象在我们使用它们时自发地产生特性和方法,并记录使用信息。

嘲讽是基于action -> assertion (即先让mock 被使用,然后对它收到的调用进行断言)模式,而不是许多嘲讽框架使用的record -> replay 模式。此外,mock 模块提供了一个叫做patch() 的装饰器,它负责在测试的上下文中修补类和模块级别的特性,并提供了一个用于产生唯一实例的哨兵。

示例代码:

from unittest.mock import patch
@patch('sample_module.sample_object')
def test_function(mock_object):
    print(mock_object)

输出:

<MagicMock name='sample_object' id='1870192341512'>

上面的代码片段等同于下面的代码片段:

def test_function():
    with patch('sample_module.sample_module') as mock_object:
        print(mock_object)

该函数允许我们用mock 对象替换任何对象,以避免调用生产代码,并检查原始对象如何被调用(如果该对象是一个函数)。使用patch (或类似的方法)是首选,因为这可以确保补丁在测试后被还原(或在第二种情况下在上下文管理器范围后被还原),这样其他测试或程序就不会受到影响。

结论

我们可以注意到以下几点来帮助我们的决策:

  • 为了方便地用mock 对象(或其他对象)来替代对象,并在完成后恢复之前的状态,或者在出现异常的情况下,使用patch 装饰器/上下文管理器函数。
  • mock.patch 创建mock 或衍生对象,我们可以手工制作。手动构建的只用于修复本地函数或其他不需要重置的模拟。

标签:Python,object,patch,对象,Mock,Patch,mock
From: https://www.cnblogs.com/djdjdj123/p/17673783.html

相关文章

  • Python中查找质因数
    如何在Python中进行素因式分解。质因数分解的概述在数学中,一个数的因数是指那些可以除以给定数并留下零余数的数字。质数是只有两个因数的独特数字,一个和数字本身。这类数字的一些例子是3,7,11,13,等等。素数因数化是指找到所有乘以原数的素数。我们可以考虑一个简单的例子:数......
  • Python中匹配模糊的字符串
    如何使用thefuzz库,它允许我们在python中进行模糊字符串匹配。此外,我们将学习如何使用process模块,该模块允许我们在模糊字符串逻辑的帮助下有效地匹配或提取字符串。使用thefuzz模块来匹配模糊字符串这个库在旧版本中有一个有趣的名字,因为它有一个特定的名字,这个名字被重新命......
  • 在Python中-datetime日期时间对象-日期时间字符串-时间戳之间的转换
    在python编程语言中的datetime模块,常用于对日期时间的处理,包括最常用到的日期时间格式,时间戳的转换,还有日期时间的计算今天笔者,主要讲一下,关于,日期时间对象-日期时间字符串-时间戳之间的转换首先在前面先整理几个知识点(1)、关于三者的转换,日期时间字符串与时间戳数字,是不能......
  • python基础语法之字符串
    字符串扩展1、字符串的三种定义方式单引号,双引号,三引号a='abc';b="sdf";c='''ewrc''';print(a,b,c);2、字符串的拼接#字符串字面量之间的拼接print("我是一名"+"大学生"+","+"学习智能医学工程");#字符串字面量和字符串变量的拼接name='......
  • 如何在CMAKE中指定python路径——使用cmake为python编译扩展模块时指定python路径
     答案:cmake-DPython3_EXECUTABLE=/path/to/bin/python3   =================================================    参考:https://stackoverflow.com/questions/49908989/cmake-cant-find-python3   =================================== ......
  • Python初级学习20230902——字符串
    字符串"""example05-字符串1.转义问题2.字符编码Author:danlisDate:2023/9/2"""a='hello,world'#和a一样的b="hello,world"#一般长字符串,用三个单引号。三个双引号一般作为注释c='''hello,world'''#......
  • Python进制转换以及ASCII码的转换
    获取ASCII码以及根据ASCII码获取内容#获取字符的编码为98#c的ASCII码为99print(ord('c'))#chr()根据编获取对应的值print(chr(99))进制的转换#hex函数十进制转十六进制print(f'99的十六进制{hex(99)}')#oct函数十进制转八进制print(f'99的八进制{oct(99)}')#......
  • Python初级学习20230902——元组
    """example04-初步学习Python1.学习元组tuple2.元组的应用Author:danlisDate:2023/9/2"""#START1学习元组tuple#元组是不可变的容器*#str=(100)#这实际上class'int',所以如果需要构造一元组,必须后面加,str=(100,)str1=(100,)print(type(str1))#重复......
  • python 将xml文件格式化处理
    importosfromlxmlimportetree'''将不规范的xml文件规范化'''path=r"~/path"fordirs,root,filenamesinos.walk(path):forfilenameinfilenames:path_file=os.path.join(path,dirs,filename)ifnotst......
  • Python初级学习20230901
    Python初级学习20230901运算符--->优先级和结合性左结合:从左往右进行计算(大部分运算符)右结合:从右往左进行计算(赋值运算符,正负号,索引和切片)assert断言语句a=1asserta==1#后面可以不加asserta==1,'这里写的是如果出错时的提示语句,AssertionError:内容'容器型数......